15个补丁通过了漏洞利用判据,被功能判据拦下来了。这15个如果放进现存大多数漏洞修复基准里,已经算“已验证”。Vul4Py这篇论文把“修完了”从一句话拆成了两句:漏洞利用还跑不跑得通,项目原有的测试还过不过得去。两句都得是“是”。
测试范围先划一下:不说那六种修复方法谁强谁弱,只拆它的验收设计,和这套设计在100个真实漏洞上筛出来的几组数字。论文8月1号挂上arXiv,编号2608.00692。
漏洞修复基准不缺,缺的是能定义清楚“修好了”的基准。现在常见两种做法:只看exploit能不能重新触发,能跑通算没修,跑不通算修好;或者只对碰巧附带了功能测试的那部分实例验一下,剩下没附带的默认没问题。
单看exploit的问题是:exploit只是你自己构造的一条攻击路径。路径断了,和漏洞本体被处理干净,是两个不总是相等的命题。举一个很常见的假修:为了堵一条路径,直接把函数入口return了。exploit是跑不动了,但这个函数本来负责的逻辑也一起堵死了。exploit判据不觉得这是错,因为它的职责只是看洞有没有被堵上;功能判据会觉得这是错,因为项目原有的pytest当场挂住。这就是配对判据的含义。
只在子集上验功能是另一种偷懒:没附带功能测试的那部分漏洞,默认修完就好。一份基准里有多少实例躺在这个默认可信区里,文档往往不告诉你。
Vul4Py把验收强制改成了配对。每个实例两个判据,缺一个不算修好:利用判据要求有漏洞的代码上exploit必须触发得起来,到已修复代码上同一个exploit必须跑不动;功能判据跑的是项目原生pytest,两种状态下都得通过。
这个设计不自动信任任何一边。exploit判据管住“你修的根本不是那个洞”,功能判据管住“洞堵上了但别的东西也堵了”。
而且功能判据用的是项目原生pytest,不是论文作者为这100个漏洞新写的测试。这一点容易被低估。原生测试是项目自己的验收标准,在论文介入之前就存在。拿它当判据,等于说:修法随便你长什么样,功能不能打折扣。这天然规避了“按某种方法的输出习惯出题”的污染,也不偏向任何一种补丁生成策略。
先上数字。六种自动修复方法,分三类:专门的漏洞修复工具、直接提示的大模型、软件工程智能体,同一个基础模型。模型变量被锁死,剩下的变量只是管线形状。
专门漏洞修复工具修好2个,直接提示的大模型里最强的修好4个,OpenHands这类智能体修好41个。同一棵模型上长出来的2/4/41,差距超过一个数量级。
单看这三个数是裸数字,不能直接信。论文补了验收口径:104个被接受的补丁里,98个经人工确认与开发者原始补丁语义等价。94.2%的语义等价率,让41有了点分量——它不只是过了测试,它和人在真实世界里的修法对得上号,不是绕道避开测试的那种“等价”。
但比41更值得多看两眼的,是15。15个仅凭利用判据会通过的补丁,被配对判据拦下。“仅凭利用判据会通过”的意思是,在只验exploit的基准里,它们会被记成修复成功。加上功能判据之后打回。按104做分母大约七分之一,严格说两组口径不完全一样,但这个数量级摆在这——每七个单靠exploit就能过关的候选里,就有一个在功能判据下翻出来。
为什么同一棵模型,换管线之后差距能拉到十倍?能解释这个差距的只有一个变量:管线形状。判据一收紧,“会自己验证输出”的管线优势会被放大。直接提示模型的流程是:收指令,吐一个补丁,结束,没有机会自己跑测试、看失败输出、迭代。专门修复工具也差不多,倾向生成一个最像修复的diff,然后停手。OpenHands这类闭环里多了一个其他工具没有的环节:它能把补丁跑起来,看着pytest的输出自己改,再跑一次。这个循环恰好和Vul4Py的配对判据咬合。判据是软的,坏补丁混得过去;判据是硬的,少一个闭环立刻现形。
不是Agent天生更强,是严判据把“会不会主动验证”这条管线差异,变成了一个可测量的数字。宽松判据下这个差异会淹没在假阳性里——反正假修也能过,真修和假修的分差拉不开。
先记一笔担忧:功能判据绑在项目原生pytest上,会不会让恰好挑了测试工程做得好的项目的模型占便宜——覆盖少的项目,假修更容易混过,从而拉高某些方法的分数。100个实例来自60个开源项目、60个CWE,时间跨2017到2025,至少不是特意挑了测试健全的明星项目来迁就。但这个分布放在分数尺上有没有偏袒,论文没有专门分析。这条记下了,等环境放出来再说。
论文还有个缺口:没有贴重复跑测的数据。41个修复是跑了几次的最好值,还是单次运行?跨随机种子改个温度,方差能跑到多少?这类评测最怕的不是单次数字难看,是单次数字好看——真实能力没到那儿,换个时间复现就崩了。这个问题论文没答,我按“没测到”处理。它不影响配对判据的设计,但让41的置信度从“高”掉到“中等”。
论文说每个实例都附带固定且可复现的环境。比41这个数字本身值钱的是这句话——一个基准能在别人机器上原样跑起来,它的每张表就从“声称”变成了“可复核”。评测圈经常把注意力放在谁赢了上,真正长久有用的是那套环境:它把“修好了”变成一份可执行的定义,而不是写在pdf里的形容词。这个念头开个头,不展开了。
置信标签:方向大致对。“验收判据的严苛程度会直接改变修复工具排名的形状”这句话,在这份数据里站得住;但“软件工程智能体比直接提示高一个数量级”这个结论,样本只有一组数字、一个基座模型、方差未知,我不把话说满。谁有环境把Vul4Py原样跑一遍,数字对不上,拿原始日志来找我。
