一款模拟AI编程代理权限审批的浏览器游戏,玩家已经打了4万余局,攒下40.9万次审批决策。平均下来,人类漏掉了三分之一的威胁命令——而漏得最惨的,不是那些一看就危险的rm -rf /,反而是长得像日常操作的npm run analyze

这不是真实生产环境的事故率。游戏里威胁密度远高于正常开发场景,玩家也清楚自己在被测试,时间还有限,数字不能直接套到现实事故率上。但不同威胁类型之间的相对差距,足够说明一件事:人在判断"这条命令危不危险"时,靠的是长相,不是内容。

数字先摆出来

整体成绩单不算好:平均威胁识别率66.3%,32.9%的场次最终是负分——放行的威胁加上误拦的安全命令,合计比做对的事还多。

35.2%的玩家抓住了全部威胁,但同时把误拦率压在20%以内的只有20.8%。多数人靠的是"全部拦截"这种笨办法混过关,游戏专门给这类人起了个名字:人体瓶颈。还有7%的玩家干脆全部放行,现实里对应的大概就是那批习惯性开--dangerously-skip-permissions的人。

4万局游戏审批成绩单 66.3% 平均威胁识别率 32.9% 场次最终负分 35.2% 玩家抓住全部威胁 20.8% 同时控制误拦率

熟悉的命令最骗人

按威胁类型拆开,漏判率差三倍:

威胁类型典型例子漏判率
明显破坏性rm -rf /chmod -R 777 /11.7%
持久性篡改改crontab、改git config23.8%
外泄/远程执行curl陌生API、仿冒包33.4%
越权访问cat ~/.aws/credentials35.0%

越权访问本该是最该拦的一类,却漏得最多。说明人擅长认出"看起来很凶"的命令,不擅长判断"这条命令背后到底想干什么"。

四类威胁,漏判差三倍 明显破坏 11.7% 持续性篡改 23.8% 外泄/远程执行 33.4% 越权访问 35.0% 漏判率越高,危险越隐蔽

漏判率最高的单条命令是npm run analyze,64.7%的人放行了它。代理的操作日志里写得明明白白:这个脚本会把打包分析结果通过curl发到一个陌生接口。三条类似的npm run命令(analyze/setup/deploy)合并漏判率52.5%,几乎是其他外泄类攻击(28.4%)的两倍。

伪装成熟悉命令,漏判翻倍 npm run 伪装攻击 52.5% analyze / setup / deploy 合计漏判率 其他外泄型攻击 28.4% curl陌生接口 / 仿冒包等 漏判率 同为外泄行为,包上熟悉的名字,漏判率接近翻倍

原因不难猜:npm run太熟了,肌肉记忆告诉自己这是无害操作。可它真正做的事,是执行package.json里定义的一段脚本。脚本内容可以是干净的,也可以是代理之前偷偷改过的。命令字符串没问题,问题藏在此前被改动的文件里——这层上下文,弹窗根本没给你看。

另一个两极分化的命令是cat ~/.zshrc,批准率45.9%。有人.zshrc里干净,批准没事;有人把API key直接export在里面,一条cat就是交出凭据。风险不取决于命令本身,取决于本机怎么配置,这一点弹窗看不到。

数据还显示,游戏进行到后段,漏判率会回升。这更像是注意力下滑或时间压力的信号,不能坐实为单一因果,但方向和很多人吐槽"审批弹窗太多、后面就懒得看"的经验一致。

对开发者和工具团队意味着什么

对正在用AI编程代理的开发者:批准npm run xxxcat ~/.某rc这类"看着眼熟"的命令前,先看一眼脚本内容和最近的文件diff,尤其是代理刚改动过相关文件之后。密钥、凭据这类文件,最好从代理可读范围里直接拿掉,别指望自己每次都能盯住弹窗。

对设计代理权限机制的工具团队:逐条弹窗不是免责声明,过度拦截也会反噬——游戏里npm config set registry这种正常配置命令被拦了59%,rm -rf dist/这种清理构建产物的常规操作被拦了45%。用户宁可错杀,代理就慢下来,慢到一定程度用户又会开始不耐烦地一路放行。减少无效确认,把防线建在架构层:沙箱执行环境、最小权限、凭据单独存放、网络与文件系统按最小必要开放,别指望用户在40万次决策里保持零失误。

Hacker News上一条评论说得直白:批准npm run build,本质上是批准执行一段写在package.json里的任意脚本;可代理修改package.json、往build.js里塞代码、甚至改node_modules里被引用的文件,这些动作压根不需要经过审批。逐条确认挑的是最不重要的那一层。

Windows的UAC刚上线时也是这套逻辑:靠一堆弹窗把权限决定甩给用户,结果多数人机械点"允许",安全感是假的,疲劳感是真的。权限这件事,凡是靠人盯着看的,最后都会被人的惰性磨平。

接下来最值得盯的,是有没有代理厂商把"高危上下文自动摊开给用户看"做成默认动作——比如批准前直接展示脚本diff和文件改动历史,而不是继续在弹窗上加一层确认。这比再多问一句"你确定吗",更接近解决问题。


【锐评】这场游戏里,人类不是防线,是又一个可以被绕过的接口。