头图

图片

近日,“AI+Security” 系列线下活动第 4 期在北京顺利举行。本次活动聚焦 “洞” 见未来:AI 驱动的漏洞挖掘新范式,吸引了大批安全领域的资深专家前来参与。活动中,云起无垠引擎负责人李唯带来了精彩分享,主题为 “模糊测试技术与 AI 的前沿探索”。他着重阐述了大模型在固件模糊测试以及代码模糊测试中的深度融入,深入剖析这种融合给模糊测试技术本身带来的革新转变,以及如何进一步推动漏洞挖掘工作迈向新高度,为在场听众提供了全新的技术视野与实践思路。

在当今数字化时代,网络安全的重要性日益凸显,而漏洞挖掘作为保障网络安全的关键环节,一直备受关注。模糊测试技术(Fuzzing)长期以来在漏洞挖掘领域发挥着重要作用,它凭借出色的检测能力,能够在众多安全漏洞的发现工作中发挥关键作用。

云起无垠引擎负责人李唯称,模糊测试技术是自动化漏洞挖掘技术,虽使用门槛高,但效果显著。近年来,大模型与 AI 技术深度融合给模糊测试带来重大突破,大模型融入固件和代码模糊测试,降低了使用门槛,连通了各部分的关键功能,能让安全专家更高效地发现潜在漏洞,为网络安全提供更强保障。同时,随着网络技术发展,相关信息不断涌现,众多研究和实践案例证明了这种技术融合的正确性和前瞻性,推动模糊测试技术在 AI 赋能下迈向新阶段。

源码模糊测试与AI的融合

模糊测试技术,从本质上讲,是一种高度自动化的漏洞挖掘技术。它的工作原理如同在黑暗中摸索的触角,通过向目标系统输入形形色色的测试数据,试探系统的反应,一旦系统出现异常,如崩溃、内存泄漏或数据损坏等,便可能预示着潜在漏洞的存在。尽管这一技术在理论上看似简单直接,但在实际应用中,却面临着诸多棘手的挑战。

图片

1.人工编写的重重困难

· 攻击面识别的难题:人工识别库的攻击面绝非易事,仿若在一片茂密无垠的代码森林中探寻隐匿的宝藏,不但需要投入海量的时间与精力,过程中还极易出现疏漏。库中的每一个函数、每一个接口,都有可能是潜藏的攻击入口,要精准无误地将它们逐一甄别出来谈何容易。一旦出现识别偏差,就会引发一连串的误报,后果不堪设想。

· 测试驱动编写的复杂性:编写符合接口调用逻辑的测试驱动则像是一场精密的编程交响乐,要求测试人员不仅具备程序和代码分析能力,还需要对目标函数的内部机制有深入透彻的理解。任何一个细微的逻辑错误都可能导致测试结果的偏差,从而使潜在的漏洞得以逃脱检测。

· 驱动复杂度的权衡:在对代码进行测试时,为了能够最大程度地触发被测试代码里存在的各种情况,增加驱动的复杂度已然成为了一种必然的选择。之所以会出现复杂度较高的情况,主要是因为在模拟库使用的过程中,函数调用逻辑本身就具备复杂性。我们需要在尽可能满足语义要求的前提下,去考量各种各样复杂的组合情况。然而,如果驱动的复杂度不够,那就很有可能无法充分覆盖所有的测试场景,进而导致一些漏洞隐藏在那些未被触及的角落里,难以被发现。

· 编译环境的挑战:引入合适的头文件和库,并确保编译链接顺利通过,如同在复杂的迷宫中找到正确的路径。测试人员需要对编译环境和依赖关系有清晰准确的认识,任何一个环节的疏忽都可能导致编译失败,从而阻碍测试工作的进展。

2.静态分析的局限性

· 语义理解的障碍:识别某些接口的参数间的语义联系犹如解读古老的神秘符文,困难重重。例如,确定两个参数之间是否存在逻辑关联,如一个参数是否代表另一个参数的长度,往往需要对程序的业务逻辑有深刻的领悟,而这对于静态分析工具来说并非易事。

· 上下文构建的困境:通过程序结构信息构造合理的上下文就像是在碎片化的拼图中拼凑完整的画面,十分艰难。缺乏合理的上下文,生成的测试驱动可能无法准确模拟实际使用场景,从而导致漏洞检测的准确性大打折扣。

