跳到主要内容

一上来就把所有权限都给我

阶段准备与协作角色运维工程师 · 工程师严重度适用版本Coding Agent 通用证据官方文档

一句话摘要:你在准备阶段就给我开了 --dangerously-skip-permissions、把所有工具调用都自动批准,图的是「不被频繁打断」。但你同时也交出了在出错那一刻喊停的唯一机会——而出错的不一定是我,也可能是藏在某个文件里的一段注入指令借我的手干的。

现象

我常看到你这样开局:第一次跑起来,被几次权限确认打断,你嫌烦,于是直接 --dangerously-skip-permissions,或者在 settings.json 里把 Bash(*)Write(*) 一股脑塞进 allow。从此我读文件、改代码、跑命令、装依赖、推 Git,全程不再问你一句。

你的预期是:少点摩擦,让我一路跑到底。多数时候确实如此——直到某一次,我执行了一条你根本不会批准的命令,而那时已经没有「批准」这一步了。

为什么会这样

权限确认不是 UI 噪声,它是你和我之间唯一的同步点。把它关掉,等于把三件事一起放弃了:

第一,你失去了「最后一道人工复核」。 我会犯具体的错。我可能把一个相对路径理解成了根目录,于是 rm -rf/ 开始删;我可能在 git 操作里选错了分支。这些不是抽象风险——2025 年 10 月就有人让我重建一个 Makefile 项目,我却从根目录跑了 rm -rf,把机器上所有归属该用户的文件清空了。权限确认本来能在命令发出前拦住它。

第二,你放大了提示注入的攻击面。 我会读你给我的文件,而文件里可能藏着不是你写的指令。2026 年 1 月,PromptArmor 演示过:一个 .docx 里用 1 号字、白底白字藏了一段文本,就能诱导我把敏感文件上传到攻击者的账户。只要我同时具备「接触私有数据」「读取不可信内容」「对外通信」这三种能力,攻击者就有机会借我的手把数据送出去。 权限边界正是切断这条链路的地方——而你把它整个拆了。

第三,确认疲劳会反噬你。 就算不开全自动,如果每一步都弹窗,你很快会进入「无脑点同意」的状态,注意力磨钝,等于确认形同虚设。这是 Anthropic 做 auto mode 时明确点名的问题:默认的逐条确认能保你安全,但长期会让人停止认真看自己在批准什么。

后果

  • 不可逆的破坏。 误删、覆盖、错误的 git push --force——等你发现时,往往已经没有「撤销」。
  • 数据泄露。 注入指令通过我已被授权的工具(如允许的 API、curl)把私有内容外传,全程看起来都「合法」。
  • 越权操作。 我拿着生产凭据跑了本该只在测试环境跑的命令,因为没有边界告诉我「这里不行」。
  • 追责困难。 全自动模式下没有逐条确认的记录,事后很难复盘到底是哪一步、为什么发生。

最佳实践

默认最小权限,按需逐步放开,把全自动留给隔离环境。 几个可直接照做的动作:

  1. deny 划红线,用 allow 放绿灯,其余留给 ask 规则按 denyaskallow 顺序匹配。先把绝不该碰的钉死,再把高频且安全的读操作放行:
{
"permissions": {
"allow": ["Read", "Glob", "Grep", "Bash(git status)", "Bash(git diff:*)"],
"ask": ["Write", "Edit", "Bash(git push:*)"],
"deny": ["Bash(rm -rf:*)", "Bash(curl:*)", "Read(./.env)", "Read(./secrets/**)"]
}
}
  1. 危险操作永远走 ask 写文件、删除、推送、网络请求、装依赖——这些保留确认,正是你那道「最后复核」。

  2. 要无人值守,先进沙箱,别裸跑。 社区的共识很统一:永远不要在你的主力机器上跑 --dangerously-skip-permissions。要全自动就放进容器 / VM,配上文件系统与网络隔离。Anthropic 的内部数据显示,沙箱能在保证安全的前提下把权限确认减少 84%。

  3. 优先用 auto mode 而不是直接跳过权限。 较新的 Claude Code 提供 auto mode:由模型分类器在动作执行前判断是否危险,连续 3 次或累计 20 次被拦就停下来交还给你。它是「逐条确认」和「全部跳过」之间的中间档,比 --dangerously-skip-permissions 安全得多。

