Last Secure Code Benchmark: Is the Code You Vibe Secure?
Tianyi Wu, Chao Ge, Peng Chen, Fengji Zhang, Yongxing Wu, Yuchong Xie, Jian Li, Chaoyuan Peng, Kaikai Zhang, Dong Huang, Mingzhe Du, Yukai Huang, Jiaheng Zhang, Terry Yue Zhuo, See-Kiong Ng
cs.CR, cs.AI
2026-10-10
150 个真实漏洞切成 450 个任务、7 种语言,六大前沿 agent 功能通过率 73.6%~91.3%,既功能又安全的最高仅 25.1%。
Vibe coding(用户只说功能,实现全交给 agent)已是常见开发方式,论文引用的调查里 75% 受访者在用、90% 满意,新手是重度用户。麻烦在于需求几乎不会写「防路径穿越」这类话,安全决策由 agent 隐式做出,用户只验收功能,明文存 API key、认证形同虚设的 agent 代码被利用已有公开案例。功能测试也抓不住:导入器能处理好所有正常压缩包,同时放行恶意构造的包写穿目录。已有安全代码基准各缺一角,有的只测函数级补全,有的只覆盖两三种语言,CWE Top 25 覆盖最多的也只有 16/25。
LSCBench 用 150 个真实漏洞场景做底料:115 个来自公开 CVE,35 个 Java 场景由五位三年以上经验的安全专家从公司代码库手工构造。每个场景切成三个粒度的独立任务,共 450 个。Function 只挖掉补丁涉及的最小完整函数;File 删掉整个源文件重写;Repo 清空声明的源码范围(上限 8000 行、50 个文件),保留调用方和构建系统当底座。
规格书只描述功能,对漏洞和修法保持中立,精确复刻 vibe coding 的条件。评分靠隐藏的功能与安全两套测试,安全测试从外部入口回放 PoC 攻击、观察运行行为。构造质量控制很硬:上游 CVE-Factory 的测试查的是源码文本,加对注释就能骗过,于是两套测试全部重写;把补丁行贴成注释的「叙述版候选」必须挂掉安全测试;参考解全过、空解全挂,450 个任务全部通过这两道门。六个前沿 agent 在 Harbor 框架下跑 pass@1,无网络、500 轮上限、无人参与。
| 模型 | 功能通过 | 功能且安全 |
| Claude Fable 5 | 91.1% | 25.1% |
| GPT-5.6-Sol | 89.1% | 24.7% |
| Qwen3.8-Max | 89.3% | 22.0% |
| GLM-5.3 | 87.1% | 21.3% |
| DeepSeek-V4-Pro | 73.6% | 18.0% |
| Kimi-K3 | 91.3% | 16.4% |
两列之间的大缺口就是「能用但带洞」的代码:用户测试通过就收货,漏洞随之上线,流程里没有任何环节报警。更严的口径下,最好的模型也只在 12% 的场景上三个粒度全部安全,单粒度做对推不出真懂这个漏洞。六个模型合力覆盖 44% 的任务,252 个(56%)没有任何模型做安全。
几个反直觉发现:
失败模式每家不同(专家审计 120 条轨迹):Kimi-K3 把功能契约当穷尽清单,自测出异常还辩解「测试太严」;GPT-5.6-Sol 凭记忆复刻上游实现连漏洞一起搬回;Claude Fable 5 逐字复现最多,还因内容安全拒答丢分;DeepSeek-V4-Pro 编译不过就归咎环境直接交卷。一个案例很能说明问题:同一条命令注入任务,规格书只说命令要做什么,四个模型把参数按列表传给 ProcessBuilder 而过关,两个模型拼成字符串走 sh -c,功能分一样,注入洞大开。
对每天用 agent 写代码的人,这篇给了量化底线:功能测试通过不等于能上线,最强模型四分之三的任务带洞交付。两个立刻能用的动作:任务里加一句安全提醒,白拿 15 到 21 个点;让第二个模型复查,各模型做安全的任务集互补,四家非头部模型合计还能补上 36 个两家头部都没做安全的任务。对训练侧,「安全是下笔时的选择」指向端到端训练:实现、自写测试验安全、再修补。
论文自己承认的:Qwen3.8-Max 既写测试和规格书又参加考试,作者以成绩居中论证无红利,利益重叠仍在;35 个 Java 场景取自专家所在公司代码库,选择偏差排不掉;提醒实验只跑了四个模型,Claude Fable 5 缺席。读下来另有两处:pass@1 加无网络,排除了真实 agent 搜索查文档的能力,线上成绩可能更好;安全测试只回放特定 PoC,不等于穷尽漏洞的所有变体。覆盖了 21/25 的 CWE Top 25,标题里的「Last」更像姿态。120 条轨迹的定性归因样本不大,给单模型贴的行为标签参考即可。