鉴于此,李唯表示,结合静态分析技术与自动编译链接框架,我们精心设计了基于 LLM 生成 Fuzz 驱动的创新框架,这一框架让测试更加高效、精准。

图片

1.输入阶段

流程始于程序源代码,需深入分析以提取关键信息,包括反映代码整体结构化形态、模块层级关联与交互途径的程序结构信息,聚焦代码内部组织逻辑如条件判断、循环结构的代码结构信息,以及明确函数输入、输出参数与单元测试功能验证要点的函数签名与明确函数上下文。

2.Prompt 生成与优化阶段

据前阶段所提取的结构化信息,正式开启由 LLM 驱动的 Prompt 生成流程。首先,依据程序、代码结构信息以及函数特性来生成初始 Prompt,以此为 LLM 明确工作方向。接着,把运行过程中发现的各类问题进行系统归类,拼装成用于驱动 LLM 进行修复的 Prompt。在此基础上,通过回溯优化手段,确保最终生成的代码更加契合预期。一旦发现问题,便能及时提供相应的修复 Prompt,并且持续借助回溯优化策略,让生成的代码不断向预期靠拢,达到理想效果。

3.LLM 模型驱动阶段

在获取精准优化的 Prompt 之后,LLM 凭借自身卓越的语言理解与生成能力,着手生成驱动代码及相应逻辑。尽管 LLM 拥有海量的知识储备,具备强大的学习与推理能力,然而其生成的驱动代码仍有可能存在瑕疵。一旦发现问题(将其标注为驱动问题 1),便会立即反馈,随即返回修正环节。此时,重新对 Prompt 进行调整,再次驱动 LLM 生成新的代码,如此反复进行多轮迭代。通过不断地纠错与优化,直至最终产出可靠、稳定的驱动代码,满足实际应用需求。

4.白盒 Fuzz 编译与测试阶段

LLM 生成的驱动代码随后会进入白盒 Fuzz 编译与测试框架。此框架独具特色,它能够将生成的代码与专业测试框架巧妙融合,一方面执行驱动编译操作,另一方面针对 Fuzz 驱动展开动态运行评估。在这一过程中,它致力于模拟各种复杂的实际应用场景,通过输入随机或者半随机数据,全方位探测代码在不同工况下的具体表现,以此严谨地检测所生成驱动的质量在该阶段是否达到合格标准,确保代码的可靠性与稳定性。

5.结果评估与优化阶段

动态评估中若出现运行问题(标注为运行问题 1),流程迅速回溯,详细记录问题反馈至上游环节,针对性调整代码、Prompt 或测试条件,重新进入相应流程迭代优化,经严格评估才能生成最终用于 Fuzz 测试的驱动,确保稳定性与可靠性达标。

6.输出阶段

历经诸多环节考验,最终输出可直接用于 Fuzz 测试的驱动程序,为后续漏洞挖掘与安全测试筑牢根基,保障软件系统在复杂网络环境中的安全稳定运行。

图片

以测试一个可能存在缓冲区溢出漏洞的openssl库函数为例,李唯表示,我们可以清晰地看到传统方法与结合 LLM 方法之间的巨大差异。传统的 LibFuzzer 测试驱动编写过程犹如一场漫长而艰难的跋涉,需要测试人员手工编写大量复杂的代码来处理各种边界情况和函数调用逻辑。而在引入 LLM 后,整个过程变得高效而流畅。LLM 能够根据提供的函数定义和相关上下文信息,迅速生成初步的测试驱动代码。在对SSL_do_handshake函数的测试中,LLM 根据详细的 Prompt,生成了包含正确头文件引用、合理函数调用逻辑的驱动代码。经过编译构建和多轮迭代优化,成功地进行了 fuzz 测试,并发现了如堆缓冲区溢出等类型的漏洞。通过对这些漏洞的深入分析,不仅验证了 LLM 在源码 Fuzzing 中的有效性,更展示了它如何帮助安全专家突破传统方法的局限,更加高效地发现隐藏在复杂系统中的潜在漏洞,为保障网络安全防线增添了一道坚固的屏障。

固件模糊测试与AI的融合

在固件安全检测领域,模糊测试与人工智能的结合正成为一种极具潜力的创新方向。李唯表示,我们选择了种子生成优化这一方向。具体实施策略如下:

图片

首先,充分发挥大模型强大的理解能力,对 BusyBox 中集成的各类工具展开深入剖析,力求精准把握每一种工具的使用方式。

其次,依据不同工具各自的特点,利用大模型针对性地生成与之适配的测试数据。

随后,将这些初始数据送入AFL进行专业的种子清洗流程。通过严谨筛选,去除那些无效或干扰性强的数据,只保留真正合适、最具潜力的数据作为最终用于测试的种子。

最后,调用AFL,凭借其专业性能,利用筛选出的优质种子开启全面测试流程。如此一来,便能为固件的安全漏洞检测注入强劲动力,保障固件在复杂多变的运行环境中维持稳定可靠的状态。

图片

在具体实施过程中,李唯表示,我们准备了三种输入给大模型的配置信息,分别聚焦于 awk、sed、sort 这三个工具。以 awk 为例,其操作流程展现了整个过程的精细与复杂。首先,执行 busybox --help 命令,获取详细的输出信息,并将其传递给大模型。大模型依据这些信息,准确判断 busybox 中集成的工具和版本信息。随后,对大模型返回的信息进行解析,得到清晰的工具列表和版本详情。接着,遍历整个工具列表,针对每个工具执行验证操作,即通过执行工具的 --help 命令来确认其是否存在。若工具存在,便获取其详细的帮助信息,并将 BusyBox 版本、工具名称、工具用法信息等关键内容整合进精心设计的 Prompt 中。该 Prompt 明确要求大模型生成多种正常和畸形的工具脚本,目的在于最大化代码覆盖范围和执行路径,为后续测试提供丰富多样的数据基础。

图片

在利用 LLM 生成种子阶段,严格按照上述流程,根据合成的 Prompt,LLM 成功生成了大量符合 awk 语法格式的数据,例如一系列丰富多样的 awk 脚本。之后,调用 AFL 进行种子清洗,运用特定的命令(如 “AFLplusplus/afl - cmin - Q - i /awk/- o /cminawk/--/busybox awk - f @@”)进行专业处理。经过清洗后发现,大约三分之一的数据在代码覆盖上展现出独特性,这表明生成的种子数据具有较高的质量和有效性。对 awk、sed、sort 三个工具都实施类似操作后,得到了各自不同的生成效果。其中,awk 生成了 938 个种子,经过清洗后队列数量为 38,在 1 轮测试后发现的独特崩溃个数达到 13 个;sed 生成 31 个种子,清洗后队列数量为 9,不过在此次测试中未发现独特崩溃情况;sort 虽未详细提及种子生成数等具体信息,但也顺利完成了相应的测试流程。通过与未使用大模型生成种子(仅随机给定种子内容,如 “123”)的测试效果进行对比,使用 LLM 生成种子在队列数量、发现崩溃个数等关键指标上的优势一目了然。这一对比有力地证明了将大模型与 AFL 相结合的方式在固件 Fuzzing 中具有显著的有效性和价值,为固件安全测试提供了一种全新且高效的解决方案。

写在最后

大模型与 AI 技术深度融合推动模糊测试领域进入新阶段,在源码 Fuzzing 中,LLM 解决传统难题,提升漏洞挖掘效率和精准度;固件 Fuzzing 里,优化的种子生成过程优势显著。但该领域仍面临挑战,如提升 LLM 生成代码质量以契合复杂测试需求、处理系统依赖关系避免测试失败等。不过,随着技术发展,这些挑战有望被攻克,未来模糊测试与 AI 的结合将在网络安全领域发挥更重要作用,助力保障软件系统安全,构建安全数字世界。

随着技术不断进步,安全极客社区将积极顺应技术发展趋势,以 “AI + Security” 为核心,举办更多丰富多样的主题活动。社区致力于汇聚各界专家学者,共同探讨前沿技术,分享实践经验和技术干货,推动整个行业共同进步,为构建更加安全、智能的软件生态系统贡献力量。


云起无垠
9 声望13 粉丝

国内首创的Fuzzing 全流程赋能开发安全-DevSecOps 解决方案供应商, 基于智能模糊测试引擎为协议、数据库、API、APP、Web3.0 等场景提供强大的软件安全自动化分析能力,从源头助力企业自动化检测与修复业务系统安...