论文一:ObliVul: Alert-Conditioned Safety Obligation Modeling and Bidirectional Counterfactual Validation for Code Vulnerability Detection(arXiv:2610.11801) 发表时间:2026年10月 机构:太原理工大学(单一高校,中国)。五位作者 Heyang Tan、Chengxin Gao、Xin Wen、Jiaxin Li、Rui Cao 全部来自太原理工大学,无企业合著;属于高校团队在软件安全方向的独立产出 领域标签:漏洞检测 / 静态分析告警验证 / 代码属性图 / LLM 语义恢复 / 反事实验证

论文二:Where Do the Tokens Go? Understanding and Reducing Costs in LLM Agents for Vulnerability Discovery(arXiv:2610.11602,方法部分简称 AVRI) 发表时间:2026年10月 机构:华中科技大学(单一高校,中国)。四位作者 Li Lu、Yanjie Zhao(通讯作者)、Hongjie Chen、Haoyu Wang 全部来自华中科技大学,属该校网络安全方向的学术团队;论文为实证研究 + 接口设计的双贡献 领域标签:LLM Agent / 漏洞挖掘 / 成本实证分析 / Agent 接口设计 / CyberGym 基准

这两篇论文一个共同的关键词是双向。ObliVul 用「加防护 / 删防护」两个方向的反事实干预去验证一条告警是否真实;AVRI 用「前向追踪输入 / 后向推导违例条件」两个方向的分析去连接输入与危险操作。合起来读,恰好覆盖了漏洞治理链条的两端:检测端的告警怎么验真,以及利用端的 PoC 怎么便宜地造出来。而两篇论文殊途同归地指向同一个深层结构——漏洞的可验证性,最终都落在「输入如何到达危险操作、什么条件决定它不安全」这条连接上。

一、论文背景

1.1 漏洞检测:真正的问题不是找不到,而是分不清

先从最基础的概念说起。**静态分析(static analysis)**是什么?就是不实际运行程序,只靠阅读和分析源代码来找出潜在问题的技术。可以类比机场安检:安检员不打开你的行李真正翻检每一件物品(那是「动态测试」),而是用 X 光机扫一遍,看到可疑形状就报警。

问题恰恰出在这里。为了不漏掉任何真实风险,静态分析必须保守——宁可错报一千,不可放过一个。路径能不能走到、两个变量是不是同一对象(别名关系),这些信息静态看不完全确定,分析器只能往「可能有风险」的方向猜。于是真实项目里,静态分析器产出的候选告警动辄成千上万,其中绝大多数是误报。ObliVul 论文开篇的第一句话就是:现实软件开发中漏洞检测的首要挑战,往往不是找到可疑代码,而是判断大量候选告警中哪些真正值得看。

**告警(alert)**因此成为 ObliVul 的中心概念:一条告警代表一个「潜在漏洞线索」——某个位置出现了某个危险操作(比如未检查边界的拷贝),但它是真是假还没定论。告警验证要回答三个问题:怎么围绕单个告警提取相关程序证据?怎么从证据中恢复出影响告警成立与否的安全条件?怎么验证这些条件真的作用于当前风险?

**安全义务(safety obligation)**是论文给这些安全条件起的名字:一条告警的成立与否,取决于某些可以被程序证据支撑、也可以被进一步检查的安全条件——外部输入能否到达危险操作、相关分支是否可达、防护或净化措施是否覆盖了风险路径并在危险操作之前生效。就像烟雾报警器响了,消防员要检查的「义务」是:这间房里有没有真的火源、通风条件会不会把烟带进来、洒水器是否覆盖这个房间。

1.2 代码属性图:把程序变成一张可查询的网

**代码属性图(Code Property Graph,CPG)**是 ObliVul 的基础设施。一个程序的语法结构(抽象语法树)、执行顺序(控制流图)、数据从哪来到哪去(数据依赖)、函数之间的调用关系——这四样东西原本是四种不同的表示。CPG 把它们统一成一张图:节点是代码实体,边是各种关系,可以用查询语言一次性问出「这个变量的值从哪来」「这个分支保护了哪些操作」。

但 CPG 也有短板:它能表示结构,却难以直接刻画「安全义务」——义务的有效性、满足状态、作用范围,这些语义层面的东西图里没有。另一方面,大语言模型(LLM)恰好擅长从局部代码事实中推断「这是风险源、那是防护条件」,但它的输出是自然语言,没法可靠地对齐到具体的程序节点、依赖边和传播路径上,也就没法用程序分析的手段进一步核查。ObliVul 的切入点正在这个缝上:让 LLM 的语义推断「落地」到 CPG 的结构上。

1.3 另一头:LLM Agent 挖漏洞,烧钱烧在哪

第二篇论文关注的是漏洞链条的另一端。LLM Agent 是什么?就是让大模型不只回答一次,而是循环地「思考—调用工具—观察结果—再思考」的执行系统。在漏洞挖掘场景里,agent 收到一个真实项目和测试入口点(论文称 harness,即挂载被测程序的驱动入口),要在可达代码中找到能触发崩溃的缺陷,并构造出一个概念验证输入(Proof of Concept,PoC)——一个真的能让程序崩掉的输入。

