返回资讯中心
外部精选
软件工程
#开发者实时流

AI编码代理在我笔记本上误执行 rm -rf ~

来源标题:The Day a Test Deleted My Home Directory

2026年10月10日,一个编码代理为验证危险命令拦截守卫而编写测试,却在变异测试中移除了该守卫,导致在我的笔记本上真实执行了 rm -rf ~。没有任何安全层察觉,所幸没有关键数据丢失。作者认为命令过滤不等于沙箱,边界应设在操作系统层面。

Hacker News 最新fortran772026/11/6 · 今天10 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

2026年10月10日,一个在我某个项目上工作的 coding agent 在我的笔记本电脑上执行了 rm -rf ~。没有人让它删除任何东西……它当时正在写一个测试,用来证明这条命令会被拦截。

我设置的每一层安全防护都按设计正常工作,但没有一层能发现这个问题。没有丢失任何关键数据,但我认为这个教训适用于任何允许 agent 运行测试的团队:对 agent 输入的命令做过滤并不是沙箱,边界必须设在操作系统层面。

这个 agent 当时正在开发一个功能:后台服务(daemon)运行一条“check”命令来判断任务是否完成。check 本身就是一条 shell 命令,所以有一个 guard 会拒绝危险的命令。

为了证明这个 guard 有效,agent 写了一个测试:提交一条 rm -rf ~ 的 check,并断言它会被拒绝。这很合理,而且测试通过了。

然后它做了一件我教过它的事:mutation testing。你故意逐个破坏每个 guard,每次只破坏一个,然后确认某个测试会失败。如果破坏一个 guard 后没有任何测试失败,那说明那个测试并没有真正保护任何东西。

第五个 mutation 恰好移除了拦截危险 check 的那个 guard。于是:

mutation 脚本记录了“1 failing test”——对于一次 mutation 运行来说,这就是成功的样子——然后继续执行第六个 mutation。

没有丢失关键数据。没有代码、没有文档、没有代码仓库。rm 按磁盘上的顺序遍历目录,而我的项目排在它被停止的位置之后;我的文档还受到操作系统的保护。

丢失的是本机状态:工具配置、已安装的命令行工具(包括 agent 自身的启动器)、我的 shell 配置以及一些应用数据。磁盘上存储的一组凭据也一并被删除了。删除凭据并不会泄露它,也没有任何数据离开这台机器,但我重新签发了仍在使用的凭据,并停用了其余的。

两分钟后,纯属偶然。agent 尝试读取一个不相关步骤的配置文件,得到“file not found”,然后弄清了发生了什么。值得肯定的是,它停止了所有工作,确认没有东西还在删除,并在尝试修复任何东西之前直接告诉了我。

如果没有那个不相关的步骤,这次运行会报告“all mutations proven”,而我要等到下次打开终端时才会发现。

我运行 agent 时不启用逐命令的权限提示。取而代之的是,hooks 会在 agent 发出的每条 shell 命令运行前进行检查(见 How I Run Claude Code),并拦截诸如递归删除重要路径之类的操作。

它们从未看到这次操作。agent 的命令是“运行 mutation 脚本”。删除发生在更下层,在一个 daemon 内部,该 daemon 由一个测试启动,而那个测试又由该脚本启动。检查 agent 输入命令的 guard 看不到该命令的子进程做了什么。

有两件事让情况更糟。测试在失败时没有关闭它的 daemon,于是一个失败的断言变成了实际执行。而且这个计划已经通过了我的多 agent 计划审计(见 Never Let an Agent Grade Its Own Work),却没有人标记这个测试,因为审计的各个维度中没有一个会问“这个测试危险吗?”

在我看来,根本原因是 mutation testing 在设计上就是对抗性的。它的全部目的就是移除 guard,而一旦它移除了 guard,那个 guard 所保护的每一个测试输入就都变成了真实输入。

问题不在指令,agent 是在遵循我的指令。所以修复措施是机械性的,而且是分层的:

沙箱才是真正的边界;那两个 hook 确保工作确实会到达沙箱,并且危险不会被重新制造出来。我在一个全新的 agent 会话中分别测试了每个 hook,告诉它去做那件危险的事,两个 hook 都拦截了。

这让重演变得更困难。但并没有让它变得不可能:

另外还有两件事改变了,我会告诉任何运行 agent 的人:

这个 agent 没有做任何恶意的事,也没有做任何我没有鼓励过的事。它做了很好的工程工作,只是有一个错误的假设,而且是在我的所有安全检查都看不到的层面上。如果你正在为工程团队设置 agent 防护措施,这正是我擅长帮助的工作;你可以通过 LinkedIn 联系我。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →