孟任巍
返回

VulnAgent-X:把漏洞检测从“一次性判断”升级为“可验证的多Agent审计工作流”

提出分层Agent漏洞检测框架:风险筛查→上下文扩展→多专家协作→动态验证→证据融合,让漏洞检测更可靠、更可解释、误报更低。

VulnAgent-X:把漏洞检测从“一次性判断”升级为“可验证的多Agent审计工作流”
2025年9月1日OngoingFirst author
SecurityVulnerability DetectionAgentLLMCode IntelligenceRepository-levelVerificationExplainability

背景:为什么漏洞检测很难?

漏洞检测不像普通分类任务。很多高危问题并不“写在一行代码里”,而是藏在:

  • 跨函数/跨文件的调用链(source → sink)
  • 配置、权限、环境变量等隐性约束
  • 运行时条件(某些输入组合才触发)
  • 历史代码习惯(项目特定的防护/编码模式)

因此,单次把某段代码丢给模型问“有没有漏洞”常见的两类失败:

  1. 漏报:需要上下文,但模型没看到;
  2. 误报:模型讲得很像,但证据不足,路径不可达或已被过滤。

问题:单模型 one-shot 审代码的天花板

即便 LLM 代码理解很强,安全审查仍然面临:

  • 上下文不足:只看函数/片段无法判断真实数据流
  • 缺少验证:无法区分“可疑”与“可利用”
  • 缺少反证机制:模型容易被自己的推断带跑
  • 难以解释:给出结论但不给完整证据链

所以我把核心问题定义为:

能不能把漏洞检测从“静态判断”变成“像真正安全审计一样的闭环流程”,并且让输出带证据、可复核、可定位?

方法:VulnAgent-X(分层多Agent + 证据驱动)

VulnAgent-X 不是让一个模型一次性输出结论,而是把检测拆成五个阶段:

1) Fast Risk Screening(快速筛查)

先用低成本信号把搜索空间缩小:

  • 轻量静态信号(危险 API、缺少校验等)
  • 变更元信息(鉴权模块、输入处理模块、配置变更)
  • 轻量模型风险评分

只保留 Top-K 高风险片段进入下一步,避免“全仓库大推理”。

2) Context Expansion(最小充分上下文扩展)

围绕高风险片段构建最小充分上下文,而不是把全仓库塞进模型:

  • 调用者/被调用者(call chain)
  • 相关配置、权限策略
  • 测试、异常处理
  • 相似历史修复

目标:给模型“刚好够用”的证据,而不是“越多越好”的噪声。

3) Multi-Agent Collaborative Analysis(多专家并行)

核心是“分工 + 互补 + 对抗”:

  • Router Agent:先判断属于安全漏洞还是普通 bug,路由给专家
  • Semantic Agent:盯语义/控制流/边界/异常
  • Security Agent:盯 source→sink、注入、鉴权、危险 API 等
  • Logic Bug Agent:盯状态机/事务边界/并发/校验顺序
  • Sceptic Agent(反方):专门找反证:路径是否不可达?是否已过滤?是否只是风格问题?

这一层的目标不是“多写几段解释”,而是形成可辩论的证据集合

4) Dynamic Verification(选择性动态验证)

当风险高或不确定性大时,生成验证材料:

  • 最小复现输入 / payload
  • 单元测试 / regression test
  • 运行轨迹(若允许沙箱执行)

把“看起来像漏洞”升级为“可验证的漏洞/缺陷”。

5) Evidence Fusion(证据融合与裁决)

最后不听某个 Agent 的“一票否决”,而是做证据融合:

  • 静态证据 + 上下文证据 + 多Agent一致性 + 动态验证
  • 再减去反证(counter-evidence)

输出结构化 findings:

  • 类型、位置(文件+行号)
  • 证据链(source→sink / reachability)
  • 置信度与严重性
  • 修复建议与回归测试建议

实验:怎么验证有效?

我按三类目标设计实验:

  1. 检测性能:Precision/Recall/F1/AUROC
  2. 定位能力:Top-1/Top-3/MRR(行级/语句级定位)
  3. 工程可用性:token 成本、时间、动态验证触发比例、早停比例

数据集选用公开基准(函数级 + 提交级):

  • Devign(经典函数级漏洞检测)
  • Big-Vul(大规模 C/C++ 漏洞数据集)
  • PrimeVul(更严格、更贴近真实的评测设置)
  • 提交级 just-in-time 基准(commit-level detection + localisation)

你会在图里看到什么?

  • Pareto 图:性能 vs 成本,展示分层调度带来的“更划算”的点
  • 敏感性曲线:K / context budget 增大后性能提升很快饱和,但成本持续上升
  • 阈值影响:不同置信度阈值如何影响验证率与成本
  • 错误分布:环境依赖、helper 语义缺失、可达性判断等仍是主要错误来源

关键 takeaway

  • 漏洞检测的瓶颈常常不是“模型看不懂代码”,而是证据不足与验证不足
  • 把任务拆成“筛查→上下文→多专家→验证→融合”,能显著提升可靠性与可解释性。
  • 反方 Sceptic Agent 对降低误报很关键。
  • 动态验证不需要全量执行,只要对高风险/高不确定样本做选择性验证,就能极大提升置信度。

局限与下一步

  • 依赖环境配置的漏洞仍然难:需要更强的环境建模/沙箱执行支持
  • 数据集标签噪声会影响评测:需要更严格的审计式评估
  • 更希望把输出对齐实际安全流程:比如生成 PR review comment、给出可直接落地的修复 diff

如果你对这套工作流感兴趣,欢迎看论文与代码(链接在文首 front matter)。