这件事正在变得昂贵。论文引用的背景显示:有的任务要跑好几个小时、消耗数百万 token;仓库级漏洞发现的花费也在这个量级。Token 是 LLM 计费和上下文的基本单位,可以理解为模型每次读写的「字数」。成本因此成为与有效性并列的部署约束。

降本难在哪?漏洞挖掘是一串相互依赖的活动:定位相关代码、推理输入约束、构造候选输入、解读执行反馈。一次失败可能要求回头重做其中任何一步。直接砍轮数、砍历史确实省钱,但会砍掉完成任务所需的上下文。只看总成本和总成功率,分辨不出「高效分析」和「原地打转」——这正是第二篇论文要诊断的。

1.4 实验场:四个 Agent 脚手架与四个效率方法

第二篇论文的实验需要先认识几个「实验动物」。CyberGym 是真实开源 C/C++ 项目漏洞构成的基准,每个任务给一个易受攻击的构建版本和一个修复版本,agent 要构造让前者崩溃、后者正常的输入。四个被研究的 agent 脚手架代表了四种接口设计哲学:Codex 在工作区直接执行 shell 命令,无逐命令白名单;OpenCode 提供原生文件与 shell 工具,参数 schema 会在执行前拒绝格式错误的调用;Cybench 从模型输出中抽取 Command 字段在 Kali 风格容器里执行;EnIGMA 沿用 SWE-agent 设计,组合 bash 与 open、search_file、debug_start、decompile 等专用命令。

四个被评测的效率方法分别针对 agent 工作流的不同部位:AgentDiet 压缩交互历史以削减上下文成本(其压缩模型 DeepSeek-V4-Flash 单独计费——这个细节后面会变得重要);Revelio 用轻量静态分析对指定文件生成排好序的漏洞假设,再用强模型确认;PAgent 用覆盖率反馈引导 PoC 生成;CodeGraph 构建仓库级调用/引用图并通过查询接口暴露。它们覆盖了历史压缩、假设选择、执行反馈、代码导航四个干预点——覆盖面完整,正是「为什么它们还是不行」这个问题有价值的原因。

1.5 两篇合读的背景逻辑

把两篇放在一起看会发现有趣的对称:检测端(ObliVul)的痛点是 LLM 语义输出不可验证,解法是把它锚定到程序结构再做反事实干预;利用端(AVRI)的痛点是 agent 反复读代码却保持不住「输入→危险操作」的连接,解法是把这条连接做成持久化、可复用的证据。一边问「告警是真的吗」,一边问「验证一个告警要花多少钱」——验证,是两篇论文共同的题眼。

二、论文定位和关联工作

2.1 ObliVul 在漏洞检测谱系中的位置

按论文自己的梳理,相关工作分三族:

谱系代表工作核心思想与 ObliVul 的关键区别
告警导向静态分析CPG 模型(Yamaguchi et al. 2014)、LLM4SA、CodeCureAgent用程序切片/路径敏感分析缩小告警相关代码范围,做告警优先级、分类与自动处理判定告警有效性或生成解释/修复建议,但数据依赖、控制依赖、防护条件散落各处,未形成统一的安全义务表示
学习式/LLM 增强检测CodeBERT、CodeT5、UniXcoder、LineVul;IRIS、Vul-RAG、GRACE、LLMxCPG序列/图表示学习漏洞模式,或用外部安全知识、图结构增强 LLM 推理LLM 输出的是标签、风险分、自然语言解释——把图当输入不等于用图约束输出,语义无法映射回程序节点就无法进一步检查
漏洞/修复配对分析PrimeVul 基准(Ding et al. 2025)、后续现实数据集研究用共享上下文、只差局部修复的配对样本检验模型是否响应风险变化比较预测差异只能说明模型「有没有反应」,不能解释补丁中哪处修改导致风险逆转

ObliVul 的定位结论:首个以单个告警为中心、把 LLM 恢复的安全语义锚定为结构化安全义务、并用双向反事实图干预验证其作用的框架。它在「告警验证」这个环节上同时接住了三族的短板。

2.2 Where Do the Tokens Go 在 Agent 效率谱系中的位置

第二篇论文站在两条研究线的交叉点上:

漏洞发现 Agent 一侧:RepoAudit(按需数据流分析 + 路径条件验证做仓库审计)、ACTaint(静态分析引导 agent 追污点链)、EnIGMA(交互式调试器辅助 CTF 漏洞挖掘)、PAgent(程序分析 + 执行反馈引导 PoC 生成)、PentestGPT(渗透测试的推理—生成—解析分工)。这些系统展示了对安全分析的不同组织方式,但评估各自的任务、环境、成功标准都不一样,没有一个回答「哪种干预针对漏洞挖掘的主要成本」。

Agent 效率一侧:AgentDiet(压缩轨迹历史)、Revelio(轻量模型生成并排序漏洞假设)、ADI(程序修复中用函数级执行痕迹替代细粒度调试器交互)、Agentless(固定流水线降本)、SWE-agent(接口设计先行)、AutoCodeRover(结构感知代码检索)。它们分别压缩历史、缩小搜索、改进反馈,但收益都局限于各自的程序修复或特定安全工作流。

