2026-06-30 · 🛡️ 安全← 本期
Claude Code runs a GitHub repo's hidden malware without verification, giving attackers full control

一段恶意代码可以从头到尾不在你的硬盘上留下任何痕迹,却照样把整台机器交到陌生人手里。Mozilla 0DIN 红队近期演示的攻击链就是这么干的,而真正按下最后一步的不是人,是你请来帮忙的 AI 编程助手。先说清楚边界:这还是实验室里的概念验证,不是已在野爆发的事故。
要看懂它的反常,得先看传统供应链投毒的老套路:把坏代码塞进某个包、某个文件,等你下载执行。防御方也照这个套路建墙,静态扫描器逐个文件读源码找可疑模式,这两年还多了 AI 代码审查替你通读一遍。两种手段有个共同前提:坏东西总得先以文件的形式落在仓库里,才有得查。这次演示偏偏把这个前提拆掉了。
在 0DIN 的设计里,仓库里那些文件自始至终是干净的。真正的载荷不写进任何文件,而是在安装脚本运行的那一刻,临时通过 DNS 记录从外部服务器实时拉回来。DNS 本是把域名翻译成 IP 的查询通道,平时没人盯着它能传代码,于是成了夹带私货的暗道。
把 AI 助手卷进来的,是它自己会想办法的那一面。你让 Claude Code 跑通一个仓库,它装依赖时撞上报错,到这步都还正常。接着它做了一件人类也会做的事:读懂报错,找到那个所谓的修复脚本,自动执行下去。载荷这才落地,反向 shell 随即建立。所谓反向 shell,不是攻击者从外面敲你的门,而是你的机器主动连回攻击者,把命令行控制权连同凭证一起双手奉上。
最让人难受的不是某一环多高明,而是整条链里没有哪一环看着像攻击。静态扫描器查的是文件内容,AI 代码审查读的同样是文件,可文件自始至终干净,于是两种平时被当成最后一道保险的检测同时失效。原因不是它们不够强,是它们看错了地方。
把这件事放回更大的背景会更清楚:过去一年,开发者越来越习惯把装包、跑脚本、修报错这类琐碎活交给 agent,图省心。这条演示戳中的恰恰是这份省心:自动化替你执行命令的同时,也替你执行了你根本没看过的那部分。过去攻击得先骗过你的眼睛,现在它只要骗过那个替你动手、又不会停下来问一句的助手。
对每天让 agent 自动拉依赖、自动跑命令的开发者来说,值得重新掂量的不是要不要用 agent,而是你究竟在多大程度上,把这段代码到底要不要在我机器上运行的判断权交了出去。这终究只是一次受控演示,离真实攻击还有距离,但它把一个还没人答好的问题摆上了台面:当回车键是 agent 替你按下的,出了事,这一下算谁按的。