使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第一部分
American fuzzy lop 是一款面向安全的模糊测试器,它采用一种新型的编译时插桩和遗传算法,可以自动发现干净、有趣的测试用例,从而触发目标二进制文件中新的内部状态。这显著提高了模糊测试代码的功能覆盖率。
AFL 的地址是https://lcamt uf.coredump.cx/afl/ 。它已经有一段时间没有更新了。虽然 AFL 仍然运行良好,但有一个新项目 AFL++,它是 AFL 的一个分支,包含许多改进和新功能。AFL++ 的地址是https://aflplus.plus/,其源代码位于GitHub。在本文中,我们将研究如何使用 AFL++ 对 IoT 二进制文件进行模糊测试。
当我们拥有目标二进制文件的源代码时,模糊测试效果最佳。但不幸的是,对于物联网二进制文件来说,情况往往并非如此。AFL++(和 AFL)附带一个配套工具(afl-gcc、afl-clang 等),可以作为 gcc、clang 或任何其他标准构建工具的直接替代品。该工具用于在编译源代码时向生成的二进制文件中注入检测工具。然后可以使用 afl-fuzz 对已检测的二进制文件进行模糊测试。
对闭源应用程序进行模糊测试非常棘手。为了对此类二进制文件进行模糊测试,AFL++ 可以使用 Qemu、Unicorn 或 Frida,并分别命名为 qemu 模式、Unicorn 模式和 Frida 模式。这些是仅适用于二进制文件的插桩模式,效率不如源代码插桩模式。在本文中,我们将使用 Qemu 模式。
在 Qemu 模式下,AFL++ 使用 qemu 用户模式仿真来运行二进制文件。它使用 Qemu 的修改版本,该版本会在程序执行时对基本块进行插桩。由此生成的插桩信息用于生成新的测试用例,这些测试用例会触发不同的代码路径,从而提高代码覆盖率。qemu 模式下的 AFL++ 还可以用于插桩外部架构的二进制文件(例如 x86_64 主机上的 arm 二进制文件)。这对于模糊测试通常采用 ARM 或 MIPS 架构的物联网固件二进制文件非常有用。
需要注意的是,AFL++ 和类似的模糊测试器(AFL、hongfuzz、radamsa [仅测试用例生成器])仅适用于文件输入。也就