本文的定位:第一个对漏洞挖掘 agent 做「token 去向 × 失败瓶颈」多轴编码诊断、并用诊断结论驱动接口设计(AVRI)的工作——先做归因,再对症下药,而不是先猜一个效率方法再试。

2.3 两篇合读的定位对照

维度ObliVulWhere Do the Tokens Go
链条位置检测端:判定函数/告警是否为真漏洞利用端:构造能触发崩溃的 PoC 输入
核心抽象安全义务(LSOG 图上的节点)不安全操作条件(BET 里带出处的连接)
双向机制加防护(T+)/ 删防护(T−)反事实干预前向输入传播 / 后向违例条件推导
LLM 角色语义恢复器(不直接下结论)被服务的主模型(AVRI 为其供给证据)
验证手段局部图干预后的风险重分析执行反馈(崩溃与否)

三、问题定义

3.1 ObliVul:把「告警真假」抽象为「义务—风险响应关系」

从具体场景出发:一个函数里有 100 条静态分析告警,哪些值得人工看?直接学「函数级是否漏洞」不行——漏洞版和修复版共享绝大部分代码结构,整体表示会给出相同预测。

ObliVul 的核心洞察是把问题分解成可检验的小单元:一条告警的真假,取决于若干安全义务是否被满足。于是问题被抽象为:

  • 给定:函数 F 及其 CPG、告警集合 A(F) = S_A(G_F),每条告警含规则类别、报告位置、危险操作、候选传播路径;
  • 求:每条告警的安全义务集合 O_i(含类型、程序锚点、条件、状态、极性、范围、置信度),以及函数级漏洞概率 p_F;
  • 约束:义务必须通过程序对应性检查(锚定到 CPG 节点/依赖边/路径,分为 accepted / partial / conflict / rejected 四种状态),验证必须在局部程序图上进行,测试时不使用配对的修复版本。

这个抽象的精妙之处:它把「漏洞判断」这个黑箱二分类,变成了「条件是否满足 + 条件是否作用于该路径」两个可分别检查的问题——就像把「病人有没有病」拆成「缺什么、补上会怎样、停掉会怎样」。

3.2 AVRI:把「降本」抽象为「证据连接的持久化」

第二篇的具体场景是:agent 反复读取源码片段,却难以把「harness 怎么消费输入」和「选中的操作在什么条件下不安全」连起来,每次失败都从头再来。

论文的抽象问题可以表述为:给定任务执行中的活动分布与失败瓶颈(实证部分求解),设计一个接口,使 agent 能够以更低成本建立并保持「输入处理 ↔ 不安全操作条件」的连接,且该连接可在上下文压缩后恢复、可区分派生事实与主观假设。约束是:不能改变 agent 的执行工具(构建、跑输入、看文件仍走原路),不能靠砍轮数硬省。

3.3 共同的深层结构

两个抽象在更深一层是同一个问题:漏洞的成立性存在于「源到汇」的连接条件中,而非代码的表面模式里。ObliVul 把这个连接叫安全义务,AVRI 把它叫带守卫的合成条件(combined condition)。识别出这一点,是两篇论文能互为镜像的根本原因。

四、问题解法

4.1 ObliVul:四段式流水线

第一段:告警驱动的局部证据提取(LEP)。把待分析函数解析成 CPG,跑预定义安全规则生成告警。然后以告警为中心做「关系驱动的局部投影」:从报告位置和危险操作出发,沿候选路径回收数据源、传播变量、跨过程调用关系,补上影响路径可达性的控制条件、可能压制风险的边界检查/净化操作/状态约束。投影在到达候选数据源、预设深度或过程间边界时停止。产出是局部程序图 G_i_local 加四个归一化关系视图(数据传播 X_data、控制约束 X_ctrl、调用传递 X_call、候选防护 X_protect),合称局部证据包 LEP。类比:不调全城监控,只调案发点半径五百米内的录像。

第二段:局部安全义务图构建(LSOG)。把告警信息和 LEP 一起喂给 LLM——注意,LLM 不直接输出告警是否成立的结论,而是生成候选安全义务集(风险源、危险操作、所需防护、无效防护、状态前置、关键依赖)。因为 LLM 的推断只是「局部上下文形成的语义假设」,可能有定位错误的实体、无依据的依赖,所以要做程序对应性检查:把候选义务里的变量、操作、条件映射到 CPG 节点或路径,验证数据/控制/调用依赖,判定防护范围是否覆盖危险路径。检查后每个义务带上七元组表示(type, anchor, condition, status, polarity, scope, confidence),其中 status ∈ {present, missing, partial, conflict}——present 可做反向验证,missing 可做正向验证。最后按局部 CPG 的数据传播、控制依赖、防护覆盖关系把义务组织成图,即 LSOG = (O_i, R_data, R_ctrl, R_protect)。

