想象你是一名侦探,正在一座庞大且不断变化的城市中调查一起犯罪。“犯罪”是软件漏洞(安全缺陷),“案发现场”是最近被修复的一段特定代码。你的目标是找到“漏洞诱导提交(VIC)”:即开发者最初意外引入该 bug 的确切历史时刻。
这就是SZZ 算法的工作。它就像一名穿越时空的侦探,审视“修复”记录,并试图逆着城市的历史回溯,以找出最初的错误。
然而,老派侦探(之前的 SZZ 算法)往往工作不力。他们常犯两个大错:
- 错误的线索:他们选错了要调查的代码行。有时他们关注的是仅仅被移动或重命名的代码(就像移动路牌),而非真正导致问题的代码。
- 过早放弃:他们的调查停止得太早。他们可能找到一个与修复记录“相似”的提交就止步不前,从而错过了多年前真正埋下问题隐患的那个实际提交。
登场:MAS-SZZ——侦探团队
本文的作者创建了MAS-SZZ(多智能体 SZZ)。他们不再依赖一名孤胆侦探,而是组建了一支由专业 AI 智能体构成的团队,像一支高科技特警队那样协同破案。
以下是该团队的运作步骤:
1. 审计员(法医分析师)
首先,团队查看“犯罪报告”(CVE 描述)和“修复报告”(修复 bug 的代码)。
- 他们做什么:审计员总结 bug 发生的确切原因。关键在于,他们不只是猜测,而是引用报告中的具体证据来支持每一项主张。
- 核查:“法官”智能体会双重检查审计员的工作。如果审计员出现逻辑错误或无法为某项主张找到证据,法官会将其退回重做。这确保团队从一个经过验证的坚实犯罪理论开始。
2. 审查员与定位器(目标专家)
既然已经知道“犯罪”是什么,他们就需要找到用于追溯的具体证据。
- 问题:“修复”记录中通常包含大量噪音——仅仅是清理、重命名或为新增功能而添加的代码。
- 解决方案:审查员会阅读修复中的每一项变更,并询问:“开发者的意图是什么?”他们会过滤掉“噪音”(如代码重构),仅保留那些真正修复了安全漏洞的变更。
- 定位器:一旦找到相关变更,定位器就会 pinpoint 出作为“铁证”的确切代码行。这将成为锚定语句。
3. 追踪器(时空旅行者)
这是最关键的部分。追踪器拿着那个“锚定语句”,开始逆着城市的历史(代码仓库)回溯。
- 他们怎么做:追踪器不是退一步就停止,而是持续前行。在每一步,他们都会问:"bug 还存在吗?”
- 停止信号:他们持续回溯,直到找到 bug 尚未存在 的代码版本。紧随其后的那个提交(即 bug 首次出现的提交)被宣布为罪魁祸首。
- 为何更优:旧算法常因代码看起来“不同”(相似度下降)而停止。追踪器忽略代码外观的差异,纯粹关注漏洞是否存在。
结果:更出色的侦探
作者利用两个大型数据集的真实世界数据,将这支新团队与其他七种“侦探”算法进行了测试。
- 得分:在这些算法的世界里,"F1 分数”就像最终成绩,它平衡了找出所有坏蛋的能力(召回率)和不冤枉无辜者的能力(精确率)。
- 胜利:MAS-SZZ 不仅仅是略胜一筹,而是彻底碾压了竞争对手。与最佳的前序方法相比,其最终得分提升了高达65.22%。
- 启示:通过利用一个能够验证证据、过滤噪音并持续回溯直至找到真正源头的 AI 智能体团队,MAS-SZZ 在寻找软件漏洞根本原因方面,比以往任何方法都更加可靠。
简而言之,MAS-SZZ 将笨拙的单人搜索转变为协调一致、基于证据的调查,极少会错过真正的罪魁祸首。
以下是论文《MAS-SZZ:用于漏洞诱导提交识别的多智能体 SZZ 算法》的详细技术总结。
1. 问题陈述
准确识别漏洞诱导提交(VICs)对于漏洞检测、严重程度评估和影响版本分析等软件安全任务至关重要。标准方法SZZ 算法通过从漏洞修复提交(VFC)向后追溯代码变更,以找到引入该缺陷的原始提交。
然而,现有的 SZZ 算法(包括基础变体如 B-SZZ、AG-SZZ,以及最先进的基于大语言模型的方法如 LLM4SZZ)存在两个主要局限性:
- 锚点选择错误:传统方法依赖简单的基于差异(diff)的启发式规则(例如删除/修改的行)来选择用于回溯的“锚点语句”。当漏洞隐藏在未修改的上下文中,或者当“复合”和“幽灵”提交引入噪声时,这种方法会失效,导致高误报率。即使是 LLM4SZZ 也面临困难,因为它无法总是区分安全修复与非安全变更(例如重构)。
- 回溯能力不足:标准算法通常执行单步回溯,或使用基于相似性的启发式规则,导致过早停止(过度追溯)或错过真实源头(追溯不足)。它们缺乏确定漏洞确切引入时刻所需的动态推理能力。
2. 方法论:MAS-SZZ
作者提出了MAS-SZZ,这是一个多智能体 SZZ系统,利用大语言模型(LLM)和自主智能体来克服这些挑战。该系统由专门的智能体(审计员、法官、审查员、评估员、定位器和追踪器)协调,在三个不同的阶段运行。
阶段 1:基于证据的根因分析
- 输入:CVE 描述及相应的 VFC(提交消息和代码差异)。
- 过程:
- 审计员智能体分析输入以总结漏洞的根因。关键在于,它生成证据点,将每个主张链接回 CVE 或代码差异的具体部分,以防止幻觉。
- 法官智能体在两个维度上进行可靠性检查:
- 证据可追溯性:证据能否映射到提供的输入?
- 逻辑一致性:根因是否与提交消息一致?
- 如果检查失败,法官向审计员提供纠正反馈,以进行针对性的重新生成(最多 3 轮)。
阶段 2:意图驱动的锚点语句选择
- 目标:过滤掉非安全变更(例如重构、杂务),以识别导致漏洞的具体行。
- 过程:
- 审查员智能体使用结构化的逐步提示策略(思维链)来分析每个补丁块。它推断变更意图,并基于常规提交规范(Conventional Commits Specification)对其进行分类(例如“修复”、“重构”、“杂务”)。
- 评估员智能体检查“修复”补丁块的意图是否与之前确定的根因一致。
- 定位器智能体从相关补丁块中选择具体的锚点语句,同时考虑代码变更、周围上下文和根因。
阶段 3:自主仓库探索
- 目标:向后追溯仓库历史,以找到包含漏洞的第一个提交。
- 过程:
- 追踪器智能体从锚点语句开始,迭代执行
git blame 以在提交历史中向后移动。
- 在每一步,智能体分析提交消息和代码状态(使用
ExpandContext 和 LocateSymbol 等工具),以确定该修订版中是否存在漏洞。
- 动态停止标准:与固定步长算法不同,当当前提交中不再发现漏洞但前一提交中存在时,追踪器停止。最后一个存在漏洞的提交被识别为 VIC。
3. 主要贡献
- 多智能体架构:设计了 MAS-SZZ,这是一个新颖的系统,其中专门的智能体协作处理根因分析、意图识别和自主历史探索。
- 优化策略:
- 基于证据的分析:确保根因总结可根据输入进行验证,减少幻觉。
- 意图驱动的选择:利用 LLM 区分安全修复与噪声,解决锚点选择挑战。
- 自主探索:用基于根因指导的动态、迭代回溯取代静态启发式规则。
- 全面评估:在涵盖 C/C++ 和 Java 的两个由人工标注的基准数据集(V-SZZ 和 Java-SZZ)上,针对七种现有的 SZZ 算法验证了该方法。
4. 实验结果
作者使用 Gemini-3.1-pro 作为骨干 LLM 对 MAS-SZZ 进行了评估,基线包括 B-SZZ、AG-SZZ、L-SZZ、R-SZZ、MA-SZZ、V-SZZ 和 LLM4SZZ。
- 性能:MAS-SZZ 在所有数据集上的F1 分数均优于所有基线。
- 在 Java-SZZ 数据集上,其 F1 分数比表现最佳的基线提高了 65.22%。
- 在 9 种评估指标组合(三个数据集上的精确率、召回率、F1 分数)中,它有 8 种组合进入前两名。
- 消融研究:
- 移除**锚点选择(w/o AS)**导致精确率显著下降(高达 59.52%),证明了过滤不相关代码块的必要性。
- 移除**智能体回溯(w/o AB)**导致 F1 分数大幅下降(高达 54.17%),表明自主、迭代的探索优于静态的、单步的追溯。
- LLM 选择:重型模型(例如 Gemini-3.1-pro)通常优于轻量级模型,其中 Gemini-3.1-pro 取得了最佳的整体结果。
5. 意义
MAS-SZZ 代表了漏洞分析的范式转变,即从基于启发式的行映射转向基于语义的多智能体推理。
- 可靠性:通过将根因分析建立在证据之上并使用意图驱动的过滤,它显著减少了由复合或幽灵提交引起的误报。
- 适应性:自主回溯机制使系统能够处理传统相似性指标失效的复杂版本历史。
- 实际影响:准确性的显著提升(高达 65% 的改进)表明,MAS-SZZ 可以可靠地部署在现实世界的软件供应链安全工具中,以准确识别漏洞的源头,从而实现更快的修复和更好的风险评估。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。