1.honggfuzz漏洞挖掘技术深究系列(1)——反馈驱动
2.LibFuzzer workshop学习之路(final)
3.模糊测试工具 AFL的原理与实践
honggfuzz漏洞挖掘技术深究系列(1)——反馈驱动
honggfuzz漏洞挖掘技术详解(1)——反馈驱动
反馈驱动是漏洞挖掘技术中的关键策略,它通过追踪样本触发的代码覆盖率,优化输入样本以提升覆盖率,从而增加发现漏洞的可能性。在业界,AFL、传奇单机版源码libfuzzer和honggfuzz是基于代码覆盖率的三大著名Fuzzer,它们均开源,可在GitHub上获取。
honggfuzz尤其受到关注,其原理与应用将是我们系列探讨的重点。我曾深入研究过honggfuzz的源码并进行二次开发,实践证明其挖掘漏洞的效果显著。系列将详细解析honggfuzz的运作机制,从代码覆盖率的三种衡量标准——函数、基本块和边界,到实际应用中的反馈驱动原理。
在honggfuzz中,塘源码头坐船基本块覆盖率是主要的统计方式。通过编译选项,如添加`-fsanitize-coverage=bb`,可以生成`sancov.map`和`sancov.raw`文件,记录执行过的基本块信息。honggfuzz会分析这些文件,计算覆盖率,根据新路径或链接库加载情况,生成变异样本以触发更多未探索的路径。
honggfuzz诞生于年,与AFL同时期发布,AFL的出现极大地推动了安全领域的发展。尽管AFL源码分析众多,honggfuzz的深度剖析却相对较少,因此我决定编写这一系列文章。个人曾为honggfuzz贡献代码,但未被采纳,最新源码获取于是转向自行开发,为不同平台添加新功能,并借此发现了不少CVE。
后续文章将深入探讨honggfuzz的更多细节,感谢robertswiecki创建出这款强大的工具。这些内容源自公众号:漏洞战争。
LibFuzzer workshop学习之路(final)
libfuzzer workshop是一次深入的fuzzing学习之旅,本文精选最后两个案例 - 针对re2和pcre2的fuzz,深入探讨了链接库选择、插桩编译参数设置及max_len对结果的影响。
以pcre2为例,作为Perl兼容的正则表达式库,其在许多开源软件中被广泛使用。进行源码编译时,需注意通过特定插桩参数优化编译效率。设置如fuzzer-no-link参数来确保不链接主符号,尤其在处理大型项目时,in7源码能显著提升fuzz效率。
编译过程中,根据pcre2的特性添加了如--with-match-limit和--with-match-limit-recursion限制匹配操作的资源使用和递归深度,以及--enable-never-backslash-C禁用特定正则模式,优化匹配过程。之后,分析提供的harness实现逻辑,结合参数优化执行,很快得到了crash现象。研究崩溃发生的具体位置,定位漏洞所在函数,并一步步追溯其调用链,对整个过程的细节进行了详尽的剖析。
针对re2库的fuzzing,展示了max_len选择对fuzz过程的重要性。不同长度设置下的探测效果差异显著,max_len值决定样本长度范围,源码交流学习从而影响寻找覆盖点的速度。通过对比不同max_len的探测结果,可以清晰地看到其对fuzz效率的影响,合理选择max_len值可以显著提升发现crash的概率。
学习总结指出,在libfuzzer workshop中,libfuzzer作为强大而常用的fuzz工具,其对开源库接口函数的fuzz能力突出。然而,设计合适的harness是挑战,需要深入了解要fuzz的开源库接口,通过逐步优化来接近发现crash的目标。
本文展示了libfuzzer workshop的关键点,从源码准备、参数优化到harness的构造和性能调优,再到深入分析crash定位和漏洞修复策略,全面展示了学习libfuzzer的深度与广度。
模糊测试工具 AFL的原理与实践
在软件开发领域,确保质量和安全是关键。模糊测试作为高效自动化测试策略,专门用于检测程序中的错误和安全漏洞。本文旨在详细介绍AFL(American Fuzzy Lop)的基本原理和实践方法。
模糊测试原理介绍
AFL是一种通过输入异常或随机数据来自动化发现程序错误的测试方法。它利用遗传算法不断生成测试用例,并通过动态插桩技术监控程序行为,尤其关注代码覆盖情况。当新输入引发新代码路径时,该输入会被保存以进一步测试。这一循环不断优化测试用例,探索更多程序状态。
AFL流程图展示了从准备测试用例到监控程序行为的核心步骤,突出其动态性和迭代性。
AFL采用fork运行模式,这使得程序崩溃时,测试进程不会终止,相较于LibFuzzer更具有优势。然而,频繁的fork操作也意味着效率不如LibFuzzer。
AFL安装与运行
AFL主要针对UNIX-like系统,尤其在Linux上表现最佳。Windows用户可通过winafl进行模糊测试,支持多种CPU架构,其中对x和x架构支持最好。若需ARM架构支持,则需使用QEMU模式。
安装步骤包括源码编译,使用afl-fuzz命令启动测试,命令格式如下:
命令中的/path/to/program替换为目标程序路径,[options]为程序运行选项或参数。若测试程序需从文件读取输入,可使用@@占位符。AFL将根据测试需求替换此占位符。
AFL使用示例
下面是一个简单示例,演示如何使用AFL进行模糊测试。目标程序实现四则运算,使用不安全的gets函数可能导致缓冲区溢出。
首先,对源码进行AFL编译,添加代码覆盖插桩。接着,准备初始语料库作为测试起点,无论输入是文件还是stdin,AFL都需要初始数据。在运行AFL前设置系统核心转储文件命名规则,便于检测程序崩溃情况。运行测试时,根据程序输入来源选择是否使用@@占位符。
运行后,AFL界面显示测试结果,包括找到的崩溃和覆盖率信息。结果通过pythia工具分析。输出目录结构清晰,便于后续分析。
AFL的QEMU模式
对于已编译的二进制文件,AFL可通过QEMU模式进行模糊测试,无需源码。QEMU模式使用用户模式仿真运行二进制文件,支持对闭源应用的模糊测试。
QEMU模式安装与使用步骤包括编译QEMU支持和执行AFL-fuzz命令时添加-Q参数。
AFL++升级版
AFL++作为AFL的增强版,改进了调度策略和变异算法,新增CMPLOG和持久化等特性,提高代码覆盖率和测试效率。
CMPLOG功能记录比较操作参数,帮助理解输入逻辑,提高路径覆盖。持久化模式允许程序在单个进程周期内多次执行测试用例,减少启动成本,加快测试速度。
总结
AFL是一款功能强大的模糊测试工具,适用于多种架构和系统环境。尽管存在覆盖率瓶颈,但结合其他技术如符号执行,可有效突破限制,提升测试能力。