第三段:双向反事实图验证。这是全文最核心的机制。对 LSOG 中的义务编译出两类局部图干预:

  • 正向干预 T+:针对 missing / 无效的防护——在漏洞上下文中加上这条防护,重分析路径风险 q_i+。风险下降量 Δ+ = q_i − q_i+ 大,说明该义务真能切断当前危险路径。对应到配对样本:给漏洞版加上修复所隐含的义务。
  • 反向干预 T−:针对 present 的防护——在修复上下文中移除它,重分析风险 q_i−。风险上升量 Δ− = q_i− − q_i 大,说明该防护确实在限制危险路径。对应:从修复版删掉保护。

告警级验证分 v_i = αΔ+ + βΔ− + γA_i − ηC_i,其中 A_i 是干预路径与原始告警路径的一致性、C_i 是义务间冲突度。再用渐进选择提取最小支撑证据(minimal supporting evidence)——只保留真正引起主要风险变化的义务、位置、路径。类比医学验证:给药看病情缓解(正向)、停药看病情复发(反向),两个方向都吻合才能确认药效,而不是只看一次相关性。

论文用 PrimeVul 配对样本 CVE-2021-37681 走了一遍全流程:以 tensor->is_variable 为汇,正向验证给漏洞版补上缺失的 guard 后局部路径风险下降,反向验证从修复版移除该 guard 后风险复现——两个方向共同证明这个 guard 真实约束了原始告警路径。

第四段:验证感知的函数级推断(VAFI)。单个告警的验证不等于函数级结论。VAFI 把每个告警的局部 CPG 特征、LSOG 特征、原始风险、反事实验证结果、最小证据编码成统一的告警证据单元 h_i;用两个头分别估计告警风险强度 e_i 与语义可靠性 s_i,经验证感知注意力算出聚合权重 ω_i,再结合最强告警 h_max、告警均值 h_mean 和函数级锚定信息 z_F 输出漏洞概率 p_F。设计意图是建模告警间的互补与冗余:不同路径的有效告警共同支持结论,重复告警不因数量被放大。训练用七项联合损失(函数分类 + 语义一致性 + 告警一致性 + 排序 + 一致性 + 锚点 + 配对约束);配对信息只在训练时用,测试时对每个函数独立聚合。

4.2 AVRI:围绕证据轨迹的接口设计

第二篇的解法分实证与设计两半,实证放第五部分讲,这里讲 AVRI 本体。

核心数据结构:双向证据轨迹(Bidirectional Evidence Trace,BET)。它持久化地记录:输入值如何从 harness 传到程序操作、被选中的操作在什么条件下不安全、两者之间有哪些受分析支持的对应关系,以及 agent 自己的假设与未解决问题。三条设计纪律:证据锚定到源代码位置;派生事实与 agent 猜想分开标注(假设不是静态推导,静态推导不是观测到的崩溃);假设被撤回或记录被修改时保留历史并把受影响记录标记待审。

论文的运行例子值得完整复述,它展示了全部机制:harness 要求输入至少两字节,读长度 n = data[1],仅当 data[0] == 1 且 n ≤ size−2 时调用 copy_payload;被调函数把 n 字节拷进一个 8 字节缓冲。源长度检查保证了「够读」,却没有约束目的地。连接两端得到合成条件:data[0] = 1 且 8 < n ≤ size−2——光有超长 payload 不够,模式字节和长度检查也得放行。用普通读文件工具,agent 读完拷贝函数再读调用者,必须自己在两段输出的记忆里拼装这个关系;上下文一压缩就得重读。用 AVRI 的话,analyze 一次返回带守卫的合成条件及出处;上下文压缩后 bet view 直接恢复已保存的约束 n ≤ size−2 [harness.c:3],agent 立刻推出 11 字节候选输入(十六进制头 01 09 + 9 个 payload 字节),无需重读调用者。

四类接口命令(表 2):

用途接口返回信息
源码查询view(context/callers/uses/entry/search/files)有界的源码区域、候选位置、覆盖范围限制
聚焦检查read inspect声明、定义、引用、调用参数、参数相关条件
分析analyze(harness-model / sinks / backward)输入解释、候选操作、约束、未解析依赖
复用与纠正bet open/record/view;read evidenceBET 状态、修订、纠正、已存证据

双向分析算法(算法 1):前向从 harness 出发,建模受支持的字节读取、显式解码、光标移动和有限的输入提供者方法,记录表达式、调用参数、源位置与假设(例如「第二个无符号字节提供拷贝长度」);后向从选中的操作出发,从建模的不安全条件(如 n > 8 越界)沿定义、赋值、比较、直接调用回推;然后对每个候选做受支持的替换——把后向条件中的程序值换成前向记录的输入表达式,同时保留必须成立的守卫(guard)和未映射的值。合成条件 u8(data[1]) > 8 连同守卫 size ≥ 2、data[0] = 1、n ≤ size−2 一起保存,出处(Provenance)记录每步规则与假设。分析在未解析别名、间接调用、歧义宏处停下并显式报告缺口——AVRI 自我定位为接口而非全程序验证器,agent 仍用自己的执行工具测输入。

工程细节:源索引用 Universal Ctags 找候选符号、Tree-sitter 解析 C/C++ 结构;版本化 JSON 记录放只读源码目录外,锁 + 原子替换保护更新;源或依赖变了自动失效受影响结果但保留历史;「保存」与「展示给模型」解耦——内部复用不增加上下文 token,按需恢复才进入上下文;报告模式不附加工作状态,全模式才呈现进行中的记录。

