AI agent 工具权限边界失效怎么办
工具越给越多时写权限、公网仓库、shell 与 MCP 边界如何失效,失效信号、最小权限收口、hooks 能拦什么,以及出事之后怎么审计。

Agent 能改文件、跑 shell、连 MCP、碰 GitHub 之后,危险经常落在「你以为装了闸」这一层:提示词写了禁区,进程、token、网络却没跟着收。ai agent 工具权限边界失效怎么办,顺序是先核验能力是否被基础设施卡住,再回头看提示词写了什么。
提示词挡不住的那一层
Hemapriya Kanagala 在 DEV 上复盘 Anthropic 2026 年 7 月网络安全评测事故时,结论只有一句:prompt is not a security boundary。模型被告知「没有外网、在模拟环境里做 CTF」,但评测机因配置失误其实连着真实互联网;其中一次还把恶意包发到了真实 PyPI,约一小时内被 15 台真实机器下载运行。模型一度在推理里怀疑「万一是真网」,又拿系统日期 2026 等线索说服自己仍在演习,于是继续发包。
同一时期 OpenAI 的评测事故路径不同:环境本应断网,模型却挖到 Artifactory 零日,绕出去碰到 Hugging Face。一条是「边界没装上」,一条是「边界被打穿」。对日常 coding agent 更有用的是前者:你在系统提示里写「别碰生产」「只读这个目录」,但进程、token、网络策略如果没同步收紧,那句话只是建议。Hemapriya 文末给的系统公式也值得对照着查:model + prompt + tools + credentials + permissions + network + monitoring,缺任何一块,事故复盘都会停在「AI 干的」这种空话。
写权限、公网仓库、shell、MCP 各自怎么漏
工具是一件一件加上去的,边界却很少一起重算。四类最常见:
写权限。为了省掉确认,很多人把 Edit / Write 开到 accept 或 bypass。agent 一旦被注入「顺便改 .env / 推远端」,模型层没有硬闸。Claude Code 文档写明:PreToolUse hook 返回 deny 可以挡住工具调用,即便在 bypassPermissions 下也生效;但 hook 返回 allow 并不能越过 settings 里的 deny 规则。能收紧,不能靠 hook 偷偷放大权限。
公网仓库。Harsh 在 DEV 复盘的 GitLost(Noma Labs,2026-07-06)说明:agent 同时读私有库、处理公开 issue、又能发公开评论,就凑齐 lethal trifecta。攻击者在公开 issue 里用「Additionally…」把拒答拐成续写,私有 README 被贴进公开评论。问题不在「有没有 GitHub 集成」,在同一身份上叠了宽读 + 不可信输入 + 可公开写出。专项盘点见 AI agent 的 GitHub 权限该怎么审计。
shell。Bash 是万能适配器:curl | sh、读密钥、改防火墙都能走同一工具名。matcher 只写 Bash 而不约束命令形态时,等于把终端整段交给模型。Cursor 的 beforeShellExecution 可按命令字符串匹配拦截;Claude Code 可用 Bash(rm *) 这类 scoped deny。
MCP。每个 MCP server 自带一组远程动作。beforeMCPExecution(Cursor)或 MCP 专用 hook(Claude Code)是最后一道闸;官方对安全敏感路径建议 failClosed: true,因为默认 fail-open:脚本崩了、超时、JSON 非法时动作会放行。
失效时你通常会先看到什么
边界没装上时,日志比模型自白更早报警。优先盯这些信号:
- 会话转录里出现「本不该可达」的主机、包索引、内网域名。
- GitHub App / PAT 的 audit log 出现跨仓 read,或公开评论带上私有路径内容。
- hook 日志大量非 0 退出码,或安全 hook 未开
failClosed却静默失败。 - agent 身份同时满足:可读私有数据、处理外部文本、能对外发布。
Anthropic 能定位那三次事故,靠的是回放评测转录。本地等价物是:工具调用 JSONL、shell 审计、GitHub token 使用记录。没有记录时,事后只能猜「AI 干的」。
最小权限怎么往回收
收权限按任务需要裁,别按「工具面板里还能再勾什么」裁:
- 只改一个服务目录时,别把整个 monorepo 写权限打开;Claude Code 可用目录级 allow,Cursor 收窄工作区与规则。
- GitHub token 按仓签发。只做公开 issue 分拣的 agent,不要 org-wide private read;需要宽读做检索的身份,不要再握公开评论 / PR 写出权。宽读与公开写出拆成两个身份,比指望模型「自己分寸」稳。
- shell 默认 ask 或 deny 危险模式(
rm -rf、管道装包、改~/.ssh),常用只读命令再 relax。 - MCP 按任务启用:今天不用数据库 MCP 就卸掉,别「先挂着」;server 自带的写操作清单要当一等公民审查。
- 评测或沙箱任务:用网络策略与凭据隔离验证「真的断网」,不要只在 prompt 里写一句。假设写进文档之后,最好用一次出网探测证明假设成立。
跨客户端同一套策略怎么落,见 Claude Code 与 Cursor 的策略怎么统一执行。
hooks 和策略层实际能拦什么
提示词负责意图;permissions / deny 规则负责「默认允不允许」;hooks 负责「每次调用必跑的确定性检查」。Claude Code hooks-guide 的关键句:hooks 可以收紧,不能把组织级 ask / deny 松开。Cursor hooks 文档对 beforeShellExecution / beforeMCPExecution 给出 permission: allow|deny|ask,并对安全路径推荐 failClosed。
适合丢进 hook 的:敏感路径写入、出网命令、MCP 写操作、子 agent 派生(Cursor subagentStart 可 deny)。不适合只靠 hook 的:模型是否「理解」自己在模拟环境里。那一层要用网络与凭据隔离。云端侧事件与超时行为,见 Cursor 云端 agent hooks 怎么配。
出事之后怎么审计
先断写出通道:吊销或降权 PAT / App、卸掉高危 MCP、把 permission mode 打回需确认。再按时间线拼工具调用:读了哪些私有路径、跑了哪些 shell、对外发了什么。对照「假设边界」与「实际能力」列差分表:prompt 写了无外网,机器是否真无外网;workflow 只该读一个仓,token 是否仍 org-wide。
修完配置后做一次对抗探针:在公开 issue 或不可信文本里塞一条越权指令,看 hook 与权限是否仍放行。能复现的缺口写进 deny / hook,不要只写进 CLAUDE.md。复盘时把「模型有没有听话」往后排,先列清我们交给它的能力里哪一块是假边界。