20199128 2019-2020-2 《网络攻防实践》综合实践
20199128 2019-2020-2 《网络攻防实践》综合实践
所选论文为USENIX Security 2019的《FUZZIFICATION: Anti-Fuzzing Techniques》,作者是Jinho Jung, Hong Hu, David Solodukhin, Daniel Pagan, Kyu Hyung Lee?, Taesoo Kim。
1.背景
Fuzzing是一种现在很流行的软件测试技术,可以在不知道程序内部的情况下自动且快速的探索程序的输入空间。现今存在许多有关模糊测试工具的研究,在实践中也发现了大量的安全漏洞,但它的自动等特质也同样吸引来恶意攻击者,用以发现零日漏洞。近来攻击者对模糊工具的使用比例不断提升。为了应对这种威胁,几位作者提出了一种名为FUZZIFICATION的缓解方法,希望可以帮助开发者保护已发布的二进制软件。
2.目标
- 有效地阻止现有的模糊测试工具,在固定时间内发现更少的错误;
- 受保护的程序在正常使用下仍应有效运行;
- 不能简单的识别保护代码或从保护的二进制文件中删除保护代码。
3.威胁模型
攻击者通过最新的模糊技术发现软件漏洞,但只具有有限的资源(如计算能力)。攻击者可获得受FUZZIFICATION保护的二进制文件,且攻击者了解FUZZIFICATION技术。他们可以使用现有的二进制分析技术从受保护的二进制文件中消除FUZZIFICATION。
4.FUZZIFICATION工作流程
开发人员将代码编译为两个版本,即常规方式生成的二进制文件和使用FUZZIFICATION技术进行编译生成的受保护二进制文件。受保护的二进制文件将分发给公众(包括普通用户和恶意攻击者),攻击者可以对其进行模糊处理查找错误,但在FUZZIFICATION的保护下,他们无法迅速找到大量错误。同时,常规版本会分发给受信方,受信方以正常速度启动常规二进制文件的模糊测试,可以预见,从受信任方收到错误报告的开发人员可以在攻击者滥用该错误前对其进行修复。
5.SpeedBump
- 冷路径:模糊执行通常会进入诸如错误处理之类的路径,这些路径通常不会被正常执行。论文中称这种路径为冷路径。冷路径注入延迟会大大减慢fuzz的执行速度,但对常规执行不会产生太大影响。
- 基本块频率分析:FUZZIFICATION生成一个基本的块频率曲线来识别冷路径
- 检测目标程序,在执行过程中对访问的基本块进行计数,生成用于分析的二进制文件。
- 使用用户提供的测试用例,运行二进制文件收集每个输入访问的基本块。
- FUZZIFICATION 分析收集的信息以识别很少执行或从未执行的基本块。这些块在延迟注入中被视为冷路径。
- SpeedBump选项
- MAX_OVERHEAD:间接费用预算
- DELAY_LENGTH:延迟范围
- INCLUDE_INCORRECT:是否向错误处理基本块注入延迟
- INCLUDE_NON_EXEC和NON_EXEC_RATIO:是否向测试执行期间从未执行过多少个基本块注入延迟。
- 抗分析延迟原语:原语的生成基于CSmith,作者将原始代码中的变量传递给生成的代码作为参数,从生成的代码对原始代码进行引用,然后使用返回值修改原始代码的全局变量。通过在原始代码和注入的代码之间引入了数据流依赖性,在不影响原始程序的情况下更改了程序状态。
- 抗分析延迟原语安全性:依靠CSmith和FUZZIFICATION的安全检查。CSmith自带了一套包括整数,类型,指针,效果,数组,初始化和全局变量的测试,而FUZZIFICATION通过固定参数多次运行,执行出现错误则丢弃,最后将生成原语嵌入相同的固定参数避免错误。
6.branchTrap
- 思路:通过诱导或阻止覆盖反馈来欺骗基于覆盖率的fuzzer
6.1.第一种方法
- 思路:构造了大量的条件分支和间接跳转并注入到原始程序中。是否采用这些伪造的条件分支依赖于某些输入字节。而间接跳转则是根据用户的输入来计算目标的,用户的输入即便只有细微差异,程序也会采取不同的路径。当fuzz在执行过程中触发了伪造分支,fuzzer将会提高更改输入的优先级,从而检测到更多的伪路径,继续浪费攻击者的资源。
- 诱导性设计:
- 制造足够数量的伪造路径来影响模糊测试策略。伪造路径应提供不同的覆盖范围,并直接受到输入的影响
- 注入的新路径为正常执行带来较小的开销
- 相同的输入应该经过相同的路径
- 不易被识别和删除
- 流程:
- 计算所有自变量的 XORed 值。BranchTrap 使用此值索引跳转表
- BranchTrap 使用此值作为索引来访问跳转表并获得结尾的具体地址。为了避免越界访问数组,BranchTrap 将 XORed 值除以跳转表的长度,然后将其余部分作为索引
- 确定目标跳转地址后,控制流将转移到小工具
- 最后,执行返回到原始返回地址
- 优点:有效、开销小、健壮
6.2.第二种方法
- 思路:第二种方法向很少访问基本块引入大量确定性分支,fuzz时迅速填满覆盖表,在接下来的执行时发现的大多数新路径都会被视为已访问,进而丢弃实际有价值探索的路径输入。
- 面对CollAFL这类具有防撞功能的fuzzer的优势:一方面是这种缓解覆盖范围冲突的防撞技术通常要求程序源代码在链接时间优化过程中分配唯一标识符。而在FUZZIFICATION的威胁模型中,攻击者无法获得原始二进制文件,这会给ID分配算法带来很大挑战。另一方面,类似的fuzzer出于存储开销的考量,需要采用固定大小的覆盖范围存储,FUZZIFICATION可以使大部分存储饱和,模糊测试性能将受到显著影响。
- BranchTrap选项:基于ROP的BranchTrap生成的伪造路径数量和使覆盖范围饱和的注入分支大小是可以灵活调整的。
7.AntiHybrid
- 混合模糊测试:混合模糊测试方法利用符号执行和动态污点分析(DTA)提高模糊测试效率的方法符号执行擅长解决复杂的分支条件,DTA有助于查找分支条件相关的输入字节。
- 混合模糊测试的弱点
- 符号执行和污点分析都非常消耗资源,从而限制了它们分析简单程序的能力。
- 符号执行很难处理路径爆炸问题,如果处理符号需要复杂的操作,则符号执行引擎必须详尽地探索和评估所有执行状态。 然后,大多数符号执行引擎都无法运行到执行路径的末尾。
- DTA分析很难跟踪隐蔽通道、控制通道等隐式数据依赖
- 隐式数据流依赖:用于抵抗使用污点分析的混合模糊器。确定分支条件和有趣信息接收器,然后根据变量类型注入数据流转换代码。隐式数据流阻碍了跟踪直接数据传播的数据流分析。
- 路径爆炸约束:用于抵抗使用符号执行的混合模糊器。通过比较原始比较操作数的哈希值来替换每个比较指令。若使用轻量级的循环冗余校验(CRC)循环迭代来转换分支条件可以减少性能开销。
8.评估
实验对象:LAVA-M 数据集和九个实际应用程序作为模糊测试目标。
评估指标:发现实际路径的代码覆盖率和引起的唯一崩溃
用FUZZIFICATION的三种技术对libjpeg,libpng,libtiff,pcre2,readelf,objdump,nm,objcopy 和 MuPDF 9 个应用程序进行处理(VUzzer 除外)以衡量模糊化对查找代码路径的影响,评估指标为代码覆盖率。
用FUZZIFICATION的三种技术来保护四个binutils 程序和AFL,HonggFuzz,VUzzer 和 QSym这四个fuzzer来模糊 LAVA-M 程序,以评估模糊化对发现唯一崩溃的影响。
对普通模糊测试(使用代码覆盖率评估)
- FUZZIFICATION 可以将发现的真实路径减少到 AFL 的 76%
- SpeedBump 可以抵抗普通模糊测试的效果最佳
- FUZZIFICATION在保护 libjpeg 应用程序方面效果不佳
对使用符号执行的混合模糊测试工具(如QSym)(使用代码覆盖率评估)
- FUZZIFICATION 可以平均将路径覆盖率降低到QSym 的 80%
- AntiHybrid对Hybrid Fuzzers的效果最佳
对目标程序(使用唯一崩溃评估)
FUZZIFICATION 将发现的崩溃数量减少了 93%,特别是 AFL 减少了 88%,HonggFuzz 减少了98%,QSym 减少了 94%。对LAVA-M数据集(使用唯一崩溃评估)
FUZZIFICATION可以减少VUzzer 发现的错误的 56%和 QSym 减少的发现的 78%。
9.局限与改进
- 补充攻击缓解系统
- 尽力防御对抗性分析
- 权衡性能与安全性
- 不同的硬件环境上延迟原语
10.复现过程
- 安装:
- 安装llvm和clang
- 安装AFL
- 生成延迟原语
- 模糊化配置
- 修改原始代码
- 编译执行
- 问题一:编译llvm过程中缺少plugin-api.h
- 问题一解决:自行安装。使用apt-file查找依赖,不过查询结果非常多,我也不清楚需求的是哪一个,最终下载的是gcc-9-plugin-dev。
- 问题二:编译安装AFL时,有关C++标准头文件全部找不到
- 问题二解决:在/usr/include下的C++文件夹有相关的标准头文件
11.课程总结
首先在这门课中学到了不少的实用技能,这是毫无疑问的。我的主要感受有两点,一是分值分割非常碎片,此点是优是劣尚不明朗,但感觉不宜在此基础上再分割了。二是,本课程学生学到了很多东西,但也占据了我半数以上的学习时间,个人感觉博客实践和课后作业的内容重复部分可以在好好规划一下。