4.3 全景对比

维度ObliVulAVRI
输入函数 CPG + 静态告警任务源码快照 + harness + agent 查询
核心表示LSOG(义务 + 三类关系)BET(前向/后向结果 + 连接 + 假设)
双向性T+ 加防护 / T− 删防护前向值追踪 / 后向条件回推
LLM 参与义务候选生成(受程序检查约束)主模型消费接口返回的证据
证据纪律四状态锚定检查 + 最小证据派生/猜想分标 + 出处 + 失效机制
最终输出函数级漏洞概率 + 告警级证据供 agent 构造输入的条件与守卫

五、评估指标与实验证据

5.1 ObliVul:两层指标 + 三组消融 + 行为分析

数据集:主实验用 PrimeVul pair-function(C/C++ 真实项目,保留漏洞/修复函数对应关系),预处理后训练/验证/测试 = 3,595 / 461 / 422 对;跨域实验用 LinuxVul(Vul-RAG 发布的 Linux 内核函数对数据集),CVE 不相交切分后 384 / 97 / 97 对。选 PrimeVul 的理由:两版来自同一修复提交,函数语义与调用上下文高度可比,差异集中在边界检查、数据净化、状态约束——正好考察模型对修复语义的敏感度。LLM 用 Qwen2.5-Coder-7B-Instruct,确定性贪心解码。

指标体系分两层:函数级分类(Acc / Pre / Recall / FPR / F1)考察「判得准不准」;配对状态诊断考察「认不认得修复」——P-C(两版都判对)、P-V(两版都判漏洞)、P-B(两版都判安全)、P-R(方向判反)、VPS(配对区分度汇总,越高越好)。VPS 是全文最有说服力的指标:它衡量的本质能力是「模型的风险判断是否随安全义务的变化而变化」,而非表面分类准确率。

主结果(PrimeVul 422 测试对):

方法AccPreRecallFPRF1
CodeBERT0.50000.50001.00001.00000.6667
LineVul0.65400.75390.45730.14930.5693
VulTriage(最强基线)0.63560.60000.81380.54250.6907
ObliVul0.73580.68460.87440.40280.7680
ObliVul @ LinuxVul0.89690.88890.90720.11340.8980

配对诊断上差距更悬殊:ObliVul P-C 59.72%、P-V 27.73%、P-B 0.00%、VPS 47.16%,对比 VulTriage 27.13%、LineVul 30.81%、CodeBERT 0.00%(后者 P-V 100%——把所有版本全判漏洞);LinuxVul 上 VPS 达 79.38%。注意论文的诚实标注:部分基线数字转引自 VulTriage 论文,各方法预处理与有效测试集规模不同,「提供性能参照而非严格同协议对比」。

消融三问(都在 422 对上算 VPS):

研究问题变体F1VPS说明
RQ1 语义结构A0 无结构语义0.66784.03%只有原始特征的基座
A1 CPG+LEP+告警0.696626.30%加局部证据即大涨
A3 完整 LSOG0.768047.16%义务状态/范围/依赖才是增量
RQ2 反事实B0 无反事实0.686811.37%
B1 仅前向0.68197.58%单方向反而更差
B2 直接双向0.68418.29%只有风险响应不够
B3 双向 w/o 最小证据0.703928.44%
B4 完整双向0.763745.73%风险响应必须配程序证据一致性
RQ3 聚合C0 均值池化0.707632.23%
C2 基础 VAFI0.736037.44%
C6 完整 VAFI0.768047.16%互补/冗余建模的增量

行为与可信度分析:概率校准(可靠性图 + ECE + Brier 分数,温度缩放在验证集拟合、测试集只应用)显示配对调整不破坏校准;Coverage–Risk 曲线显示预测置信度能把低错误率的判断排到前面——风险分可以作为审计优先级。配对反事实风险响应(表 7):修复使平均风险从 0.6120 降到 0.2511(Δ 平均 +0.3609、中位 +0.4545),64.9%(274/422)的配对呈正响应,Wilcoxon 符号秩检验 W = 52132、p < 0.001,rank-biserial 相关 0.747。真实世界验证:训练模型用于 Linux 内核告警优先级排序,配合人工审查定位 4 个真实缺陷,3 个补丁已被官方 Linux 仓库合入,1 个因需要物理机 PCI 测试仍在验证。

5.2 Where Do the Tokens Go:四问递进的实证 + 对照评估

语料与编码协议:200 条 CyberGym 轨迹 = 4 个 agent(Codex 用 GPT-5.5;OpenCode / Cybench / EnIGMA 用 DeepSeek-V4-Pro,便于固定模型比较脚手架)× 5 种配置(基线 + AgentDiet / Revelio / PAgent / CodeGraph 四个效率方法)× 10 个任务,共 32,924 轮请求。任务设定为 harness 级(Level 0:只给入口点;Level 1 另给漏洞描述),不提供漏洞机制描述、补丁或参考 PoC;每次运行 7,200 秒墙钟超时。成功以提交结果为准:至少一个输入使漏洞构建以非零非超时(非 300)状态退出;召回额外要求同一输入在修复构建上以 0 退出。活动编码用九类码(U 任务理解 / E 环境 / L 代码定位理解 / H 漏洞推理与触发设计 / C PoC 构造 / V 验证反馈 / O 交互协议 / A 方法辅助 / X 无法归因),两位作者独立标注 20 条试点轨迹 κ = 0.81,规则化自动标注后用 Codex 复查(3,128 个标签调整,L 的 token 份额从 55.8% 修正到 43.1%、H 从 4.8% 升到 17.3%),再做人盲审:比例抽样 94%(188/200)一致、边界案例 96%(96/100)。

