分享自:

基于LLM约束求解的混合语言处理器模糊测试

期刊:34th USENIX Security Symposium

针对语言处理器的混合模糊测试:通过基于大型语言模型的约束求解

作者、机构与发表信息 本研究由美国佐治亚理工学院的Yupeng Yang, Shenglong Yao, Jizhou Chen, 以及Wenke Lee共同完成。该论文发表于第34届USENIX安全研讨会(34th USENIX Security Symposium)的会议论文集,会议于2025年8月13日至15日在美国华盛顿州西雅图举行。

学术背景与研究动机 本研究的核心科学领域是软件安全与软件测试,具体聚焦于针对语言处理器(如编译器、解释器)的自动化漏洞挖掘技术,即模糊测试(Fuzzing)。语言处理器是现代网络空间的基石,其存在的缺陷可能导致严重的后果,例如功能错误或恶意攻击。然而,自动化测试语言处理器以检测其错误行为极具挑战性,主要原因在于语言处理器通常是多阶段的(如词法分析、语法分析、语义检查、代码生成/执行),每个阶段都对输入施加了复杂多样的约束。现有的模糊测试方法在应对这些复杂约束时存在明显局限:通用解决方案(如污点跟踪、符号/混合执行)往往无法有效生成满足复杂约束的输入,或者因对目标程序语义建模不完整而失败;而针对特定目标设计的解决方案虽然有效,但严重依赖人工编写的启发式规则,难以推广到其他语言处理器。因此,该领域面临一个困境:通用方案在处理语言处理器时效果不佳,而特定方案又缺乏通用性。

近年来,大型语言模型(LLM)在代码理解和推理任务上展现出卓越的能力,这为利用LLM解决复杂约束问题提供了新的可能性。本研究旨在探索利用LLM进行约束求解以突破语言处理器模糊测试瓶颈的潜力。然而,研究者识别出两个关键挑战:1) 约束优先级排序:如何在数百万行代码中,高效地选择那些一旦解决能为模糊测试带来最大覆盖率提升且LLM有能力解决的约束?2) 上下文构建:如何向LLM提供足够且简洁的代码上下文,使其能够有效推理并解决约束?为解决这些挑战,研究者提出了两项创新方案:混合中心性优先级排序(Hybrid Centrality Prioritization)和迭代上下文构建(Iterative Context Construction),并基于此实现了一个名为HLPFuzz的混合模糊测试框架。

研究流程与方法细节 本研究设计并实现了一个端到端的混合模糊测试框架HLPFuzz,其核心工作流程是将传统的灰盒模糊测试运行时与一个基于LLM的白盒约束求解器相结合。

1. 整体框架与基础组件: HLPFuzz以目标程序的源代码、一个简短的自然语言规范描述和一个语法文件作为输入。框架主体包含两个协同工作的部分: * 灰盒模糊测试运行时:基于成熟的AFL++框架构建,负责执行目标程序、调度种子、进行变异以及检测崩溃等错误行为。它采用语法感知的变异器(利用ANTLR4语法),以快速探索浅层代码区域。 * 基于LLM的约束求解器:这是本研究的核心创新模块。当传统变异难以突破复杂约束时,该模块被激活,利用LLM生成满足特定约束的输入,以触及更深层的程序状态。

2. 混合中心性优先级排序(解决挑战一): 该算法的目标是从众多未解决的约束中,优先选择那些对提升代码覆盖率潜力最大且LLM相对容易解决的约束。 * 覆盖潜力评估:首先,HLPFuzz构建目标程序的跨过程控制流图(ICFG)。对于每个未被覆盖的基本块(代表一个待解决的约束),使用出度卡茨中心性(Out-degree Katz Centrality) 来计算其在图中的影响力。中心性分数越高,意味着覆盖该节点后,后续可能探索到的未覆盖代码区域越多,即覆盖潜力越大。 * LLM解决难度校准:仅凭中心性排序不够,因为LLM可能对某些类型的约束束手无策。HLPFuzz引入了一种基于历史解决反馈的混合校准机制。它将约束分为两部分:从程序入口到目标函数(预约束),以及从目标函数入口到目标基本块(完整约束)。LLM的解决结果被分为三类:SC1(未解决预约束)、SC2(解决了预约束但未解决完整约束)、SC3(成功解决完整约束)。系统维护历史记录映射,分别跟踪每个函数的预约束成功/失败次数,以及每个基本块完整约束的失败次数。 * 分数计算与排序:最终的优先级分数是中心性分数与一个缩放因子的乘积。缩放因子根据历史记录动态调整:如果一个函数或基本块的失败次数增多,其缩放因子会降低,从而降低其优先级;而预约束的成功解决则会部分抵消失败的影响(通过一个大于1的常数γ)。这种设计使得算法能够优先处理高潜力、且LLM过往表现较好的约束,避免在难以解决的约束上浪费资源。算法最终对未覆盖基本块进行排序,并选取前N个(N=10,根据经验设定)作为LLM的求解目标。

3. 迭代上下文构建(解决挑战二): 该算法的目标是为LLM构建一个足够且精炼的代码上下文,以指导其成功求解约束。 * 初始上下文:初始提示词包含三部分:1) 任务描述:说明目标、规则和语言处理器规范(平均6行描述);2) 窄上下文:提供包含目标未覆盖代码行的封闭函数的源代码,并高亮目标行;3) 学习示例:从模糊测试队列中提取一个能触发该约束评估点(即执行到该条件判断)但未进入目标分支的测试用例,经最小化后提供给LLM作为示例。 * 迭代精炼:如果LLM基于初始上下文生成的解决方案未能触发目标代码,HLPFuzz启动迭代精炼流程: * 分歧分析(动态分析):通过调试器(如LLDB)运行学习示例和LLM的失败方案,比较两者的执行轨迹,定位第一个执行路径发生分歧的函数。将该函数的源代码(并高亮分歧行)加入上下文,反馈给LLM。这有助于LLM理解到达目标函数前必须满足的“预约束”。 * 语言服务器集成(静态分析):当缺失的上下文不在执行路径上时(例如,需要理解某个被调用函数的内部逻辑),HLPFuzz为LLM集成一个语言服务器协议(LSP)工具(如clangd)。LLM可以主动请求查询特定符号(如函数、变量)的定义,系统通过LSP获取并返回相关代码。这使得LLM能够像程序员一样,按需探索代码库。 这个过程持续迭代,直到LLM成功生成解决方案,或达到最大迭代次数(经验设为5次)。

4. 评估方法与实验设计: 研究进行了广泛的评估,以回答三个核心问题:HLPFuzz的通用性与有效性、其核心解决方案的贡献、以及与现有先进工具的对比。 * 评估目标:选取了9个来自7种不同编程语言(C/C++, Fortran, JavaScript, PHP, Java, Go, Rust)的流行语言处理器作为真实世界目标。 * 消融实验:为了量化两个核心解决方案(混合中心性优先级排序HCP和迭代上下文构建ICC)的贡献,研究者创建了多个HLPFuzz变体进行比较:HLPFuzz-!HCP(随机选择约束)、HLPFuzz-!ICC(仅提供初始上下文)、HLPFuzz-!!(两者皆无)、HLPFuzz-!HC(无混合校准)、HLPFuzz-!LSI(无语言服务器集成)。基线是使用相同语法感知变异器的AFL++。 * 对比实验:将HLPFuzz与六种先进的模糊测试工具对比,包括通用约束求解方案(SymQEMU, RedQueen)、通用语法感知模糊器(Polyglot, Grammarinator)以及针对特定语言的模糊器(针对C++的Yarpgen,针对JavaScript的Fuzzilli)。 * 评估指标:主要评估指标包括代码覆盖率(通过边覆盖衡量)、漏洞发现数量以及LLM的约束求解成功率。所有实验在受限的Docker环境中运行24小时,重复5次取平均值。LLM使用的是OpenAI的GPT-4o-mini模型。

主要结果与分析 1. 通用性与有效性(漏洞发现): HLPFuzz在9个被测语言处理器中共发现了52个漏洞。截至论文撰写时,其中37个已被开发者确认,14个已被修复。这一成果是在仅依赖平均6行自然语言描述的目标规范、而无需大量目标特定启发式规则的情况下取得的,证明了其强大的通用性和有效性。论文提供了两个详细的案例研究,展示了HLPFuzz如何突破复杂约束发现深层漏洞,例如在Flang编译器中发现与PACK掩码操作相关的断言失败,以及在Clang++中发现涉及模板参数包和Lambda函数的栈溢出漏洞。

2. 核心解决方案的贡献(消融实验结果): * 代码覆盖率:完整的HLPFuzz在四个主要测试目标(Clang++, Flang, Hermes, PHP)上,比基线AFL++的边覆盖率分别提升了109%、45.8%、34.3%和31.0%。移除任一核心组件都会导致覆盖率下降。 * 移除语言服务器集成(!LSI)导致覆盖率下降2.65%至8.01%。 * 移除整个迭代上下文构建(!ICC)导致覆盖率下降4.21%至19.3%。 * 移除混合校准(!HC)导致覆盖率下降8.02%至20.51%。 * 移除中心性分析(!HCP,即随机选择)导致覆盖率提升大幅缩水(仅3.87%至8.81%)。 * 同时移除两个核心方案(!!)的覆盖率提升非常有限(5.82%至18.57%),远低于完整版HLPFuzz。 * 漏洞发现:在24小时的测试中,完整HLPFuzz发现了10个独特漏洞,而所有变体版本发现的漏洞数均少于或等于完整版。HLPFuzz-!!发现的漏洞数与基线AFL++相同,说明没有有效的优先级排序和上下文构建,LLM的效用大打折扣。 * 求解成功率:完整HLPFuzz的LLM约束求解成功率在23.1%到33.5%之间,是所有变体中最高的。迭代上下文构建和混合校准都显著提升了成功率。 * 内部机制分析:对约束选择的分析显示,未经优先级排序随机选择的约束中,74%守卫的是控制流图的叶节点(覆盖潜力低),而HLPFuzz选择的约束均守卫着包含更多分支和函数调用的子树。平均而言,HLPFuzz需要2.64次迭代才能成功解决一个约束,中位数为2-3次,且仅5%-9.1%的解决方案能在第一次迭代成功,证明了迭代精炼的必要性。

