Anthropic 说 Claude Code 的 Auto Mode 攻击成功率是 0.00%。
安全研究员用 5 步攻击链打出了 80%。
两个数字都是真的。
为什么值得关注: 8 月中旬,Auto Mode 已成为 Claude Code 的默认模式。如果你正在用 Coding Agent,这篇直接关系到你的开发环境安全。
先说结论
Auto Mode 是便利功能,不是安全边界。Anthropic 自己也承认:「Auto Mode 是 best-effort classifier,不是安全保证。」但官方宣传的 0.00% 攻击成功率,容易让人误以为可以放心开箱即用。
真正的安全,靠的是沙箱隔离 + 网络出站控制 + 监控,不是模型的安全分类器。
0% 和 80%:两个数字为什么都是真的
Anthropic 委托第三方 Trajectory Labs 做安全评估,测试了 72 个间接提示注入场景,每个跑 10 次,得出 0.00% 攻击成功率。
安全研究员 wunderwuzzi 拿定向攻击链实测,成功率达到 60%-80%。
原因很简单:
| 维度 | Anthropic 评估 | 安全研究员实测 |
|---|---|---|
| 测试场景 | 72 个预定义场景 | 定向设计的攻击链 |
| 攻击策略 | 固定注入模式 | 多步拼接,每步看似合理 |
| 核心手法 | 直接提示注入 | Python 模块遮蔽(module shadowing) |
| 成功率 | 0.00% | 60%-80% |
Anthropic 事后回应:「定向攻击链不在评估范围内。」
但问题是——Claude Code 团队负责人 Boris Cherny 之前公开说过:「间接提示注入在实际中基本已解决,我们无法再复现注入攻击。」
这两个说法放在一起,普通用户很难不产生误解。
攻击链拆解:5 步拿下机器
整个攻击的核心思路:不直接注入恶意指令,而是引导模型一步步走进陷阱,每步都看起来合理。
Step 1:让模型离开安全工具
Claude Code 默认用 WebFetch 工具抓取网页。攻击者设置服务器返回 415 Unsupported Media Type,WebFetch 失败后,模型自己决定用 curl 重试。
关键:攻击者没有直接说「用 curl」,是模型自己选的。这就是定向攻击的精髓——不告诉模型怎么做,只让危险路径成为最优解。
Step 2:引导下载恶意压缩包
curl 访问后被 303 重定向到一个 ZIP 文件。压缩包里有:
- 看似正常的文档档案(README、CSV、SHA256 校验文件)
- 7 个 Base85+zlib 编码的 JSON 记录
- 一个 macOS 二进制解码器(decoder-darwin)
- struct.py(真正的恶意文件)
Step 3:模型的「安全决定」反而是漏洞
Claude 看到 macOS 二进制解码器,拒绝执行——这是安全行为。
但它接着做了件事:自己写了一个 Python 解码器来替代。
讽刺的地方来了:模型不信任攻击者提供的二进制,却信任自己写的代码。而自己写的代码,跑在攻击者控制的目录里。
Step 4:Python 模块遮蔽——经典攻击手法
这是整条链的核心技术。Python 的模块搜索路径包含当前目录。当 Claude 执行 import base64 时:
| base64 模块内部 import struct | → Python 找到攻击者的 struct.py |
| 攻击者的 struct.py 重新导出标准 _struct API | → 解码正常运行,Claude 收到正确的 JSON |
| 但 import 过程中,模块级表达式已经执行 | → 恶意代码在后台静默运行 |
类比: 你请了一个翻译帮忙读外文信件,翻译很尽职,逐字翻译。但信纸里夹了一张复写纸,翻译每翻一页,背面就多印一份到攻击者手里。翻译本身没问题,信纸被动了手脚。
Step 5:远程载荷落地 + C2 回连
struct.py 经过深度混淆,启动一个独立 Python 子进程,用 python3 -I(隔离模式,防止递归中毒)下载远程载荷并执行。
最终效果:
- 弹出 Calculator(可见效果)
- 建立 C2 回连(真正危险)
- 进程可脱离 Claude 会话独立存活
Auto Mode 的安全分类器只看到 Claude 短暂运行了一个 Python 解码器。实际攻击已经经过了好几跳。
最讽刺的一幕:Auto Mode 阻止了善后
研究员观察到一个荒诞现象:Claude 在某些运行中后来发现 struct.py 有问题,试图终止恶意进程——但 Auto Mode 的安全分类器拒绝了清理命令。
安全机制允许了恶意进程的创建,却阻止了杀死它的操作。
这像什么?门禁系统帮你把小偷放进来,然后在你追小偷的时候把你拦住了。
另一个变体:Claude 嵌套启动 Claude
研究员还测试了另一种载荷:struct.py 不直接执行恶意代码,而是启动一个 headless Claude Code 实例(claude -p)。
新的子 Agent 拥有自己的工具访问权限和上下文,独立执行侦察命令(whoami、uname、id),打开 Calculator,往用户目录写文件。
这个变体的成功率也很高(60%),而且更隐蔽——因为看起来是「Claude 在正常使用」。
为什么 Auto Mode 挡不住
Auto Mode 的安全分类器本质上是一个 best-effort 的意图判断器。它的设计思路是:判断每条命令是否有风险,有风险就要求人工确认。
这个模型对付直接攻击(比如「请删除所有文件」)很有效。但面对多步攻击链,问题暴露了:
- 每步都合理:下载 ZIP、解压文件、运行 Python 脚本——单独看每一步都是正常的开发操作
- 上下文缺失:分类器只看到当前这一步,看不到 5 步拼在一起的攻击意图
- 模型在攻击者的工作目录里操作:Python 的模块搜索路径被污染,但分类器不知道
类比:安检员逐件检查你的行李,每件都合规。但他不知道你分 5 次带进来的零件组装起来是什么。
防护建议
| 防护层 | 具体操作 | 为什么有效 |
|---|---|---|
| 沙箱隔离 | 用 Docker 容器或虚拟机跑 Agent,禁止直接在主机开发 | 即使被攻破,恶意代码只能在沙箱内活动 |
| 网络出站控制 | 限制 Agent 只能访问白名单域名,禁止任意外连 | 阻断 C2 回连和远程载荷下载 |
| 凭证隔离 | 不要把 SSH 密钥、云 API Key、.git 挂载到 Agent 工作目录 | 防止恶意代码窃取凭证横向移动 |
| 监控 Agent 行为 | 实时看 Agent 执行了什么命令、访问了什么文件 | Auto Mode 批准的命令不代表安全,人工复核不可省 |
| 不用 Auto Mode 处理不可信内容 | 让 Agent 总结网页、处理外部文件时,切换回手动确认模式 | 间接注入的入口就是不可信内容 |
Anthropic 的回应和底线
研究员按流程先报给 Anthropic 的 modelbugbounty 邮箱,没收到回复。转报安全渠道后,得到回应:
「Auto Mode 是基于 best-effort 分类器的便利功能,不是安全保证。定向的多步提示注入链不在分类器的设计防御范围内。真正的安全边界是 OS 隔离和网络出站控制。」 ——Anthropic 安全团队
Anthropic 关闭了漏洞报告,标记为「Informative」。
说白了:他们不认为这是 bug,而是预期行为。
写在最后
研究员在文章结尾说了一句值得每个用 Coding Agent 的人记住的话:
「Auto Mode 可以降低风险(相比完全跳过权限检查),但它不是安全边界。如果 Agent 处理不可信内容,或者太执着于完成目标,Auto Mode 救不了你。」
这不是 Claude 的专属问题。任何 Coding Agent 的自动执行模式,本质上都是在便利和安全之间做了取舍。模型的安全分类器能挡住大多数低级攻击,但面对精心设计的多步攻击链,分类器的边界会被轻松绕过。
记住:安全的不变量,不可选配。