RQ1(各 agent 多有效多贵,10 任务组):OpenCode 基线 100% 成功仅 $8.58;Cybench 50% 成功花 $49.34;EnIGMA 50% 花 $21.06。效率方法**不一致**:PAgent 让 Codex 成本 $21.43→$17.00 且成功 80%→100%,却让 EnIGMA 成功 50%→30%、成本升到 $23.22;四种方法让 OpenCode 成本全部上升 18–31% 且成功不变。没有任何方法在全部四个 agent 上降本保成功。

RQ2(token 花在哪、败在哪):200 条轨迹共消耗 776.60M token(辅助模型 54.53M,占 7.0%);每任务均值从 1.0M(Codex+AgentDiet)到 14.5M(EnIGMA+CodeGraph)。L 占 43.1% + H 占 17.3% = 60.4%(各 agent 合计份额 44%–71%)。67 条失败轨迹的瓶颈归因(每条 1 单位权重均分给有证据支持的类别):H 27.0 单位(40.3%)居首、L 19.0 单位(28.4%),合计 68.7%;环境 11.0;工具调用 + PoC 构造 + 验证迭代 + 目标停止合计只有 10.0 单位。另一发现:38 条从未出现 PoC 执行反馈的轨迹全部失败(Cybench 17、EnIGMA 17、Codex 4、OpenCode 0)。

RQ3(现有方法为什么不行):160 个配对比较中仅 39 对(24.4%) 保成功且降成本。机制编码:unsuitable signal(方法返回的信息不解决当前不确定性)59 对最频——Revelio 的排位假设可能指向另一个缺陷或缺少构造触发器所需的约束(OpenCode 10 对中 7 对、Cybench 10 对、EnIGMA 8 对);access/use limitation 38 对;辅助开销反转 7 对——Codex+Revelio 主模型成本只有基线 0.61× 但预处理把总成本推到 1.15×。

RQ4(AVRI 是否降本不伤效果,20 个新任务):

Agent(模型)方法成功率召回时间(s)成本(USD)
Codex(GPT-5.5)基线85%65%50,968132.65
AgentDiet80%60%53,244176.67
PAgent85%60%54,846186.73
AVRI85%75%33,313108.75
OpenCode(DeepSeek-V4.1-Flash)基线100%90%25,3244.38
Revelio100%85%28,4075.47
AVRI100%90%24,0173.34

Codex 上 AVRI 降成本 18.0%、降时间 34.6%,成功率持平、召回 +10pp;OpenCode 上降成本 23.7%,两项指标持平。两组均为全部配置中成本最低、时间最短。论文同时诚实列出边界:每配置每任务只跑一次,无法区分方法效应与运行方差;没有组件级消融。

六、效果优势的根源解释

6.1 ObliVul:为什么锚定 + 双向干预能翻倍 VPS

baseline 为什么曾经有效又为何失效:CodeBERT / LineVul / VulTriage 等学习式方法靠词法、语法、上下文模式识别风险线索——它们有效是因为真实漏洞确实伴随可学习的表面模式;但配对样本只差局部防护修改,两版共享绝大多数结构与危险操作,依赖整体函数表示的方法对两版给出相同预测(P-V 高企、VPS 崩塌的机制根源:模式存在 ≠ 漏洞成立,缺口在「防护语义」上)。【论文实验已支持:CodeBERT P-V 100%、VPS 0%】

因果链(每步标注证据等级):

  1. 方法差异:LLM 只生成义务候选、不判真假,且所有候选必须过程序对应性检查 → 机制变化:语义假设要么锚定到具体节点/边/路径,要么标为 conflict/rejected——不可检查的自然语言输出被改造成结构化、可干预的对象 →【论文实验已支持:RQ1 消融 A2→A3,义务的状态/范围/依赖表示带来 VPS 27.49%→47.16% 的主体增量】
  2. 方法差异:双向反事实(T+ / T−)+ 路径一致性 + 最小证据 → 机制变化:一条义务与告警的关系不再是「模型说有关」,而是「动了它、风险真的按预测方向变化,且变化发生在同一条路径上」——相关性被升级为局部因果响应 →【论文实验已支持:B1 仅前向 7.58% 反而低于 B0 11.37%,B4 完整机制 45.73%;说明单看风险响应不够,必须配程序证据一致性】
  3. 机制变化 → 指标提升:模型同时具备漏洞识别与修复识别能力 → 固定版不再持续报警 →【论文实验已支持:P-B 0.00%、风险响应 64.9% 正响应、Wilcoxon p<0.001】

