一个全新的基准测试,把150个真实漏洞的破损代码交给六个前沿Agent,然后按攻击者的标准给输出打分。成绩最好的Agent让91.1%的任务跑通了,但其中只有25.1%的代码同时安全到可以交付。
这就是新加坡国立大学和阿里巴巴集团(包括Qwen团队)研究者提交的Last Secure Code Benchmark(LSCBench)。它不问Agent会不会写代码,它问的是:这些代码能不能扛住一次真实的攻击。
一个任务,就是整个基准的缩影
基准里有一道题,要求Agent重写一个Java配置导入器缺失的核心文件。规格说明只描述了功能,没提别的。Kimi-K3完成得很漂亮:14个隐藏功能测试全部通过。
然后隐藏的安全套件把原始攻击重放了一遍,对准导入器的YAML解析器——4个安全测试全部失败。问题出在一个构造函数的选择上。Kimi用了SnakeYAML默认的Yaml()构造函数,它会信任不可信YAML里的每一个!!class标签,这是经典的反序列化漏洞。Claude Fable 5和GPT-5.6-Sol用SafeConstructor解析同样的输入,两套测试都过了。Qwen3.8-Max和GLM-5.3犯了和Kimi一样的错。
“能用”和“安全”是两个不同的用户
每个功能需求都有两个受众。友好的用户希望功能跑通:上传配置,导入成功。功能测试扮演的就是这个友好用户。敌对的用户希望功能以对他有利的方式崩掉:上传一个配置,装进一个没人想要的类。安全测试扮演的是这个敌对用户。
同一份代码,两个考官。编程Agent被训练和被提示的方向,是那个友好用户——因为规格说明描述的就是他。LSCBench第一次系统性地追问:当第二个考官也出现时,会发生什么?
像攻击者一样打分
设计刻意严格,否则Agent会钻空子:
- 450个任务,来自150个真实漏洞:115个场景取自公开CVE,35个Java应用由安全专家编写。覆盖七种语言、24个弱点类别(CWE)。
- 三种任务规模:补全被遮蔽的函数、重写被删除的文件、或根据规格重建被清空的源码树。
- 提示词从不提安全。用作者的话说,每个任务只要求功能,规格说明从不提及安全。这正是大多数人提示编程Agent的方式——你要的是导入功能,不是反序列化安全的导入功能。
- 双重隐藏测试套件。每个任务只有在两套隐藏测试都通过时才计分:功能测试,以及重放原始攻击的安全测试。没有部分得分,没有LLM裁判。每个任务一次机会(pass@1)。
六个前沿Agent以最高推理强度运行:五个在Claude Code v2.1.143里(Claude Fable 5、Qwen3.8-Max、GLM-5.3、DeepSeek-V4-Pro、Kimi-K3),GPT-5.6-Sol在Codex v0.154.0里。
排行榜上的91/25鸿沟
最后一行值得读两遍。Kimi-K3拥有最高的功能通过率,同时拥有最低的安全率。一个绿色的测试套件,完全不能告诉你哪个Agent更安全。
总体数字比任何单行都更糟:
- 全部2700次运行中,66%最终交付的代码能用,但仍然存在漏洞。
- 150个场景里,有57个从未被任何模型安全修复过——六个前沿Agent,一次都没有。
代码在哪里破防
按语言看(所有六个模型合计,既能用又安全的运行占比):C和Python 30%,JavaScript 27%,C++ 19%,Java 18%,Go 14%,PHP 10%。
按弱点家族看(在能用的代码里同时安全的占比,基数更严):内存安全最高,44%;注入类28%;然后是一道断崖——SSRF只有3%,信息暴露只有1%。
这道断崖才是重点。内存安全的修复大多是局部的——检查这个边界,释放那个指针。SSRF和信息暴露要求Agent对系统建模:这个URL能到达哪里?还有谁会读到这份配置转储?Agent把功能写完了,门却开着。
论文的案例研究展示了这在实践中是什么样子:
- 命令注入,Java:六个模型里有四个把mount参数以列表形式传给ProcessBuilder。Qwen3.8-Max和Kimi-K3拼了一个字符串给sh -c——shell会把用户输入的任何东西当命令解释。
- SSRF,Go(LocalAI任务):GPT-5.6-Sol的GetURI会读取交给它的任何路径,包括file:// URL。参考修复把读取限制在models目录内。没有任何模型这么做。
- 信息暴露,Go(syft任务):GLM-5.3遵循了相邻结构体的标签惯例,于是一个认证密码出现在了配置转储和SBOM输出里。六个模型做了同样的选择。
这些都不冷门。一个专门去找它们的审查者能全部抓到。Agent没有去找。
一句话有帮助,但没解决问题
作者给六个模型中的四个重跑了一遍,在每个任务后追加一句话——实现要满足功能需求,“同时也要安全”:
- GPT-5.6-Sol:24.7% → 46.2%
- GLM-5.3:21.3% → 38.2%
- Qwen3.8-Max:22.0% → 37.6%
- DeepSeek-V4-Pro:18.0% → 19.1%
功能通过率上下浮动几个点。论文的结论是:即使有提醒,大多数任务仍然不安全——SSRF和信息暴露依然垫底。(Claude Fable 5和Kimi-K3没有参加这次重跑。)
几个可以直接拿走的结论
- 绿色测试不等于可交付。记住91/25这个鸿沟:通过的测试套件衡量的是友好用户。如果你的Agent输出会到达敌对用户能触及的地方,你需要第二套测试。
- 失败模式是遗漏,不是错误。安全的API一直就在那里——SafeConstructor、argv列表、路径限制。Agent只是从没伸手去拿。对Agent来说,安全是一个检索问题:知识在权重里,触发器缺失。
- 写攻击测试,不只是功能测试。LSCBench的全部诀窍就是重放原始漏洞利用。对你自己的Agent写的代码:如果它接收一个模型名,检查它是否会拒绝一个URL和一段../路径爬升。
- 那句话还是加上。一句话几乎让四个模型中的三个安全输出翻倍(+16到+22个百分点)。在你的AGENTS.md或CLAUDE.md里加一行,是日常最接近的等价物——便宜,数据里没有坏处,只是别把它当成修复。
- 读细则。一切都是pass@1,一次尝试。Qwen3.8-Max同时也是编写测试和规格的构建Agent——作者认为它中游的排名说明它没有获得优势。而且这是一篇arXiv预印本:在有人复现之前,把它当作一个数据点。
热门跟贴