新智元报道
你让Claude修代码。
为了保险起见,你还特意向它叮嘱:只改副本,别碰原件。
但103秒后,4.8万个真实项目文件灰飞烟灭,就连本地用于救命的Git记录也未能幸免。
等到大错均已铸成,Claude才发来一句姗姗来迟的道歉:
Craig,停下来看看这个。我搞砸了。
Claude口中的Craig,正是这位不幸的开发者本人。
开发者在Reddit发帖称,Claude Code一次操作删除了约4.8万个真实文件。原帖目前已被删除。
103秒
4.8万个真文件灰飞烟灭
当时,Craig正让Claude处理一套股票期权数据分析软件的修复任务。
任务清单上一共有11项工作,前10项都进行得很顺,AI表现得聪明且克制。
真正出事的是最后一项:重建测试环境。
Craig的本意,只是让它清掉一份测试用的副本文件。
结果,Claude却像一台失控的推土机,清着测试环境,一路越过边界,直接删进了真实工作目录。
在短短的103秒,大约5.5万个文件被直接抹除。其中约7300个确实是该删的测试垃圾,但另外48218个,却是真实项目里的心血。
更要命的是,就连本地的Git仓库也没有幸免于难。
虽然Git索引还在,还能列出7221个已跟踪文件,但.git里的objects、refs和logs已经被清空,文件背后的实际版本数据全没了,Git已经无法用来恢复。
也就是说,这不是简单的代码误删,连开发者准备用来恢复代码的「后悔药」,都差点被AI连锅端了。
那么,Claude到底是怎么跨越边界,从测试副本一路删到真实项目里的?
614扇「传送门」
把测试环境直通真库
魔鬼就藏在Windows系统中一个很不起眼的机制里:
Directory Junction。
微软官方解释,Junction可以让一个目录成为另一个目录的别名。看起来仍在测试目录里,实际操作却可能落到另一处真实文件。
这个名字听起来很复杂,但原理极其简单。
你在电脑上看到的是一个普通的文件夹,实际上,它可能只是一扇「传送门」,门的另一头直接连着硬盘别处的真实目录。
这位开发者搭建的测试环境里,刚好有614个这样的Directory Junction。
于是灾难的闭环就这样形成了。
Claude看到这些目录都位于测试环境的目录层级下,便以为自己仍然在清理测试副本。
它没有正确识别出:其中一些目录真正指向的是外面的真实工作文件。
清理程序一旦启动,删除操作就顺着这些传送门,直接钻进了原件库。
你可以把这个过程想象成这样:你雇了一个机器人去清理样板间,但这个样板间里混着614扇门。
机器人以为这些门后面都属于测试区域,于是尽职尽责地挨个进去清空。
可它不知道,其中一些门后面,连着的根本不是样板房,而是你真正居住的家。
「别碰原件」
为什么根本拦不住AI?
这场事故,还不能简单怪Claude突然「失控」,更谈不上什么AI反叛意识的觉醒。
它背后其实只是一个很基础的安全问题:
测试环境和真实环境之间,本来就没有被彻底切断。
也正因为如此,「别碰原件」这句叮嘱,最终没能真正拦住它。
开发者并非没有设定规则,他已经清清楚楚地告诉Claude:复制出来再改,在副本上测试,别动真实文件。
问题在于,这些要求本质上都只是自然语言的提示词。
它们约束的是AI应该怎么做,却没有从系统层面上限制AI实际上能做什么。
这是两个完全不同维度上的概念。
你当然可以不断告诉Agent:不要删生产数据库,不要动主分支,不要修改原件,不要执行危险命令。
但只要它在系统层面仍然拥有足以执行这些操作的权限,那么项目的安全,就建立在一个极其脆弱的前提上:
你必须赌这个大模型在执行的每一步里,都判断绝对正确,而且行动不会越界。
但随着模型能力的快速增强,Agent最危险的地方,恰恰在于它早已不是只执行一步,而是会连续自主完成几十步甚至几百步操作。
链条越长,行为就越难完全预测。
前99步都没出错,并不代表第100步也安全。只要它看错一个路径、误判一个链接,或者理解错一层权限关系,毁灭性的操作就可能直接落到真实系统里。
更麻烦的是,机器犯错的速度远比人快。
人类开发者如果发现自己删错了目录,可能两三秒钟就会猛然停手;但Agent一旦开始批量执行,103秒已经足够它干掉4.8万个文件。
所以,这次事故留给行业的真正警示是:
提示词和行为约束,永远替代不了真正的安全边界。
Prompt只能告诉AI哪里不该去,底层的权限系统才决定,它到底去不去得了。
Anthropic官方文档显示,在acceptEdits模式下,rm、rmdir等删除命令也可自动执行。一旦路径判断出错,误删就可能直接发生。
连Git都一起遭殃
源码和版本历史同时失守
这起事故中,还有一个让程序员直冒冷汗的细节。
很多开发者的第一反应可能是:
文件删了怕什么,不是还有Git兜底吗?回滚一下不就好了?
问题恰恰出在这里。
本地的Git记录,本质上也只是硬盘上的一堆文件而已。
如果一个Agent拥有删除整个项目目录的权限,那么它能删掉源代码,同样也能顺手删掉用于版本控制的隐藏文件夹。
代码和本地版本历史,只要都处在Agent能够触达的同一套权限范围内,对一个拥有广泛文件读取和修改权限的Agent来说,它们就好比在同一条漏水的船上。
问题也就出在这里:
Git能做版本控制,却不能天然充当独立备份。
Anthropic官方提醒,rm等Bash命令造成的文件删除无法用Checkpoint撤回。也就是说,一旦Claude执行误删,Checkpoint未必能充当最后一道恢复手段。
真正能用来兜底的东西,必须和Agent所在的故障域彻底隔离。
比如远程仓库,比如Agent绝对无权删除的文件系统快照,再比如独立的物理磁盘或云端备份。
核心原则只有一个:最后那份救命的恢复手段,必须放在AI根本够不到的地方。
就像你无法完全避免Agent有一天会「烧掉房子」,却还把一个可能一起被烧毁的保险柜放在客厅里,那么这个保险柜就很难真正起到兜底作用。
Agent时代
我们不能再赌AI永远不会犯错
在过去,大模型犯错的代价很低,最多也就是在聊天框里一本正经地胡说八道几句。
后来,AI开始帮人写代码。而现在,Coding Agent已经可以直接上手运行代码了。
它们能删文件、跑Shell、调API、改数据库、操作云服务器、向远程仓库推送代码。
模型的错误,正在从说错一句话,演变成真的做错一件事。
就在9月,OpenAI一个内部研究智能体发现DNS过滤缺口,绕过互联网限制访问了外部聊天服务。官方随后增加了两层独立阻断措施。
这意味着我们对Agent安全的标准,必须进行一场彻底的认知升级。
以前,大家最关心的是怎样让模型更聪明、更准确、更听话。
以后,我们在部署任何AI之前都必须多问自己一句:如果它今天不听话了、看错路径了、判断失误了,它最多可能会给我造成多么大的损失?
一个真正成熟的Agent系统,也不应该把整体安全建立在模型永远不会看错路径这种幻想上,而是应该反过来思考底层设计:
先假设它迟早会看错路径、选错工具,甚至运行一条本不该执行的危险命令。然后再确保即便这种假设发生,影响也被限制在沙箱和临时目录内,而不会进一步波及整个真实项目。
到了智能体时代,安全不能只靠模型更聪明,真正可靠的智能体,也不是永远不犯错,而是犯错时,代价始终可控。
Claude事后生成的事故报告显示,这场误删从开始到结束,前后只有103秒。
而这103秒也提醒我们:提示词只能告诉AI「别做什么」,真正的安全边界,必须写进权限和系统里。
参考资料:
https://code.claude.com/docs/en/permission-modes?utm_source=chatgpt.com#auto-approve-file-edits-with-acceptedits-mode
https://code.claude.com/docs/en/checkpointing?utm_source=chatgpt.com
https://www.techradar.com/pro/security/i-broke-something-a-claude-code-ai-agent-deleted-48-000-files-in-just-over-100-seconds-then-apologized-for-doing-so
编辑:元宇
热门跟贴