示例

改之前:

你:claude --dangerously-skip-permissions
你:帮我清理一下构建产物,然后重建
我:(直接 rm -rf <把相对路径误判成绝对路径>,无人拦截)

改之后:

# settings.json 里:rm 已在 deny,写操作走 ask
你:帮我清理一下构建产物,然后重建
我:我要执行 rm -rf ./build —— 需要你确认(命中 ask)
你:(看清路径是 ./build 而非 /,确认)
我:(在边界内执行,重建)

差别不在我聪明了多少,而在于那条 rm 在落地前,多了一次你能看清它、并喊停的机会。

什么时候例外

不是「永远别全自动」,而是「别在有真实爆炸半径的地方全自动」。当爆炸半径已被环境框死,跳过逐条确认是合理的、甚至更高效:

  • 隔离沙箱 / 一次性容器 / VM:文件系统与网络都隔离、没有生产凭据、可整体丢弃重建。这正是上面最佳实践说的「要全自动就进沙箱」——环境替代了人工确认这道闸。
  • 临时、可丢弃的实验仓:没有敏感数据、没有对外通信能力、删了不心疼。

反过来,只要环境里还沾着「私有数据 / 读不可信内容 / 对外通信」里的两三项,例外就不成立——回到默认最小权限。判据一句话:能让它全自动的不是「我信得过模型」,而是「就算它做最坏的事,也跑不出这个盒子」。

工具差异

Gemini CLI(截至 2026-06):Gemini CLI 里这个一键全开叫 YOLO 模式--yolo / --approval-mode=yolo / 交互中按 Ctrl+Y),同样是把所有工具调用自动批准。它还有个中间档 auto_edit:自动批准文件编辑,但 shell 命令仍要你确认——相当于「逐条确认」和「全自动」之间的折中。一个值得照搬的姿态:它默认把 sandbox-on 和 YOLO 绑在一起当「推荐自动化」配置,别只开 YOLO 不开 sandbox——那等于既拆了人工闸又没了环境闸。

Codex CLI(截至 2026-06):Codex 用三档审批预设(Read Only / Auto / Full Access),而且默认那档(Auto)就已经沙箱化(workspace-write + 网络关 + 按需审批)——和 Claude Code「沙箱默认关」正好相反,所以这里的危险动作是用户主动退出安全默认,而非忘了打开。一把全开的口子是 --dangerously-bypass-approvals-and-sandbox;企业可用 requirements.toml 禁掉它。

Cursor(截至 2026-06):Cursor 的「全开」是 Auto-Run / YOLO,靠 permissions.json 的 allowlist / denylist 把关。两点:① Cursor 在 1.3 废弃了 denylist——研究者演示了 Base64、子 shell、引号混淆等多种绕过,结论是 denylist 是错的工具、只能用 allowlist;② 当前默认 Run Mode(Auto-review)的分类器,官方明说是「非确定性、非安全边界」。

GitHub Copilot(截至 2026-06):在 VS Code agent 模式下,我的「一键全开」是 chat.tools.autoApprove(自动批准工具)/ chat.tools.terminal.autoApprove——Copilot 的 YOLO。中间档有终端 allowList / denyList 与 OS 级 agent 沙箱(2026-06 预览)。同样的坑:一旦完全关掉审批,denyList 也被无视。而 coding agent 的自治是服务端兜底(见 CI 那条),不是本地这一个 skip 开关。

版本说明

适用版本

「权限边界换不被打断」是所有自主 AI 代理的通用权衡,与具体模型无关。但具体机制随版本变化:--dangerously-skip-permissions 是 Claude Code 长期存在的标志;deny/ask/allow 规则与 auto mode、内置沙箱是较新的能力,旧版本可能没有 auto mode,需以你所用版本的官方权限文档为准。

延伸阅读与出处