3. 与现有工具的对比: * 代码覆盖率:在所有四个对比目标上,HLPFuzz在24小时内的边覆盖率均显著优于所有对比工具。相比第二名,HLPFuzz的覆盖率提升幅度在7.18%到90.34%之间。 * 漏洞发现:HLPFuzz在24小时内发现的漏洞总数(10个)远超其他工具。作为对比,Polyglot发现了2个(也被基线AFL++发现),Fuzzilli和Yarpgen在各自专长领域未在最新版本中发现新漏洞,而RedQueen和SymQEMU则未发现任何漏洞。 * 约束求解能力:对HLPFuzz选取的50个约束样本进行分析发现,Polyglot、RedQueen和SymQEMU虽然能到达相近数量的约束评估点,但解决这些约束的成功率极低(0%-4%),而HLPFuzz的解决率达到24%。这直接解释了HLPFuzz在覆盖率和漏洞发现上优势的原因。 * 局限性分析:研究也客观指出了HLPFuzz的局限。例如,它可能错过那些需要保持语义正确性的引导式变异才能发现的漏洞(如某些JavaScript JIT引擎漏洞),或者专门针对特定结构(如循环优化)设计的模糊器(如Yarpgen)所能发现的漏洞。这表明,基于LLM的“路障清除”方法虽然能有效生成复杂结构并提升覆盖率,但在需要深度领域知识进行针对性、引导式变异的场景下,特定目标解决方案仍有其优势。

结论与意义 本研究的核心结论是,通过系统性地解决约束优先级排序和上下文构建两大挑战,所提出的HLPFuzz框架能够有效地利用大型语言模型(LLM)来解决语言处理器模糊测试中的复杂约束问题。HLPFuzz在保持高度通用性(仅需极简目标描述)的同时,在代码覆盖率和真实漏洞发现能力上显著超越了现有的通用及特定目标模糊测试工具。

研究的价值体现在: 1. 科学价值:首次系统性地探索并验证了LLM在解决程序分析中复杂约束求解问题的可行性与有效性。提出了“混合中心性优先级排序”和“迭代上下文构建”两个创新方法,为将LLM集成到传统软件测试与分析流程提供了新的方法论和框架。 2. 应用价值:HLPFuzz作为一个开源工具,为编译器、解释器等关键基础设施的测试人员提供了一种强大、通用且相对易用的自动化漏洞挖掘手段。它能够发现深层、复杂的漏洞,有助于提高语言处理器的整体安全性与可靠性。 3. 重要观点:研究指出,未来实践者应考虑将LLM与领域知识相结合,而非盲目依赖LLM,以实现更精细化的漏洞检测。这为后续研究指明了方向。

研究亮点 1. 重要发现:HLPFuzz在9个主流语言处理器中发现了52个真实漏洞,其中多数已被确认或修复,实证了其强大的漏洞挖掘能力。 2. 方法新颖性: * 混合中心性优先级排序:创造性地将图中心性分析与LLM求解历史反馈相结合,动态量化约束的“覆盖潜力”和“解决难度”,实现了高效的求解资源分配。 * 迭代上下文构建:模仿人类调试过程,结合动态执行轨迹分析(分歧分析)和静态代码分析工具(语言服务器),以交互式、按需的方式为LLM构建精炼的代码上下文,显著提高了提示工程的效率和效果。 3. 目标特殊性:精准针对了“语言处理器模糊测试”这一长期存在挑战的细分领域,并提出了一个兼具通用性和有效性的解决方案,打破了该领域通用方案无效、特定方案难推广的困境。

其他有价值内容 论文还探讨了HLPFuzz的局限性(如静态分析精度、对二进制输入目标的适用性)以及未来改进方向。此外,实验部分还测试了HLPFuzz在不同LLM(如Llama 3.1系列)上的表现,结果表明其方法对不同能力的LLM具有普适性,但一个能力足够的LLM是获得良好性能的推荐条件。这些讨论使得研究更加全面和严谨。

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com