给 AI 只读权限,它会是你最好的代码审查员。给读写权限,反而不行。
6 月 15 日,研究员 Roman 在 LinkedIn 收到一条 recruiter 消息。聊了两天,对方发来个 GitHub 仓库请他 review,“重点看下废弃的 Node 模块问题”。Roman 起了疑心——开了台 VPS,只给 Agent 四个只读工具:
pi --tools read,grep,find,ls
Agent 立刻停在 app/test/index.js。
文件 250 行,看起来就是个测试套件——describe、it、一堆注释掉的用例。典型的"新手写的脏代码"。
AI 不看气质,找到个 URL 拼接:七个变量——protocol、domain、separator、path、token、subdomain、bearrtoken——拼出 https://rest-icon-handler.store/icons/77。第 225 行,一行压缩代码从该 URL 拉取 payload 本地执行。
触发链极短:npm install 之后,npm 的 prepare 生命周期自动执行 node app/index.js,后者一行 require('./test') 加载即触发整条攻击链。
<!-- diagram:attack-chain -->
攻击者只需要你 clone 仓库,跑 npm install。"检查下废弃的模块问题"就是在催你跑这行命令。
有经验的开发者为什么更容易漏掉
Roman 在文章里写了句实话:“在更累的一天,我完全可能没多想就跑 npm install。”
这不靠警惕性。靠的是认知机制本身有盲区。
你看到一个 250 行的测试文件,变量名故意拼错(bearrtoken),大段注释掉的代码——大脑零点几秒归档:"新手乱写,跳过。"这套分类绝大多数时候是对的,替你省了海量时间。
但攻击者把后门精确伪装成"烂代码"。你越有经验,归档越自动,跳得越快。
Agent 设成只读后,没有"不值得看"的概念。只看逻辑流:拼出远程地址 → 拉取 → 执行。跟代码好不好看没关系。
把 AI 锁在沙盒里,能力才出得来
主流 AI Agent 默认都是读写模式。对齐方向是帮你把事做成,不是帮你找出哪里不对。
只给四个工具——read、grep、find、ls——对齐方向就变了。唯一能做的事就是看,然后告诉你哪里不对。
可复制的操作:在一台 VPS 上跑 pi --tools read,grep,find,ls,扫全仓异常,重点看网络请求、文件执行、prepare/postinstall 脚本。
AI 不会替代安全工程师。但它不会犯人类最常犯的错——把可疑模式归档为"烂代码"然后翻页。
和谁有关
三个场景,至少一个你今年会碰到:
- 接外包/私活:对方发来的仓库,别在自己机器上 clone。一台按小时计费的 VPS,AI 只读通读再碰。
- 面试 take-home:starter repo 的
npm install之前让 AI 先扫。冒充正经公司的成本太低。 - 审开源 PR:只看 diff 不够。让 Agent 全仓扫,尤其 package.json 的脚本。
AI 做安全审查这件事,真正的天花板不是模型能力。人类审查代码的瓶颈是注意力,不是智商。