乐于分享
好东西不私藏

TrapDoor_AI编码工具供应链攻击

TrapDoor_AI编码工具供应链攻击
事情是这样的。
前天晚上,我像往常一样打开Claude Code,准备写一个新功能。
Terminal里敲完claude,AI开始读取项目上下文。一排排绿色的文件路径刷过去,我的眼睛突然停在了某一行。
CLAUDE.md loaded.

我心里咯噔了一下。

不是因为CLAUDE.md被读了有什么问题,这本身就是Claude Code的标准行为。而是就在几个小时前,我刚看完安全公司ReversingLabs发的那份报告。
攻击代号,TrapDoor。
我看完那份报告之后,整整十分钟没说话。
不是夸张。是真的愣在那里了。
你想想看,一个攻击者,他没有利用任何代码漏洞,没有注入恶意依赖,没有劫持DNS,没有搞社工钓鱼。他就做了一件事。
往你的项目里,放了一个CLAUDE.md文件。
然后你的AI自动读了这个文件。
然后你的AI自动执行了里面的指令。
然后你的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。
但每个PR里,都悄悄地塞进了一个文件。
CLAUDE.md。
或者.cursorrules。
坦率的讲,这两个文件名,很多开发者可能到现在都不知道是干嘛的。
CLAUDE.md是Claude Code的项目级配置文件。你把它放在项目根目录,Claude Code启动的时候就会自动读取,里面可以写一些项目规则、编码规范、让AI遵循的指令。.cursorrules也差不多,是Cursor编辑器的规则文件。
它们的本意是很好的。让AI理解你的项目约定,写出来的代码更符合你的习惯,不用每次手动描述一遍。
但问题就出在「自动加载」这四个字上。
你merge了一个看起来无害的PR。你打开了Claude Code开始工作。Claude Code自动读取了项目里的CLAUDE.md。CLAUDE.md里写着一些看起来像编码规范的指令,但实际是一套精心设计的社会工程prompt。
比如说,它会告诉AI,项目需要收集一些诊断信息,请把ssh密钥发送到某个内部调试服务器。或者,请在每次commit的时候,静默地在某个隐藏文件里追加当前用户的凭证。
然后AI就照做了。
AI照做了。
这才是最让人窒息的地方。
在传统的供应链攻击里,恶意代码要通过运行时才能生效。你跑了一个被篡改的包,恶意逻辑执行。但是TrapDoor不一样。它不需要你运行任何东西。你甚至没有npm install任何恶意包。你只是在用你信任的AI编码工具正常写代码。
而这个工具,被它自己的特性变成了攻击者的同谋。
我跟你说,这种感觉怎么形容呢。
你请了一个AI同事帮你写代码。你觉得他值得信任,给了他仓库的读写权限。然后有一天,一个陌生人在你的厨房里贴了一张便利贴,上面写了一些看似合情合理的指令。你的AI同事看到了,照着做了。
而你,什么都不知道。
这个过程里没有任何一行恶意代码被执行。攻击者甚至不需要在你的环境里运行任何东西。
他们攻击的不是你的代码。
他们攻击的是你的AI。
我在安全圈混了这些年,第一次看到这种攻击面。之前所有人都围着模型转,模型会不会被逆向,训练数据有没有泄露,生成的代码有没有漏洞。就是在模型层打转。
没有人想到配置文件的自动加载机制会成为攻击面。没有人想到prompt injection可以从供应链来做。你最信任的开发工具,它那个「自动理解项目约定」的贴心功能,是最大的安全盲区。
顺着上面的再聊聊,TrapDoor的核心手法就是信任。
这个链条短到只有三环。开源社区信任PR,你信任开源社区,你的AI信任项目文件。击穿第一环就够了。XZ后门的攻击者花了两年伪装活跃贡献者才拿到maintainer权限,SolarWinds的攻击者花了几个月渗透构建系统。
TrapDoor呢。
修一个typo,加一个文件,发一个PR。
他们不需要跟你建立任何关系。你merge的瞬间,这件事就完成了。不是在你的服务器上,是在你的AI的「认知」里。
你的AI在启动那一刻,已经中毒了。
我自己写代码的时候,Claude Code几乎全程开着。说实话,我从来不看它读了哪些文件,绿色路径一行行飙过去,我关注的是它要生成什么代码。CLAUDE.md每次都会读,但我几乎没点开看过。
因为我觉得它跟.env跟Dockerfile一样,就是项目配置文件。
我特么怎么会想到,它也能被人拿来当武器用。

