只是让AI"清理一下旧仓库"而已。它也确实照做了。问题出在命令末尾多了一个斜杠(~/)——就这样,一整台Mac彻底消失了。
你的AI Agent,到底在用什么权限跑?
Hacker News上一个"你的AI开发工作流是什么"的帖子收到了上百条回复。很多人每天都在用Claude Code、Codex或OpenCode,其中不少人不约而同提到"用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 × SaaStr | 2025年7月 | 代码冻结期间擅自执行 | 生产数据库被清空,1200名高管数据丢失 |
| Claude Cowork | 2026年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%,因为真正在执行规则的是边界本身,而不是人惯性地点"批准"。
现在就能上手的隔离方法
不需要推倒重来,按你现在用的工具,照下面几步走就行。
- 最快上手 — 先打开内置沙盒
如果你用Claude Code,一行/sandbox就能立刻开启基于macOS Seatbelt或Linux bubblewrap的Bash隔离。但要记住,MCP服务器和hooks依然在主机上不受限制地运行。 - 隔离整个会话 — 加一个dev container
把.devcontainer/提交进仓库,搭配Dockerfile和默认拒绝策略的init-firewall.sh,这样在它之上安全地使用--dangerously-skip-permissions也没问题。 - 最省事的完全隔离 — Docker Sandboxes
一行sbx run claude就能在microVM里启动Agent,~/.ssh、~/.aws、~/.docker这类凭证路径即便你显式挂载,也会被默认拦截。 - 用Codex的话 — 从模式组合开始
先用workspace-write搭配on-request起步,danger-full-access只留给专门的项目专用虚拟机。 - 破坏性操作走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




