《Fuzzing的艺术-麦香.pdf》由会员分享,可在线阅读,更多相关《Fuzzing的艺术-麦香.pdf(30页珍藏版)》请在三个皮匠报告上搜索。
1、Fuzzing的艺术如何一天发现数百个漏洞Ne0(陈永恒):佐治亚理工学院在读博士,方向:系统/软件安全学术研究发表在S&P,Usenix Security,CCS,AsiaCCS,Google新一代fuzzing框架fuzztest的主要设计者和开发者之一zr33(钟锐):Palo Alto Networks Inc高级安全研究员,博士毕业于宾夕法尼亚州立大学多篇学术研究发表在S&P,Usenix Security,CCS,曾作为主要贡献者参与Pwn2Own等漏洞比赛麦香:抖音电商安全专家r3kapig核心成员,前ctfer,主要研究方向覆盖Web、区块链、IoT等。About US编译器/
2、解释器应用广泛1.网络浏览器2.数据库管理系统3.插件或扩展式软件4.办公软件或文档编辑器5.操作系统,虚拟机6.配置文件编排系统7.编译器/解释器攻击面-浏览器来源:zdi攻击面-数据库来源:github攻击面-插件来源:zjuns blog攻击面-优化错误产生不正确的逻辑来源:github什么是Fuzzing(模糊测试)自动化软件安全测试生成畸形样本进行测试对崩溃等异常情况进行监控系统稳健性测试生成样本进行高频运行对系统性能变化进行监控漏洞样本变异程序执行程序崩溃?种子否是新的反馈?是否基于变异的Fuzzing优点:利用反馈指导生成越来越好的样本缺点:破坏样本的结构性优点:生成符合特定结构
3、的样本缺点:缺少反馈,盲目生成基于生成的Fuzzing生成规则:(a|b)+1.aabb2.abb3.aaaa漏洞样本生成程序执行奔溃?否是Fuzz语言处理器的难点1.数量多,每种语言有自己的语法/语义2.对语法和语义都有比较高的要求目前主流方法及其优缺点通用型通用型(AFL,libfuzzer)通用性高,无需过多人工配置 样本语法,语义正确率低,无法有效进行深入测试特定型特定型(Fuzzilli,Squirrel)样本语义正确性高,深度测试 工程量大,对语言理解要求高PolyGlot:通用+高效前端:通用性把特定的语言样本转化成统一的表示形式(IR)后端:高效性使用通用的静态语义模型指导样本
4、变异用户输入:BNF+语义注释PolyGlot:前端IR语言生成分析用户提供的BNF语法和语义注释,自动生成相应的IR语言翻译器BNF+语义注释PolyGlot前端IR语言翻译器高级语言样本IR语言翻译器IR语言样本目标高级语言样本-IR语言样本转换将用户提供的高级语言样本转化为对应的IR语言样本语法变异语法变异:基于语法单元替换基于语法单元替换1:int a=1;2:if(a!=0)3:4:int d=123;5:return a+d;6:1:int a=1;2:if(a!=0)3:4:int k=w+123;5:return x+y;6:PolyGlot:后端语义修复语义修复:基于类型和作
5、用域的变量修复基于类型和作用域的变量修复1:int a=1;2:if(a!=0)3:4:int k=w+123;5:return x+y;6:语义错误:w,x,y 需要修复PolyGlot:后端语义修复语义修复:基于类型和作用域的变量修复基于类型和作用域的变量修复1:int a=1;2:if(a!=0)3:4:int k=FIXME+123;5:return FIXME+FIXME;6:语义错误:w,x,y 需要修复PolyGlot:后端语义修复语义修复:基于类型和作用域的变量修复基于类型和作用域的变量修复1.建立变量表建立变量表1:int a=1;2:if(a!=0)3:4:int k=FI
6、XME+123;5:return FIXME+FIXME;6:名字类型作用域aint2-6kint5-6变量表PolyGlot:后端语义修复语义修复:基于类型和作用域的变量修复基于类型和作用域的变量修复 2.生成表达式生成表达式1:int a=1;2:if(a!=0)3:4:int k=a+123;5:return FIXME+FIXME;6:名字类型作用域aint2-6kint5-6变量表PolyGlot:后端语义修复语义修复:基于类型和作用域的变量修复基于类型和作用域的变量修复 2.生成表达式生成表达式1:int a=1;2:if(a!=0)3:4:int k=a+123;5:return
7、 k+k*a;6:名字类型作用域aint2-6kint5-6变量表PolyGlot:后端PolyGlot:实现基于AFLplusplus custom mutatora.支持aflplusplus现有的各种功能与算法b.支持并行fuzzing模式支持antlr语法描述文件a.支持500+预定义语法b.可自定义语法描述支持语义种类a.作用域b.普通变量/结构体/函数定义c.类型转化10分钟从入门到出洞 1.确定需要测试的语言,收集语法文件和种子文件 a.语法文件:https:/ 3.编译并插装目标可执行文件a.下载目标repob.使用PolyGlot目录下提供的AFLplusplus/clang
8、-fast(也可使用其他编译代理)对目标源码进行编译10分钟从入门到出洞 4.使用PolyGlot自带的utils检查种子文件的完整性a.是否有样本不符合当前的语法b.当前语法的所有规则是否被样本覆盖c.优化种子文件直到没有错误10分钟从入门到出洞 5.创建配置文件,a.定义种子文件的路径(必选)b.是否为弱类型语言,是否开启语义修复等(可选)10分钟从入门到出洞 6.设置AFL的环境变量,运行afl-fuzz。a.afl-fuzz的corpus(-i)可以和种子文件集相同也可以不同10分钟从入门到出洞 7.收割10分钟从入门到出洞 总结1.PolyGlot让语言处理器fuzzing变得通用和高效a.一个小时不到就可以写出一个高效的语言fuzzer2.还有很多语言处理器没有被测试过a.我们只测了9种语言,20+处理器,全部出crash3.代码开源在https:/ THANKS