想象一下你是一名试图在锁定的、神秘建筑(一段软件)中寻找隐藏陷阱的安全警卫。你看不见建筑蓝图(源代码),因此你必须通过向门和墙壁投掷成千上上的种不同的物体来猜测陷阱可能存在的位置,观察什么东西会损坏。这个过程被称为模糊测试(Fuzzing)。
为了知道是否找到了一个新的测试点,你需要一种方法来追踪你已经访问过的建筑部分。通常,建筑师(编译器)会安装一些小型的传感器(插桩)来记录你的脚步。但由于你没有蓝图,你必须在建筑建成后亲自安装这些传感器。
有两种主要方法:
- “现场”法(动态): 你雇佣了一支工作人员队伍站在建筑内部。他们观察一切并记录下来。这种方法非常准确,但工作人员动作缓慢且会碍手碍脚,使得整个过程变得慢得多。
- “赛前”法(静态): 你在建筑开放前潜入,修改墙壁以包含你的传感器,然后将其锁好。这种方法要快得多,因为传感器本身就是建筑的一部分。然而,这具有风险。如果你对墙壁结构的判断错误,你可能会破坏建筑或完全错过陷阱。
长期以来,人们认为“现场”法是唯一安全的选择,因为“赛前”法被认为过于笨拙且容易出错。
迎来 PeAR:大师级装修工
该论文的作者开发了一个名为 PeAR 的新工具。把 PeAR 想象成一个技术精湛、自动化的装修队,它能够潜入一栋完工的建筑,精确地绘制出墙壁地图,并在不破坏任何东西的前提下安装高科技传感器。
他们想要证明,“赛前”法不再仅仅是一场危险的赌博,它完全可以像“现场”法一样出色,而且速度更快。
为什么 PeAR 特别?
大多数之前的装修队(旧工具)只能安装基础传感器。它们无法处理现代安全警卫用来提高效率的高级技巧。然而,PeAR 构建在一个全新的、可靠的地图绘制系统(称为 GTIRB)之上,这使得它能够实现三个高级技巧:
“无需重置”循环(持久模式):
- 旧方法: 每当你投掷一块石头,装修队都必须把你踢出去,重建门,然后再让你进来。这太慢了。
- PeAR 的方式: Pe AR 安装了一个特殊的走廊,让你可以在不离开建筑的情况下连续投掷 1,000 块石头。你只需在每次投掷之间重置房间即可。这使得过程极其迅速。
“跳过设置”技巧(延迟初始化):
- 旧方法: 一些建筑在你可以开始投掷石头之前,会有漫长而乏味的入口安全检查(加载库、检查配置)。
- PeAR 的方式: PeAR 切开建筑,让你在枯燥的设置完成后直接开始投掷石头。你跳过了每一次排队等待。
“心灵感应式交接”(共享内存模糊测试):
- 旧方法: 你必须把你的石头写在一张纸上,走到邮箱旁,把它放进去,然后建筑必须打开邮箱才能读取。这很慢。
- PeAR 的方式: PeAR 在你的手和建筑的手之间安装了一个直接的管道。你直接通过空气传递石头。没有纸张,没有邮箱,无需等待。
大考
作者使用了一个著名的障碍赛道 FuzzBench(包含 25 个复杂的软件程序)来测试 PeAR 与其他工具的对抗。他们运行测试的时间极长(相当于 4.25 年的持续计算机处理时间)。
以下是他们的发现:
- 可靠性: PeAR 成功修改了 25 个建筑中的 22 个。这与最优秀的其他“赛前”工具表现相当,并证明了你不需要破坏建筑就能安装传感器。
- 速度: 当 PeAR 使用其高级技巧(“无需重置”循环和“心灵感应式交接”)时,它比其基础版本快了 4 倍。它明显比任何其他“赛前”工具都要快。
- 准确性: 尽管速度更快,但 PeAR 并没有错过任何陷阱。它发现的隐藏路径(代码覆盖率)与慢速的“现场”法以及使用蓝图的工具一样多。
核心结论
论文得出结论:使用正确的工具(如 PeAR),“赛前”法(静态二进制插桩)不再是一个危险、缓慢或不准确的选择。你可以快速且准确地修改封闭软件以寻找漏洞,而无需原始蓝图。PeAR 证明了你可以同时拥有装修队的效率和现场观察者的精准度。
技术摘要:PeAR —— 一种用于仅二进制模糊测试的静态二进制重写框架
1. 问题陈述
对于无法获取源代码的闭源软件,仅二进制模糊测试(Binary-only fuzzing)对于发现漏洞至关重要。在这种背景下,模糊测试器依赖于静态二进制插桩(SBI)或动态二进制插桩(DBI)来追踪代码覆盖率。虽然 DBI(如 Intel Pin、QEMU)因其被认为易于实现且具有完备性而被广泛使用,但它会产生显著的运行时开销(通常慢 10–100 倍),从而严重限制了模糊测试器的吞吐量。
相反,SBI 通过在执行前重写二进制文件来提供较低的运行时成本。然而,现有的 SBI 框架在历史上一直难以在准确性和泛用性方面取得平衡。许多框架无法对复杂的真实世界目标进行插桩,并且至关重要的是,它们缺乏对现代性能增强技术的支持,而这些技术在基于编译器或基于 DBI 的模糊测试器中已非常普遍。具体而言,延迟初始化(deferred initialization)、**持久模式(persistent mode)以及共享内存模糊测试(shared-memory fuzzing)**等功能在大多数 SBI 框架中仍未得到支持。这一差距引发了一个问题:是否可以利用近年来的静态二进制重写进展,来构建一个鲁棒、高性能且可扩展的仅二进制模糊测试框架。
2. 方法论
作者开发了 PeAR,这是一个可扩展的仅二进制模糊测试框架,它利用现成的静态二进制重写技术来注入现代模糊测试插桩。
核心架构
PeAR 构建于 GrammaTech 二进制中间表示(GTIRB) 和 Ddisasm 反汇编器之上。其工作流程包括:
- 静态分析: 使用基于 Datalog 实现的 Ddisasm 对目标二进制文件进行反汇编,以解码指令并生成事实超集。通过分析这些事实进行符号化和控制流处理,然后将其转换为 GTIRB 中间表示。
- 插桩: 使用
gtirb-rewriting 框架,PeAR 在将代码降级回原生代码之前,直接在 GTIRB 中注入插桩。
关键插桩功能
不同于主要关注基础覆盖率追踪的以往 SBI 工具,PeAR 实现了一套高级功能:
- 覆盖率追踪: PeAR 在基本块的起始处插入跳转点(trampolines)以追踪边缘覆盖率,模拟了 AFL++ 中使用的
__afl_maybe_log 逻辑。它能够处理由 call 指令终止的中间过程控制流图(CFG)。
- 延迟初始化: 框架允许用户指定模糊测试器 forkserver 进行初始化的函数或地址。这使得每次测试用例都可以跳过复杂的特定目标初始化例程,从而降低开销。
- 持久模式: PeAr 不再为每个输入启动一个新进程,而是将目标函数封装在一个循环中。插桩过程会保存并恢复寄存器状态和返回地址,从而允许单个进程执行多个输入。
- 共享内存模糊测试: 为了避免文件系统 I/O 带来的惩罚,PeAR 实现了一个钩子(hook),将目标的输入缓冲区指针直接重定向到包含测试用例的共享内存区域。这是通过保存目标寄存器状态,通过钩子函数修改相关寄存器(例如用于缓冲区指针的
rdi),并在执行前恢复状态来实现的。
3. 核心贡献
本文的贡献如下:
- PeAR 框架: 一个基于 SBI 的模糊测试框架,能够跨广泛的目标注入现代模糊测试插桩(延迟初始化、持久模式、共享内存)。
- 全面评估: 对 PeAR 以及其他四种最先进的 SBI 框架(ZAFL、StochFuzz、afl-dyninst、E9AFL)在 FuzzBench 基准测试集上进行了严格评估。评估过程累计耗时 4.25 个 CPU 年。
- 证明了 SBI 的可行性: 本研究挑战了“SBI 本质上不准确或无法支持高级功能”的普遍假设,表明现代重写框架可以实现高粒度且几乎不牺牲性能的效果。
4. 实验结果
评估在 25 个 FuzzBench 目标(其中 20 个用于覆盖率/性能分析)上进行。
鲁棒性
- 插桩成功率: PeAR 成功插桩了 25 个目标中的 22 个 (88%),这一成功率与表现最好的 SBI 模糊测试器相当(ZAFL 为 23/25,StochFuzz 为 22/25)。
- 失败模式: 失败主要归因于构建/重写问题或错误的插桩导致在良性输入上发生崩溃。PeAR 在两个目标(
curl、libjpeg-turbo)上需要手动提示,因为 Ddisasm 误识别了数据表或常量。
代码覆盖率
- PeAR 在所有 SBI 模糊测试器中实现了最高的平均归一化覆盖率得分 (87.91%)。
- 该性能与 AFL++ QEMU 模式(87.84%,一种 DBI 基准)相当,并显著优于其他 SBI 工具,如 E9AFL (6.62%) 和 afl-dyninst (57.79%)。
- 启用持久模式和共享内存后,PeAR 的覆盖率略微提升至 89.95%,这证明了更高的吞吐量有助于更好的状态空间探索。
吞吐量与性能
- 吞吐量增益: 消融研究显示,启用持久模式使 PeAR 的吞吐量中值提高了 2.56×。添加共享内存模糊测试后,吞吐量进一步提升至基础配置的 4.07×。
- 基准差异: 具有昂贵初始化过程的目标(如
curl)收益巨大(使用共享内存时高达 31.23×),而轻量级目标提升较小。
- 对比: 带有高级功能的 PeAR 在所有仅二进制模糊测试器中始终保持最高的吞效比,通常比次快的 SBI 模糊测试器高出中值 3.56×。
5. 重要性与主张
作者声称,PeAR 证明了 SBI 是仅二进制模糊测试中一种切实可行且有效的技术。论文认为,在使用像 GTIRB 这样现代、现成的重写框架时,历史上对 SBI 准确性和完备性的担忧是不必要的。
具体而言,论文主张:
- 可扩展性: 现代二进制重写框架可以以高粒度应用复杂的插桩(如持久化循环和共享内存钩子)。
- 性能对等: SBI 可以实现与编译器插桩和 DBI 解决方案(QEMU 模式)相当的代码覆盖率,同时提供比 DBI 显著更好的吞吐量。
- 功能对等: 在 SBI 环境中实现高级模糊测试技术(延迟初始化、持久模式、共享内存)是可能的,而这在以前是 SBI 生态系统中缺失的能力。
论文总结道,尽管挑战依然存在(例如处理不支持的指令或复杂的数据表),但结合强大的静态分析和现代重写工具,使得 SBI 成为针对闭源软件进行高性能模糊测试的可行替代方案。未来的工作包括扩展对 Windows PE 二进制文件及其他架构的支持。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。