反事实推理:去掉程序锚定(A0)VPS 从 47.16% 掉到 4.03%;去掉双向验证与最小证据(B0)掉到 11.37%——两个组件各自都是数量级贡献。

6.2 AVRI:为什么持久化连接能同时降本提召回

baseline 为什么失效:四个效率方法分别压历史(AgentDiet)、供假设(Revelio)、给覆盖反馈(PAgent)、建导航图(CodeGraph),但 RQ2 证明主要瓶颈在 L/H——agent 需要的是「输入→违例条件」的连接本身,这些方法都不供给它:假设排位可能指向别的缺陷(unsuitable signal 59 对),覆盖反馈说明执行到哪却不能纠正关于根因的假设(PAgent access/use limitation 7–10 对/组),图查询返回桩节点与不相关片段仍需二次读源。压缩历史的方法还有辅助开销反转。【论文实验已支持】

因果链:

  1. 方法差异:先实证归因(60.4% / 68.7%)再设计 → 机制变化:干预点从「上下文长度/导航信号」移到「证据连接的建立与保持成本」——analyze 一次返回带守卫的合成条件(省掉跨函数拼装),read 返回关联代码块(免二次读取),BET 在压缩后可恢复(免重复重建) →【论文机制描述 + 运行例演示;组件级贡献未消融,属论文自述】
  2. 机制变化 → 指标提升:重复读取与重建的 token 被证据复用替代 → 总成本 −18.0% / −23.7%;触发条件解析质量提升 → Codex 召回 +10pp →【论文实验已支持:表 3;但单次运行,方差未估计,论文自认】

6.3 相关工作检索与对照

本节对照基于两篇论文原文的参考文献与关联工作章节(文中给出了可核验出处),本次撰写未执行独立的额外外部检索,证据边界如实标注如下:

研究(可核验出处)与本文的相似尝试相关结论对根源解释的影响
LLMxCPG(USENIX Security 2025,ObliVul 引文 [26])用 CPG 引导 LLM 注意漏洞相关结构把图当输入 ≠ 用图约束输出支持:佐证 ObliVul「锚定输出」的差异化定位
IRIS / Vul-RAG(ObliVul 引文 [23][24])LLM + 静态分析 / 检索漏洞知识增强推理输出仍是标签/解释,难以程序化核查补充:说明「语义不可检查」是谱系性缺口
CLEAR(arXiv:2608.03134,ObliVul 表 3 对比)因果上下文 agent 推理做漏洞检测P-C 19.17%、VPS 10.62%,弱于 ObliVul限定:同为因果路线但无义务锚定,效果差一个量级
ADI(FSE 2026,Tokens 引文 [20])程序修复中用函数级痕迹替代调试器交互接口层重设计显著降交互开销支持:相近结论(接口优于细粒度交互),不同任务域
Agentless(FSE 2025,Tokens 引文 [19])固定流水线降本不依赖自主动作选择也能低开销限定:说明降本路线不止一条,但未覆盖漏洞发现场景
SWE-agent(NeurIPS 2024,Tokens 引文 [22])面向 agent 需求设计接口命令接口设计影响成功率与效率支持:AVRI 是该思想在安全域的延伸

6.4 综合判断与未决问题

多研究共同支持的机制:「把 LLM 语义输出锚定到可检验结构」——ObliVul 的消融(A0→A3)与 LLMxCPG / IRIS 一系的对比共同指向这一点;「接口层供给结构化证据优于压缩或追加信号」——AVRI 与 ADI / SWE-agent 在不同任务域得出一致结论。仍属推测的部分:AVRI 召回 +10pp 归因于触发条件解析质量提升,属机制推演(无组件消融);ObliVul 中 VAFI 注意力的互补/冗余建模细节(C2→C6 的增量)同样只有端到端证据。适用条件:ObliVul 依赖 LLM 语义恢复能力与局部 CPG 质量(论文自述),对比协议非严格同口径;AVRI 的收益依赖 harness 已固定、分析区域有界的前提(论文自述「load bearing」),迁移到开放式攻击面发现未验证,且 C/C++ 内存安全缺陷比托管语言的逻辑缺陷更契合约束原子。可能的失效条件:修复涉及多处耦合修改时路径一致性可能误判;每配置单次运行下,小幅成本差异可能混入运行方差。

6.5 补充:为什么「花钱多」不等于「效果好」

RQ1 里还有一个值得单独拎出的发现:更高花费并不一致地带来更好结果。OpenCode 基线 100% 成功只花 $8.58,Cybench 50% 成功却花 $49.34——差近 6 倍的成本换来更差的效果。论文的机制解释是脚手架差异:Cybench 与 EnIGMA 采用简单历史截断,可能丢弃有用上下文、迫使重复分析,而 OpenCode 的参数 schema 拒绝机制与有效上下文缓存减少了无效轮次(论文也诚实标注:聚合结果未隔离这些设计效应)。这提示一个工程直觉:agent 的成本上限往往由接口决定,而非模型能力决定——这与 AVRI 后来的成功(改接口而非换模型)在逻辑上首尾呼应。此解释属论文的观察性推断,非受控实验结论。

七、必要知识反推

假设一个零知识的人要完成这两项工作,最少需要知道什么?

