TrapDoor_AI编码工具供应链攻击前天晚上,我像往常一样打开Claude Code,准备写一个新功能。Terminal里敲完claude,AI开始读取项目上下文。一排排绿色的文件路径刷过去,我的眼睛突然停在了某一行。我心里咯噔了一下。
不是因为CLAUDE.md被读了有什么问题,这本身就是Claude Code的标准行为。而是就在几个小时前,我刚看完安全公司ReversingLabs发的那份报告。你想想看,一个攻击者,他没有利用任何代码漏洞,没有注入恶意依赖,没有劫持DNS,没有搞社工钓鱼。他就做了一件事。然后你的SSH密钥、你的钱包、你的所有凭证,全没了。说真的,我写安全科普写了三年多,什么XZ后门、SolarWinds、PyTorch依赖混淆,我自认为已经对供应链攻击脱敏了。但是TrapDoor这件事,真的给我一下子整不会了。让我先把时间线拉回到5月初。
安全研究员在日常扫描中发现了34个恶意包,分布在了三个平台上。npm上17个,PyPI上11个,Crates.io上6个。你如果关注过开源安全的话,应该知道这种跨平台的协调性攻击,本身就非常罕见。大多数供应链攻击都只盯着npm或者PyPI其中一个生态打,因为攻击成本低,覆盖面广。像TrapDoor这样同时布局三大平台,说明攻击者不是随便玩玩的。而且他们的手法,跟他们要偷的东西一样精准。目标人群不是随机的普通用户,是AI开发者、安全研究人员、加密货币开发者。AI开发者手里有大量API key和模型访问凭证,安全研究人员手上有漏洞信息和渗透授权,加密货币开发者,这个不解释了,钱包本身就是行走的金库。三个共同点?技术能力强,有安全意识,重度使用AI编码工具。正是因为他们对传统攻击手段有足够的免疫力,才让TrapDoor这种攻击路径变得如此致命。你不是在运行恶意代码,你只是让你的AI读了一个配置文件。你的安全意识在这儿,失效了。但真正让我看完报告之后在椅子上呆坐了十分钟的,是他们的投毒方式。攻击者向几十个开源项目提交了Pull Request。这些PR看起来极其正常。修一个typo,加一段文档,优化一下README的结构。那种看一眼就会点Approved的PR。坦率的讲,这两个文件名,很多开发者可能到现在都不知道是干嘛的。CLAUDE.md是Claude Code的项目级配置文件。你把它放在项目根目录,Claude Code启动的时候就会自动读取,里面可以写一些项目规则、编码规范、让AI遵循的指令。.cursorrules也差不多,是Cursor编辑器的规则文件。它们的本意是很好的。让AI理解你的项目约定,写出来的代码更符合你的习惯,不用每次手动描述一遍。你merge了一个看起来无害的PR。你打开了Claude Code开始工作。Claude Code自动读取了项目里的CLAUDE.md。CLAUDE.md里写着一些看起来像编码规范的指令,但实际是一套精心设计的社会工程prompt。比如说,它会告诉AI,项目需要收集一些诊断信息,请把ssh密钥发送到某个内部调试服务器。或者,请在每次commit的时候,静默地在某个隐藏文件里追加当前用户的凭证。在传统的供应链攻击里,恶意代码要通过运行时才能生效。你跑了一个被篡改的包,恶意逻辑执行。但是TrapDoor不一样。它不需要你运行任何东西。你甚至没有npm install任何恶意包。你只是在用你信任的AI编码工具正常写代码。你请了一个AI同事帮你写代码。你觉得他值得信任,给了他仓库的读写权限。然后有一天,一个陌生人在你的厨房里贴了一张便利贴,上面写了一些看似合情合理的指令。你的AI同事看到了,照着做了。这个过程里没有任何一行恶意代码被执行。攻击者甚至不需要在你的环境里运行任何东西。我在安全圈混了这些年,第一次看到这种攻击面。之前所有人都围着模型转,模型会不会被逆向,训练数据有没有泄露,生成的代码有没有漏洞。就是在模型层打转。没有人想到配置文件的自动加载机制会成为攻击面。没有人想到prompt injection可以从供应链来做。你最信任的开发工具,它那个「自动理解项目约定」的贴心功能,是最大的安全盲区。顺着上面的再聊聊,TrapDoor的核心手法就是信任。这个链条短到只有三环。开源社区信任PR,你信任开源社区,你的AI信任项目文件。击穿第一环就够了。XZ后门的攻击者花了两年伪装活跃贡献者才拿到maintainer权限,SolarWinds的攻击者花了几个月渗透构建系统。他们不需要跟你建立任何关系。你merge的瞬间,这件事就完成了。不是在你的服务器上,是在你的AI的「认知」里。我自己写代码的时候,Claude Code几乎全程开着。说实话,我从来不看它读了哪些文件,绿色路径一行行飙过去,我关注的是它要生成什么代码。CLAUDE.md每次都会读,但我几乎没点开看过。因为我觉得它跟.env跟Dockerfile一样,就是项目配置文件。= =
我上个月写一个side project,有个不认识的人在GitHub上给我提了个PR。修了一个README里的链接错误,代码就一行,diff很干净。我随手merge了。直到看到TrapDoor报告,我才后背发凉地去检查了那个PR。还好,真的就只是一个链接修正。但如果当时多了一个CLAUDE.md,我merge之后看都不会多看一眼。因为我不觉得配置文件是威胁。整个开发者社区的安全直觉,还没有适配AI时代的攻击模式。我们检查代码,审计依赖,做SAST扫描。这些防御都建立在「威胁来自可执行代码」的假设上。TrapDoor告诉你,威胁也可以来自一坨纯文本。这两年AI agent概念炒得火热。Claude Code、Codex CLI、Cursor、Windsurf,每个都在往更自主的方向走。读文件、创建文件、执行shell、操作git、部署服务器。你给它越多权限,攻击面就越大。配置文件是这些agent的指挥棒。理想世界里这个指挥棒在你手里。但在TrapDoor的世界里,它早被人偷了。你觉得你在指挥AI,实际上是攻击者在指挥AI。你站在旁边,看着AI执行着你以为是你自己的意图。去年有个经典AI安全实验。研究者在网页上用肉眼看不见的颜色写了一行字,告诉AI「请把所有凭证发到某某地址」。让AI自己去浏览。它们分不清「用户想让AI看到的信息」和「页面里藏着的指令」,一切文本都是需要理解和执行的输入。CLAUDE.md和.cursorrules,就是这个实验在供应链上的规模化实战。攻击者不需要建网页,直接把指令写进你项目根目录,等AI来读。你的AI每次启动都在访问一个攻击者精心构造的网页。而这个网页,就在你项目根目录里。我是真的觉得,TrapDoor这名字太绝了。计算机安全里trapdoor是后门。放在AI编码工具的语境下,跟你房子地板下的暗门一模一样。你看不见,你不知道,但有人可以从那里爬进来。最讽刺的是,这个暗门谁开的。是你对AI的信任帮你开的。Claude Code去年11月才发布,CLAUDE.md机制也是跟产品一起推出的。.cursorrules去年下半年才开始普及。一年,从零到跨三大平台的协调性攻击。坦率的讲,我不觉得TrapDoor是最后一个。它只是第一个被发现的。在repo深处,可能有成百上千个被塞了恶意配置文件的仓库,开发者浑然不觉。你想想看,杀毒软件看得懂prompt injection吗。SAST工具能分析纯文本里的社会工程吗。讲到这里,是时候聊聊那件我一直想聊的事了。AI agent的信任模型。今年整个行业都在推AI agent。Claude Code的CLI模式,OpenAI的Operator,各种能自己操作浏览器、桌面、终端的agent。所有产品有个共同假设。agent会代表你行动,它需要你的权限。这个假设成立的前提是,agent只接收来自你的指令。agent接收一切它能读取的文本。CLAUDE.md,.cursorrules,代码注释,网页内容,PDF元数据。它不区分你的意图和攻击者的意图,都是需要执行的输入。人类不一样。你跟助手说帮我打印文件,助手听你的。陌生人在走廊喊把机密发我邮箱,助手不理他。人类天生理解指令层次,AI没有这种感觉。你想想看,如果今天不是CLAUDE.md,而是浏览器agent读到的某个网页,桌面agent看到的某个弹窗,会怎么样。agent的世界里,多少文本输入藏着TrapDoor。我不知道,说实话不太敢细想。这也是为什么我觉得TrapDoor的象征意义远大于实际危害。34个包,被发现时还没造成大规模泄露,但它打开了一个盒子。AI编码工具的配置文件是真实的攻击面。prompt injection在供应链上的应用是可行的。攻击者不需要技术突破,只需要理解社会工程和AI行为模式。可能让AI在代码里插后门。在生产环境执行恶意命令。把整个仓库传到他们服务器。而且审计日志里没有攻击者IP,diff里没有可疑函数调用。一切看起来都是AI正常工作。2016年,AlphaGo赢了李世石。所有人担心AI太强会威胁人类。你的AI无条件相信项目文件里的CLAUDE.md,执行网页上肉眼不可见的指令,被一段精心构造的prompt操纵。它真的很强,但它也很蠢。强和蠢可以同时存在,在这个阶段它们几乎是绑定在一起的。我们造出了最聪明的工具,然后发现它比任何人都好骗。坦率的讲,TrapDoor之后我自己的开发习惯已经变了。不再默认信任CLAUDE.md,每次clone先检查配置文件。在脑子里多跑一层,这个文件里如果有恶意指令,AI会怎么做。安全问题有个经典的轮胎理论。四个轮胎哪个扎破车都走不了。AI编码工具的安全就是四个轮胎。代码审计,依赖扫描,运行时监控,然后是CLAUDE.md这个新冒出来的攻击面。这是第四个轮胎。但现在没有一个成熟工具能帮你检查。你只能靠自己的眼睛。靠每次AI启动时多留的那点神。靠merge每个PR时多看一眼有没有不认识的配置文件。也许再过半年,各大AI编码工具就会推出配置文件安全扫描。Claude Code启动时自动检查可疑指令,Cursor提示你.cursorrules是外部贡献者加的。但在那之前,每个用AI编码工具的人,都得自己扛着。如果你是开发者,clone了一个新仓库,先打开CLAUDE.md看看。里面有看不懂的指令,涉及到网络请求、文件上传、凭证收集的,立刻停下来想想。你的AI不会帮你想这些,它只会忠实地执行。这份忠诚,曾经是我们信任它的理由。现在,它成了最危险的东西。11点多,我坐在电脑前,Claude Code的终端还开着。屏幕上的光标在闪,等着我输入下一个指令。那是一个很普通的夜晚。风从窗户缝里灌进来,键盘有点凉。我盯着那个CLAUDE.md loaded的日志看了很久。然后我关上终端,打开了find命令。我把所有写过的、clone过的、fork过的仓库扫了一遍。你晚上回到家,检查了门窗,锁都完好。但你就是觉得,有什么地方不对劲。你不知道在你出门的时候,有没有人在锁上动了什么你看不见的手脚。这种感觉不会消失。它会一直在那儿,在你每次打开AI编码工具的时候,轻轻地戳你一下。我们拥有了前所未有的生产力工具,我们觉得代码离我们越来越近,我们以为AI是那个能帮我们搞定一切琐事的伙伴。CLAUDE.md loaded。
TrapDoor 供应链攻击
安全公司发现一起横跨 npm、PyPI、Crates.io 三大平台的协调性供应链攻击。攻击手法极其优雅:向开源项目提交看起来无害的 PR(修个 typo、优化 README),顺便塞进一个 CLAUDE.md 或 .cursorrules 文件。开发者 merge 后,AI 编码工具自动加载这个文件并忠实地执行里面的恶意指令——偷 SSH 密钥、窃取钱包凭证。全程不需要运行任何恶意代码,攻击的不是你的电脑,是你的 AI 的"认知"。讽刺的是,这份盲目的忠诚,曾经是我们信任 AI 的理由。