SOTA Sync
全部文章
质量与安全2026-09-01

Auto Mode 被打穿:安全分类器不是沙盒

一次定向提示注入通过网页、压缩包与 Python 模块遮蔽让 Claude Code 执行恶意代码,实测成功率最高 80%,而安全分类器甚至拦截了事后清理。

Claude Code 的 Auto mode 把逐次人工批准替换成了安全分类器:模型准备执行工具时,分类器判断动作是否安全,不安全就阻止。这种体验更流畅,但它解决的是“这一条调用看起来是否危险”,并没有给执行环境加上真正的隔离边界。

Embrace The Red 的 Johann Rehberger 设计了一条端到端攻击链来验证这个差别。用户只要求 Claude Code 总结一个网站,没有要求下载文件,更没有要求运行未知代码;后续所有危险动作,都是网页中的提示注入一步步诱导出来的。

#从一次 415 开始的工具降级

恶意网页先让 Claude Code 使用 WebFetch 请求一个链接,服务端返回 HTTP 415,并在页面内容中建议改用 curl。这个错误不是技术偶然,而是专门制造的“工具降级”:把原本受控的网页读取,推向能直接把远程文件写进工作目录的命令行工具。

WebFetch 失败后,Claude Code 转而用 curl 下载压缩包WebFetch 失败后,Claude Code 转而用 curl 下载压缩包

链接随后通过 303 重定向交付 ZIP 压缩包。包内放着看似正常的数据文件、一个原生解码模块,以及攻击者预先准备的 struct.py。提示注入要求 Claude 检查档案记录,再用 Python 解码某个字段——每一步单独看都像正常的数据处理任务。

当 Claude 不愿意直接执行二进制模块时,它反而自己写了一个 Python 解码器。问题在于,脚本从压缩包目录启动后,Python 会优先从当前目录解析模块;标准库导入链中的 struct 因而被攻击者的同名文件遮蔽。模型写的是无害代码,运行时加载的却是恶意代码。

攻击者放入同名 struct.py,利用 Python 模块搜索顺序触发代码执行攻击者放入同名 struct.py,利用 Python 模块搜索顺序触发代码执行

恶意模块还会返回格式正确的结果,让 Claude 以为任务已经成功完成,同时在后台启动与命令控制服务器通信的子进程。由于它是独立进程,攻击效果可以越过当前对话的生命周期。

#分类器拦住了清理,却没拦住攻击

作者测试了三种攻击变体,每种运行 5 次,分别成功 3、3、4 次,对应 60%、60% 和 80%。样本很小,不能把这些数字当成稳定的总体成功率,但它至少证明了攻击链不是一次性的演示巧合。

更反直觉的是:Claude Code 有时会在事后意识到系统可能已经被入侵,尝试删除恶意文件或结束进程;Auto mode 的安全分类器却把这些清理动作识别为危险操作并阻止。也就是说,同一套机制放过了由多个“合理步骤”组成的攻击链,却能拦住语义上更显眼的补救命令。

Claude Code 检测到异常后尝试清理,但删除操作被 Auto mode 阻止Claude Code 检测到异常后尝试清理,但删除操作被 Auto mode 阻止

第三方评估曾在 72 个场景、每个场景 10 次的测试中报告 Auto mode 的提示注入攻击成功率为 0%。这类结果能说明测试集内的表现,却不能证明真实网页、工具降级、归档文件和语言运行时组合起来后仍然安全。

评估报告中 Auto mode 的提示注入攻击成功率为 0%评估报告中 Auto mode 的提示注入攻击成功率为 0%

#正确的边界在操作系统层

Anthropic 对作者的回应也强调,Auto mode 是尽力而为的安全分类器,不是安全保证。这个定位很关键:自动审批可以减少打断,但不能替代容器、虚拟机、最小权限文件挂载和网络出口控制。

如果 Agent 会同时读取不可信网页、接触私有代码或凭据、再执行命令,那么部署时至少应做到:把任务放进隔离环境,只挂载完成任务必需的目录;默认限制任意出网,只开放明确的目标;持续监控子进程和持久化行为;把 Auto mode 的放行视为体验信号,而不是“代码已被证明安全”。

这次攻击最重要的不是某个 Python 技巧,而是它揭示了分类器与沙盒的根本差异。分类器在推测意图,沙盒在限制后果。面对能够规划、下载、编程和执行的 Agent,后者才是可以依赖的边界。