FunFuzz: An LLM-Powered Evolutionary Fuzzing Framework
FunFuzz 是一个多岛进化模糊测试框架,它利用大语言模型结合自适应、反馈引导的提示词以及周期性的候选迁移,以克服提示敏感性和采样方差问题,从而在编译器覆盖率上实现更优表现,并发现比以往基于大语言模型的方法更多的独特故障触发输入。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下,你正在一个巨大而复杂的迷宫中寻找隐藏的陷阱。这个迷宫就是一个编译器——它将人类编写的代码翻译成计算机能够实际执行的指令。如果编译器存在漏洞,它可能会崩溃或给出错误答案,从而导致建立在其之上的所有事物遭到破坏。
几十年来,专家们一直使用“模糊测试器”(fuzzers)来寻找这些漏洞。你可以把模糊测试器想象成一个机器人,它会向迷宫投掷数百万个随机测试用例,看看是否有任何地方会崩溃。但现代编译器如此复杂,随机投掷往往无法触及那些深藏且棘手的角落。
最近,人们开始使用**人工智能(大型语言模型)**来编写这些测试用例。人工智能很聪明,能够写出看起来非常逼真的代码。然而,论文指出,以这种方式使用人工智能存在一个问题:**它会陷入死胡同。**如果你让人工智能编写代码,它可能会反复生成同五种类型的句子,只是用词不同。它停止探索迷宫的新区域。
FunFuzz 登场了。
作者们创建了一个名为FunFuzz的新系统来解决这个问题。以下是其工作原理,使用一个简单的类比:
1. “多岛”策略
想象你有一支寻宝团队正在寻找一座失落的城市。
- 旧方法(单一人工智能): 你派出一名猎人。他开始行走,找到一条路,并一直跟随它。最终,他会感到厌倦或陷入循环,从而停止发现新事物。
- FunFuzz 方法: 你派出五个独立的团队(称为“岛屿”)。每个团队从丛林中完全不同的区域出发,拥有不同的地图和不同的目标。
- 团队 A 被指示寻找“古代遗迹”。
- 团队 B 被指示寻找“隐藏洞穴”。
- 团队 C 被指示寻找“河流渡口”。
由于他们从不同的指令出发,他们不会都走同一条路。他们同时探索迷宫的不同部分。
2. “迁移”系统
每隔几个小时,团队会在篝火旁聚会。
- 如果团队 A 发现了一件非常酷、非常稀有的宝物(一个导致编译器崩溃或做出奇怪行为的程序),他们不会将其据为己有。他们会将副本分享给团队 B 和团队 C。
- 关键在于: 他们不会把团队 B 赶出营地。他们只是将新宝物添加到团队 B 的收藏中。这样,团队 B 可以利用这个新想法挖掘得更深,而不会失去他们已经取得的进展。
这既防止了整个群体陷入相同的循环,又让最出色的发现得以传播。
3. “适应度评分”(他们如何知道什么是好的)
人工智能如何知道哪个测试用例更好?
- 系统会编译人工智能编写的代码。
- 它计算该测试用例触动了多少编译器自身内部代码的新行。
- 如果一个测试用例让编译器看到了它以前从未见过的部分,该测试就会获得高分。
- 系统会选择得分最高的测试用例来“繁殖”下一代测试用例,从而不断细化搜索。
他们发现了什么?
研究人员在两个主要编译器GCC和Clang上,将 FunFuzz 与其他顶级工具进行了对比测试(例如Fuzz4All,它使用人工智能但只有一个团队;以及Kitten,它投掷数百万个随机变异)。
- 更好的覆盖率: FunFuzz 在编译器内部发现的“新领域”比其他工具更多。它探索得更深、更广。
- 更多漏洞: 在 24 小时的测试中,FunFuzz 发现了119 个独特的漏洞,这些漏洞导致编译器崩溃或内部失效。
- 现实世界的影响: 开发人员确认了其中80 个漏洞。
- 效率: 尽管 FunFuzz 生成的程序总数并没有比最快的工具多,但它生成的程序质量要高得多。它每小时发现的漏洞更多。
结论
FunFuzz 就像一场聪明的寻宝活动,它使用一支探险队而不是单个跑步者。通过让团队保持独立,同时允许他们分享各自的最好发现,它避免了陷入无聊的循环,并深入挖掘现代编译器复杂的内部机制,从而发现了其他方法会遗漏的漏洞。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。