概要
PTfuzzer是一款开源的fuzz工具,它基于AFL实现,并利用Intel 处理器提供的Processor Trace硬件部件来跟踪反馈来指导模糊测试,能够快速、准确地记录程序的基本块转换信息,从而实现更高的代码覆盖率和更深入的漏洞挖掘。与之前的灰盒模糊测试技术相比(主要是AFL-qemu),PTfuzz具有更快的反馈机制、更准确的覆盖反馈和更好的二进制支持能力。
PTFuzz的原理
Intel Processor trace(PT)
Intel Processor trace是Intel CPU架构中的追踪技术,从第五代Intel CPU开始提供该技术的支持,主要用于软件调试和分析。它提供了更精确的软件控制流和时间信息的能力,对软件执行的性能影响很小。
Intel PT是一种基于硬件的功能,用于记录处理器上的软件执行信息。它可以用于跟踪程序的执行并识别性能瓶颈或其他问题。Intel PT记录有关处理器执行的指令信息,包括每个指令的地址以及它是否被执行。这些信息可用于重构程序的控制流并识别性能问题。
通过PT改进而来的PTfuzz
PTfuzz利用Intel PT追踪反馈来生成测试用例和指导模糊测试的执行路径。具体来说,PTfuzz使用Intel Processor Trace技术来记录程序执行的基本块转换,并提供准确的覆盖反馈信息。在模糊测试过程中,PTfuzz会根据覆盖反馈信息来选择哪些测试用例需要进一步变异,以便更好地探索程序的执行路径。通过这种方式,PTfuzz能够更准确地测量代码覆盖率,发现更多的漏洞和漏洞深度更深的路径。
PTfuzz在执行测试用例后,通过Processor Trace基础设施提供的信息来决定是否保存或丢弃该用例。如果该用例触发了新的基本块转换,主要的模糊测试循环将保存该用例并将其放入种子队列中进行连续的模糊测试。如果没有检测到新的转换,则该测试用例将被丢弃。保存的测试用例将用于后续的模糊测试,以生成更多的测试用例。
PTfuzz的特点与局限性
特点
关于PTfuzz的特点,作者本人有提到,我直接引用作者本人对此的描述
PTFuzzer最大的特点是不需要目标程序有源码,这在很多方法是非常有用的。首先,对于很多闭源程序的测试很有优势。例如,某公司对外公布了一个二进制程序的发行版。这时拿不到程序的源代码用AFL就无法测试,而用PTFuzzer就可以。另外,即便是对于一些有源码的程序,可能由于其编译环境极为复杂,用AFL来进行编译插桩变得非常繁琐和耗时,有时也会出现不成功的情况。还有一种情况是对于那些非C语言编写的二进制程序,AFL就无能为力了。例如自己在测试pandoc程序时,发现pandoc是用Haskell语言编写的。这时用AFL就无法进行编译插桩,而使用PTFuzzer进行测试,只需要简单通过apt-get安装一个pandoc可执行程序就OK了。
简言之,PTFuzz的特点包括快速反馈机制、准确的覆盖反馈和能够处理二进制文件的模糊测试。它利用CPU直接提供的快速硬件反馈机制,比QAFL等以前的工作具有更小的性能开销。它使用实际运行时地址来跟踪基本块之间的转换,提供真实的运行代码的控制流信息。
局限性
PTfuzz存在以下局限性或不足:
- 硬件和操作系统要求:PTfuzz只能在Intel Core处理器(Broadwell架构)及以上版本的计算机上运行,并且需要运行新版本的内核。这可能会限制PTfuzz的使用范围。
- 解码器的实现:PTfuzz在模糊测试任务中比AFL慢。通过分析PTfuzz的代码,发现记录的处理器跟踪信息的解码器可以通过执行类似于管道的解码来大大加速。
- 仅限于Linux平台:目前,PTfuzz只能模糊测试Linux程序,因为PT实现依赖于Linux系统。