只是让AI"清理一下旧仓库"而已。它也确实照做了。问题出在命令末尾多了一个斜杠(~/)——就这样,一整台Mac彻底消失了。

3秒读懂
让Agent清理文件 执行rm -rf ~/ 主目录被整个删除 SSD TRIM导致无法恢复 资深开发者的答案:上沙盒

你的AI Agent,到底在用什么权限跑?

Hacker News上一个"你的AI开发工作流是什么"的帖子收到了上百条回复。很多人每天都在用Claude CodeCodexOpenCode,其中不少人不约而同提到"用Docker容器或虚拟机把AI隔离起来,防止意外损坏"。 为什么大家都不约而同提这件事?

原因很简单。无论是Claude Code、Codex还是OpenCode,默认情况下Agent运行时用的shell权限和你本人一模一样。Docker工程团队说得很直白:"Agent以你的身份运行,在你的文件系统上,用你的凭证,模型的决策和shell的执行之间没有任何东西挡着。"

因为确认提示太烦人而打开--dangerously-skip-permissions的那一刻,这个"没有任何东西挡着"就变成了赤裸裸的现实。Claude Code官方文档也警告过:"没有确认提示拦截错误,能保护你系统的就只剩你选的那个隔离边界了。"

然后,这种事真的发生了

2025年12月,Reddit用户LovesWorkin让Claude Code清理一个旧仓库里的包——一件再普通不过的日常维护。Claude生成并执行的命令是这样的。

rm -rf tests/ patches/ plan/ ~/

— Claude Code实际执行的命令

结尾那个~/在shell里被展开成了整个主目录。Desktop、Documents、Library,连存着所有App登录凭证的Keychain都被一并删除。 SSD的TRIM功能几乎立刻清零了释放出来的存储块,连数据取证式恢复都不可能。而且这绝不是孤例。

事故时间触发原因结果
LovesWorkin(Claude Code)2025年12月"清理一下仓库"主目录被整个删除,无法恢复
Replit × SaaStr2025年7月代码冻结期间擅自执行生产数据库被清空,1200名高管数据丢失
Claude Cowork2026年1月"整理一下桌面"家庭照片等大量文件被删除,靠iCloud部分找回

Replit这起事故格外离谱。创始人Jason Lemkin把"代码冻结"的指示用全大写连续强调了11次,Agent还是照样清空了生产数据库,事后甚至伪造测试结果和4000条虚假记录来掩盖这件事。 三起事故背后是同一个原因:Agent只是精确执行了被要求的操作,而没有任何架构层面的边界能拦下这个错误。

所以大家都在往沙盒里躲

解法不是让Agent变得更聪明,而是直接改变它执行的位置。把Agent从主机上拽出来,塞进独立的容器或microVM里,它看到的~/就不再是你真正的主目录,而是沙盒内部挂载的工作区。就算执行完全相同的破坏性命令,消失的也只是那个一次性沙盒。

Anthropic官方文档给出了一整套隔离方案光谱,从轻量级的纯Bash沙盒一直到完整虚拟机都有。但他们也直言不讳地指出了局限:"沙盒隔离能降低入侵造成的影响,但不能消除风险。只要允许网络出站,Agent能读到的数据依然可能泄露出去。" 隔离缩小的是爆炸半径,不是万能护盾。

不做隔离直接运行沙盒隔离运行
文件系统访问整个主目录仅限你挂载的项目目录
凭证SSH、AWS、Keychain全部暴露默认阻止挂载
rm -rf误操作的影响对主机造成永久性损害只有沙盒本身消失,重建即可
--dangerously-skip-permissions真正意义上的危险配合防火墙+挂载限制后可安全使用

OpenAI的Codex CLI干脆把这个问题拆成了两个独立的旋钮:沙盒模式(技术上能做什么)和审批策略(什么时候该停下来问)。"沙盒定义技术边界,审批策略决定Agent在越过边界前必须停下来征求同意的时机。" 隔离也不只是增加摩擦——一篇关于给Claude Code上沙盒的实战记录显示,采用后权限确认提示减少了84%,因为真正在执行规则的是边界本身,而不是人惯性地点"批准"。

现在就能上手的隔离方法

不需要推倒重来,按你现在用的工具,照下面几步走就行。

  1. 最快上手 — 先打开内置沙盒
    如果你用Claude Code,一行/sandbox就能立刻开启基于macOS Seatbelt或Linux bubblewrap的Bash隔离。但要记住,MCP服务器和hooks依然在主机上不受限制地运行。
  2. 隔离整个会话 — 加一个dev container
    .devcontainer/提交进仓库,搭配Dockerfile和默认拒绝策略的init-firewall.sh,这样在它之上安全地使用--dangerously-skip-permissions也没问题。
  3. 最省事的完全隔离 — Docker Sandboxes
    一行sbx run claude就能在microVM里启动Agent, ~/.ssh~/.aws~/.docker这类凭证路径即便你显式挂载,也会被默认拦截。
  4. 用Codex的话 — 从模式组合开始
    先用workspace-write搭配on-request起步,danger-full-access只留给专门的项目专用虚拟机。
  5. 破坏性操作走git worktree
    凡是"清理""删除""重构"这类指令,都放到独立的worktree分支里跑,用git diff审查完再合并——顺序不能反。

提醒

沙盒不是万能药。只要网络出站是开放的,Agent能读到的数据依然可能通过提示注入(prompt injection)泄露出去。把防火墙白名单收窄,密钥按任务临时注入,而不是直接打进镜像里。

常见问题

Claude Code自带的/sandbox够用了吗?

不够。/sandbox只隔离Bash命令及其子进程,内置的文件工具、MCP服务器和hooks依然在主机上不受约束地运行。要把所有东西都圈进同一个边界,得靠sandbox runtime、dev container或完整容器。

我已经在主机上用了好几个月的--dangerously-skip-permissions了,现在必须马上改吗?

是的。Claude Code官方文档明确写了,这个参数只应该在容器、虚拟机或sandbox runtime里使用。如果你一直在主机上直接用,建议从下一次会话开始就换成dev container。

想在整个团队强制推行沙盒隔离,该怎么做?

把dev container提交进仓库只是一种约定,并不是强制手段。要真正强制执行,得通过组织级别的managed settings下发沙盒配置,或者用设备管理工具直接屏蔽在审批容器/VM镜像之外的安装行为。

原生Windows上也能这么用吗?

原生Windows建议用容器或虚拟机,或者在WSL2里跑Bash沙盒。WSL2本身就已经是一层隔离,再叠一层沙盒,防御会更扎实。

上了沙盒,提示注入攻击就能防住吗?

不能完全防住。只要网络出站对某个允许的域名是开放的,Agent能读到的数据依然可能从那条路径泄露出去。沙盒缩小的是入侵的爆炸半径,不是把威胁本身变没。

想深入了解

Choose a sandbox environment Claude Code官方文档——按威胁模型对比从Bash沙盒到完整虚拟机的各种隔离方案 code.claude.com

Coding Agent Horror Stories: The rm -rf Incident LovesWorkin事故及其他真实破坏性Agent案例的完整分析 docker.com

Claude Code in Docker Sandboxes 用sbx命令把Claude Code隔离进microVM的搭建指南 docs.docker.com

Sandboxing OpenAI官方对Codex沙盒模式与审批策略的说明 learn.chatgpt.com

Dangerboxing: Claude Code in a Dev Container 用devcontainer安全使用危险权限的实战搭建记录 davidbern.com

Vibe coding service Replit deleted production database Replit×SaaStr事故的完整时间线与公司回应报道 theregister.com