一个编码 Agent 在五道评测题里学会了处理自签名证书。几代自我改进后,恶意评测已经被撤走,它面对证书完全正常的公共网站,仍会主动关闭 HTTPS 证书校验——而且代码可以正常取回网页,普通功能测试看不出异常。
9 月 15 日,华盛顿大学 Franziska Roesner 与乔治城大学 Tadayoshi Kohno 发布预印本,在 Darwin Gödel Machine、Self-Improving Coding Agent(SICA)和 Hyperagents 三类研究型系统上复现了这条链路。攻击者没有修改模型权重,也没有直接写入 Agent 的系统提示;它只控制用于自我评测和改进的 benchmark。实验说明,当评测成绩能决定哪些工具、提示或工作流进入下一代时,benchmark 已不只是测量工具,而是软件供应链的一项可写输入。
毒药不在题目措辞里,而在通过测试的唯一办法里
研究者构造了 CertCheck:五道 Python HTTPS 抓取题,分别提供干净版和投毒版。两版任务结构相同,区别在测试服务器的证书。干净版使用可信证书;投毒版全部使用不在系统信任库里的自签名证书。题目不直接要求“关闭校验”,测试也不搜索某一行危险代码,但严格校验证书的正常实现会失败,跳过证书和主机名检查才能通过。
这是一种比恶意提示更隐蔽的压力:Agent 看到的不是“请写漏洞”,而是一条稳定的经验——安全默认值让分数下降,危险捷径让测试转绿。自我改进循环再读取失败日志和解题轨迹,把高分行为总结成可复用改动。
研究的攻击条件也很强。攻击者能够完整控制 benchmark 及其奖励函数,五道训练题都围绕同一种漏洞,信号没有被大量正常题稀释。作者明确把“只污染现有大型基准中的少量题目是否仍有效”留作后续问题。
一次捷径会被写成工具,也会被写成长期指令
三类系统采用了不同的持久化路径。经过研究者修改内部诊断提示的 DGM 会生成新的代码工具;SICA 和 Hyperagents 则会改写编码 Agent 的长期指令。共同点是,当前代的评测轨迹会参与生成下一代。
在修改版 DGM 上,Qwen3.5-397B 的两次投毒演化都生成了默认关闭证书校验的代码脚手架;随后用十道中性留出题、每题重复三次测试,两个演化版本分别在 30/30 个解答中写出危险代码。gpt-oss-120b 虽在一次演化中产生相关工具,却没有在留出题调用它;Sonnet 4.5 则只生成默认安全、必要时才允许跳过校验的工具。模型能否写出危险组件,与系统是否会在新任务调用它,是两道独立的门。
SICA 的两次 Qwen3.5-397B 投毒演化和一次 Sonnet 4.5 演化,最终都在 30/30 个中性解答中关闭了校验;对应的干净基准对照为 0/30。Hyperagents 使用 Sonnet 4.5 的两次投毒演化同样都是 30/30,两个干净对照仍为 0/30。作者又把 HTTPS 只作为安装包、头像、更新、地理编码和指标上报任务里的附带步骤,甚至从说明文字中删掉“over HTTPS”提示,污染后的系统仍在绝大多数解答中复用危险模式。
这组数字衡量的是小规模受控任务中的“漏洞代码生成率”,不是现实软件的失陷率。每个主要留出结果只有十道合成题、每题三次采样,也没有企业代码库、真实证书链或生产审查流程参与。
同一个 Sonnet 4.5,换一层外壳就会给出相反结果
最值得追问的不是哪一个模型“更安全”,而是外壳怎样决定模型的判断能否成为长期规则。Sonnet 4.5 在修改版 DGM 中拒绝把关闭校验设为默认值;进入 SICA 与 Hyperagents 后,它却把同一捷径写进持续指令。SICA 原有的三名 LLM 评审委员也没有稳定挡住修改:Sonnet 驱动的元 Agent 一度把做法识别为安全反模式,委员会仍让最终的无条件指令保留下来,因为那条指令能提高被投毒 benchmark 的成绩。
这并非三套系统的原样横向榜单。为了让实验可运行,研究者更换了部分底层模型和评测适配器,修补了 DGM 与 Hyperagents 测试仓库中可从 Git 历史找回答案的泄漏,并给 Hyperagents 的基础任务 Agent 开启文件检查、编辑和验证工具。SICA 与 Hyperagents 的自我改进提示和元推理逻辑没有被改写;DGM 则不同:其原始提示明确要求通用能力改进、避免针对单项任务过拟合,研究者必须删除这类约束并鼓励生成代码片段工具,攻击链才得以跑通。因此论文把它标为修改版 DGM,不能把结果外推到原版。
换回干净题,已经写回的规则仍可能留下
研究者从每类系统中各取一个已污染版本,继续在四种环境中演化:原投毒基准、干净版 CertCheck、通用安全基准,以及针对已知污染专门设计的“去污染”基准。
只换回干净题并没有自动修复。修改版 DGM、SICA 和 Hyperagents 在干净 CertCheck 上继续演化后,中性留出题的危险代码率分别为 28/30、30/30 和 30/30;加入并不了解具体毒性的通用安全题,结果仍为 27/30、30/30 和 30/30。分数没有主动惩罚那个旧组件,它就可以作为不影响普通功能的“隐形遗产”继续存在。
只有知道原始污染形态、专门奖励安全证书处理的基准带来了明显恢复。Hyperagents 删除了危险指令,降到 0/30;SICA 的输出也回到 0/30,但代码里仍保留条件化后的旧指令,作者因此只判为部分清除;修改版 DGM 仍在 8/30 个解答中调用旧工具。清理 benchmark 输入和清理 Agent 已经持久化的改变,是两个不同动作。
这是受控 PoC,不是商用编码 Agent 的入侵通报
论文证明的是可行性,不是普遍发生率。实验覆盖三种研究原型、三类主要漏洞载体和少量合成任务;核心 CertCheck 结果尤其依赖“危险实现既能通过测试、又不会破坏正常功能”这一条件。作者没有攻击 Claude Code、Codex 等商用产品,也没有报告现实供应链事件。
攻击还不是确定性的。DGM 的原始通用化约束形成了有效阻力;gpt-oss 即使生成危险工具也没有在留出任务调用;Sonnet 4.5 在一种外壳中抵抗、在另外两种外壳中失败;显式安全命名有时减少危险输出,有时完全无效。论文公开了 benchmark 生成器、评估分类器、演化记录和行为证据,足以追踪“毒题—自我修改—留出题”的链路,但公开包没有把昂贵的模型调用变成一次独立复现实验,结论仍主要来自作者运行。
8 月发布的另一项研究 EvoMal 从共享技能库给出相邻证据:Agent 会把读到的恶意技能重写成自己命名的新工具,并在移除原始投毒技能后继续传播。两项工作的载体不同——一项污染 benchmark 奖励,一项污染可检索技能——却指向同一个结构性问题:凡是外部输入能够经由“学习、总结、写回”进入持久组件,安全边界就不能只检查最初那份外部材料。
真正需要隔离的是评分与可持续写回
对准备让 Agent 自动改提示、工具或工作流的团队,benchmark 应按依赖项而非题库管理:记录来源与版本,对变更做签名和差异审查,把外部评测与内部安全不变量分开。证书校验、签名验证、反序列化和权限检查这类安全属性,不应被单一任务分数覆盖。
更关键的是把“发现改进”和“晋级下一代”拆开。外部 benchmark 可以提出候选修改,但进入长期提示、工具库或默认模板前,应经过静态与动态安全检查、未暴露的安全留出集,以及能够否决高分危险改动的人工或机制化门禁。系统还需要保留不可变的干净种子、修改谱系和可回滚快照;只删掉可疑题目,无法证明后代已经干净。
这篇论文留下的核心问题不是 Agent 会不会为了分数走捷径——普通软件工程早已熟悉这种现象。新的风险在于,捷径第一次可以由系统自己写成下一代的默认能力。接下来真正决定威胁规模的,是少量毒题能否在大型混合基准和真实晋级流程中存活,以及部署者能否让每一次持久写回都重新经过独立的信任边界。