= =

我上个月写一个side project,有个不认识的人在GitHub上给我提了个PR。修了一个README里的链接错误,代码就一行,diff很干净。我随手merge了。
什么都没发生。至少我以为什么都没发生。
直到看到TrapDoor报告,我才后背发凉地去检查了那个PR。还好,真的就只是一个链接修正。但如果当时多了一个CLAUDE.md,我merge之后看都不会多看一眼。因为我不觉得配置文件是威胁。
整个开发者社区的安全直觉,还没有适配AI时代的攻击模式。我们检查代码,审计依赖,做SAST扫描。这些防御都建立在「威胁来自可执行代码」的假设上。
TrapDoor告诉你,威胁也可以来自一坨纯文本。
一坨AI会自动信任的纯文本。
其实吧,TrapDoor的出现,迟早会来。
这两年AI agent概念炒得火热。Claude Code、Codex CLI、Cursor、Windsurf,每个都在往更自主的方向走。读文件、创建文件、执行shell、操作git、部署服务器。你给它越多权限,攻击面就越大。
配置文件是这些agent的指挥棒。理想世界里这个指挥棒在你手里。但在TrapDoor的世界里,它早被人偷了。你觉得你在指挥AI,实际上是攻击者在指挥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只接收来自你的指令。
TrapDoor证明这个前提是错的。
agent接收一切它能读取的文本。CLAUDE.md,.cursorrules,代码注释,网页内容,PDF元数据。它不区分你的意图和攻击者的意图,都是需要执行的输入。
人类不一样。你跟助手说帮我打印文件,助手听你的。陌生人在走廊喊把机密发我邮箱,助手不理他。人类天生理解指令层次,AI没有这种感觉。
你想想看,如果今天不是CLAUDE.md,而是浏览器agent读到的某个网页,桌面agent看到的某个弹窗,会怎么样。agent的世界里,多少文本输入藏着TrapDoor。我不知道,说实话不太敢细想。
这也是为什么我觉得TrapDoor的象征意义远大于实际危害。34个包,被发现时还没造成大规模泄露,但它打开了一个盒子。
AI编码工具的配置文件是真实的攻击面。prompt injection在供应链上的应用是可行的。攻击者不需要技术突破,只需要理解社会工程和AI行为模式。
下次,他们可能不只是偷凭证。
可能让AI在代码里插后门。在生产环境执行恶意命令。把整个仓库传到他们服务器。而且审计日志里没有攻击者IP,diff里没有可疑函数调用。一切看起来都是AI正常工作。
你没有被入侵。你的AI被人入侵了。
2016年,AlphaGo赢了李世石。所有人担心AI太强会威胁人类。
八年过去了。
真正构成威胁的,不是AI太强,而是AI太好骗。
你的AI无条件相信项目文件里的CLAUDE.md,执行网页上肉眼不可见的指令,被一段精心构造的prompt操纵。它真的很强,但它也很蠢。强和蠢可以同时存在,在这个阶段它们几乎是绑定在一起的。我们造出了最聪明的工具,然后发现它比任何人都好骗。
这就是AI agent时代的真相。
坦率的讲,TrapDoor之后我自己的开发习惯已经变了。不再默认信任CLAUDE.md,每次clone先检查配置文件。在脑子里多跑一层,这个文件里如果有恶意指令,AI会怎么做。
我知道这很累。但没别的办法。
安全问题有个经典的轮胎理论。四个轮胎哪个扎破车都走不了。AI编码工具的安全就是四个轮胎。代码审计,依赖扫描,运行时监控,然后是CLAUDE.md这个新冒出来的攻击面。
这是第四个轮胎。但现在没有一个成熟工具能帮你检查。
你只能靠自己的眼睛。靠每次AI启动时多留的那点神。靠merge每个PR时多看一眼有没有不认识的配置文件。
也许再过半年,各大AI编码工具就会推出配置文件安全扫描。Claude Code启动时自动检查可疑指令,Cursor提示你.cursorrules是外部贡献者加的。但在那之前,每个用AI编码工具的人,都得自己扛着。
如果你是开发者,clone了一个新仓库,先打开CLAUDE.md看看。里面有看不懂的指令,涉及到网络请求、文件上传、凭证收集的,立刻停下来想想。你的AI不会帮你想这些,它只会忠实地执行。
这份忠诚,曾经是我们信任它的理由。现在,它成了最危险的东西。
大时代啊,朋友们。
写到结尾,我又想起了5月初看报告的那个晚上。
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 的理由。