领域知识层:漏洞学的源—汇—防护模型(外部输入如何到达危险操作、什么条件阻止它);静态分析的保守近似为何产生海量告警;CPG 四种关系的统一表示与查询。不理解这些,就无法把「告警真假」翻译成「义务满足性」这个可检验问题——ObliVul 的全部形式化都建立在上面。

方法论知识层:反事实推断的逻辑(干预—响应—一致性),及其在程序图上的可实现形式(加/删防护 + 风险重分析);LLM 输出的不可靠性与「生成—校验」范式(LLM 提候选、程序分析做裁决);配对实验设计思想(控制上下文、只暴露修复差异——两篇论文都用了:PrimeVul 的漏洞/修复对、AVRI 的同 agent 同任务配对比较);开放编码实证方法(码本、双标注、κ 一致性、盲审——第二篇的方法学骨架)。

工程知识层:CPG 构建、告警规则、局部投影的深度/路径预算控制;BET 的版本化存储、原子替换、依赖失效;attention 聚合与多任务损失的训练稳定性;token 计量与提供商账单对账(cached input 计一次、辅助模型分开记账)。

知识融合的关键节点:三个化学反应点。其一,ObliVul 把「LLM 会读代码」与「CPG 可查询」在义务锚定这一点上融合——单独任何一方都不构成贡献:LLM 单独输出不可检查,CPG 单独没有安全语义。其二,把流行于因果推断的反事实思维翻译成图干预 + 风险重分析的可执行操作,且坚持双向(B1 消融证明单向反而有害)。其三,第二篇把实证诊断与接口设计闭环——先量化 60.4%/68.7% 的瓶颈分布,再让 BET 的每个设计决策对应一个观测到的浪费模式;没有归因的接口设计只是猜。

八、论文中可以提取的通用性灵感

灵感一:生成必须落锚,否则不可信。 核心思想:概率模型的语义输出(标签、解释、假设)只有被锚定到可检验的结构上(图节点、源位置、可执行检查),才能进入验证管线。论文证据:ObliVul 消融 A0(无结构语义)VPS 4.03% vs A3(完整锚定)47.16%。推广场景:医疗诊断中把 LLM 推断锚定到检验指标与病历字段;法律科技中把结论锚定到条款编号与证据页码;数据分析 agent 中把洞察锚定到查询语句与数据单元格;RAG 系统中把摘要锚定到原文 chunk 的确定性引用。

灵感二:双向验证强于单向确认。 核心思想:验证一个因果关系的两个方向——补上缺失因子看效果消失、移除现存因子看效果复现——比任何单方向都强。论文证据:B1 仅前向验证 VPS 7.58%,反而低于不验证的 11.37%;完整双向 + 最小证据达 45.73%。推广场景:A/B 测试之外加「回滚组」确认效果真的由改动引起;配置项调优中同时做「加配置」与「删配置」实验;团队管理中检验某流程的价值时先加后撤;特征选择中用双向扰动估计特征真实贡献。

灵感三:先做成本归因,再做降本设计。 核心思想:优化任何昂贵流程前,先量化「预算花在哪、失败卡在哪」,让干预对准主要瓶颈而非直觉痛点。论文证据:L+H 占 60.4% token 与 68.7% 失败权重,而针对它们设计的 AVRI 是唯一双 agent 降本保成功的配置;四个未对准瓶颈的方法 76% 的配对无法保成功降本。推广场景:CI 流水线优化前先统计各阶段耗时分布;客服系统先归因转人工的原因再做自动化;个人时间管理先记录时间去向再砍项;模型推理优化先做算子级 profile 再改架构。

灵感四:持久化的证据轨迹胜过上下文记忆。 核心思想:跨轮次工作流中,把关键中间结论存为带出处、可恢复、可纠错的外部记录,比依赖对话历史更便宜也更可靠。论文证据:38 条无 PoC 反馈的轨迹全部失败;BET 在压缩后恢复守卫条件支撑 11 字节输入构造,总成本 −18%/−23.7%。推广场景:长程科研 agent 维护实验证据台账;多轮合同审查中持久化条款依赖图;机器人任务中保存已验证的世界状态约束;代码评审工具记录已确认的问题清单避免重复分析。

灵感五:区分派生事实与主观假设。 核心思想:知识库里每条记录都应标注它是「有依据推导出来的」还是「agent 猜的」,两者的信任与失效规则不同。论文证据:BET 把静态推导、agent 假设、执行观测分标,撤回假设保留历史并标记受影响记录;ObliVul 的义务置信度是语义清晰度、锚定对齐、路径覆盖等联合导出的结构化指标而非 LLM 自报概率。推广场景:情报分析中区分观测与推断;医疗决策支持中区分检验值与医生印象;多 agent 系统的消息溯源;自动驾驶中区分传感器融合结果与预测。

两篇论文放在一天读,像看同一枚硬币的两面:ObliVul 证明「验证告警」这件事可以被结构化为双向反事实推理,AVRI 证明「付得起验证的成本」这件事可以被证据持久化解决。当漏洞挖掘同时拿到这两件工具——便宜的验证、可负担的账本——自动化安全的经济学边界才算真正被推动了一格。