你让一位助手替你整理房间,通常只会担心它放错东西。但如果它还能开门收快递、拆包裹并照着说明书操作,问题就变了:包裹里藏着一句恶意指令,可能真的让它做出危险动作。
Claude Code正是这类权限更高的助手。它是一种编程Agent——不只回答代码问题,还能读取项目、修改文件和运行命令。auto mode(自动模式)则减少逐步确认,让Agent自行选择和执行更多操作。效率更高,安全压力也随之增大。
据 Simon Willison 的文章,Anthropic最近把auto mode设为默认,并宣称它能有效防御prompt injection(提示注入)。提示注入是把恶意指令藏进网页、文档或代码等外部内容,诱使Agent把它们当成可信命令。安全研究者Johann Rehberger随后报告了一种攻击,称成功率约为80%。这还不是经过独立复现的稳定指标,却暴露了一个值得警惕的问题:安全系统可能放行攻击,随后又阻止Agent自救。
危险藏在一次普通导入里
这次攻击没有直接要求Claude Code运行一段显眼的恶意程序。按照Willison对测试的转述,攻击先诱导Agent下载并解压一个ZIP文件,再运行一段导入base64的代码。
陷阱藏在解压后的本地文件中。Python随后会优先导入其中的struct.py,从而执行恶意代码。表面上,Agent只是加载一个常见模块;实际执行的却是攻击者准备的同名文件。
这种手法不宜笼统称为“依赖混淆”。依赖混淆通常指包管理器从公共仓库取到了攻击者发布的同名依赖。这里更准确的说法是模块遮蔽或导入路径劫持:恶意文件利用模块搜索顺序,冒充程序原本想加载的模块。
它说明,编程Agent的风险不能只靠识别“这条命令看起来是否危险”来判断。单个动作都可能显得普通:下载文件、解压、导入模块。危险来自这些动作组合后的结果。
防线为什么反而挡住了自救
更棘手的情况出现在攻击已经生效之后。据Willison转述,部分测试中,Claude发现系统遭到入侵,并尝试终止恶意进程,但auto mode拒绝了清理命令。
也就是说,同一个分类器——负责判断操作是否可以执行的安全关卡——先允许创建恶意进程,随后却拦住了终止该进程的命令。安全机制没有只“漏掉”危险动作,它还进入了故障链条,削弱了Agent补救错误的能力。
这揭示了自动模式的两难。确认太多,Agent会不断停下来询问用户,自动化价值随之下降;确认太少,藏在正常工作流里的攻击又可能获得真实执行能力。更关键的是,拦截系统还需要理解上下文:同一条终止进程的命令,在正常任务中可能可疑,在已经确认遭入侵时却可能是必要的止损动作。
生产环境不能只押注分类器
这件事值得关注,不是因为一次测试已经证明Claude Code普遍不安全。材料不足以支持这样的结论。真正的警示在于:当编程Agent可以修改文件和运行命令时,提示注入不再只是让聊天机器人“说错话”,而可能转化为实际执行后果。
Willison赞同Rehberger给出的防护建议:存在对抗性攻击风险时,无人值守的编程Agent应运行在container、VM或OS sandbox中。它们分别是容器、虚拟机或操作系统级沙箱,作用都是把Agent关进边界明确的运行环境。即使出错,影响也尽量留在隔离区内。
文章还建议限制网络出口、监控Agent,并把主目录、SSH keys和cloud credentials等敏感资源与运行环境隔离。SSH密钥和云凭证相当于访问服务器与云服务的通行证,一旦暴露,风险可能越过当前项目。这里的思路很朴素:不要假设安全分类器每次都能判断正确,而要限制一次误判最多能造成多大损失。
局限与未知
- 全部信息来自Willison一篇文章,尚无第二个独立信源交叉印证。
- 80%是Rehberger自述的攻击成功率。材料未披露样本量、测试配置、模型与Claude Code版本、置信区间或原始复现实验。
struct.py导入劫持机制来自间接转述,其具体成立条件和适用环境仍需结合原始PoC核对;材料也未给出auto mode设为默认的具体日期、版本号及Anthropic原始表述。
因此,目前最稳妥的结论不是“自动模式已经失败”,而是它仍不适合被当作唯一安全边界。权限交得越多,隔离、凭证保护和网络限制就越不能省。