npm install 那一刻,后门已经在你机器上跑了
你在 LinkedIn 上接到一个招聘。对方头像是个有头有脸的人,自称某加密创业公司在找 lead engineer,手上有个"坏掉的 POC"想请你帮忙看看。聊了几轮,挺客气,发来一个公开的 GitHub 仓库,说"麻烦看看那个过时的 Node 依赖"。
你 clone 下来,npm install。一句话还没回,后门已经连上了攻击者的服务器。
最近有人完整记录了这次攻击的全过程。看下来你会发现,攻的根本不是什么漏洞——是我们这些天天 npm install 的人,做笔试题、装依赖时那套毫不设防的肌肉记忆。
它是怎么一步步进你电脑的
-
入口是一个假招聘。 头像冒用了一位真实的知名艺术记者,profile 看着像那么回事。先聊几轮、建立信任,让你觉得这是个正常机会,而不是天上掉下来的可疑链接。
-
诱饵是一个公开仓库。 他特意请你"看看那个过时 Node 依赖的问题"。这句话听着像技术求助,目的只有一个:让你把仓库拉下来、把依赖装上。
-
致命的是 install 那一刻。 npm 的
prepare脚本会在npm install之后自动执行。这个仓库的 package.json 里,prepare触发app:pre,跑node app/index.js,再require ./test——而 test 就是后门。你什么都没主动运行,代码已经跑起来了。 -
后门藏在一个假测试文件里。 真正的恶意载荷在
app/test/index.js,约 250 行,看着就是个测试文件,周围全是注释掉的测试代码做掩护。真东西压在一行 minified 代码里。连请求地址都被拆成碎片——"https"、"store"、"rest-icon-handler"、"/icons/77"——拼起来才是攻击者的服务器,专门躲检测。 -
连上之后,控制权就交出去了。 服务器发什么,你机器上就跑什么。等于把这台机器、连同它能碰到的内网,一起送了出去。
-
它是怎么暴露的。 那个开发者没在本机 clone。他用了一台抛弃型 VPS,外加一个只读模式的 AI agent——只给它读文件的权限,不给执行。AI 几秒钟就停下来报警了。
顺一句旁证:commit 历史里,那个被冒用的开发者根本没在那家公司干过,之前就被假冒过。招聘者的 profile 没有任何技术内容,可一旦被追问,又突然能跟你争 Node 版本对不对。哪儿都对不上。

防住它,记住这几条
-
陌生代码先进沙箱。 VM、容器、抛弃型机器里装、里跑。主力机上永远别裸跑
npm install——你的浏览器 cookie、SSH key、公司内网都在这台机器上。 -
装之前先看生命周期脚本。 package.json 里的
prepare、postinstall会自动执行,不需要你点任何东西。这是整个攻击最该警惕的位置,看一眼花不了十秒。 -
核对对接人身份。 profile 跟真人对得上吗?一个没有任何技术背景的人,突然能跟你争 Node 版本,这就是信号。身份越是经不起追问,越要小心。
-
让 AI 只读扫一遍。 给它读文件的权限,别给执行的权限,让它先过一遍可疑代码。这次救场的就是这一步——它比人快,也不会因为对方客气就放松。
-
觉得不对就停。 不请自来的"帮我看看代码",多一份警惕不亏。停下来确认的成本,远低于把机器交出去。
评估一段陌生代码值不值得跑,其实就两个问题:它装的时候会不会自动执行什么,我现在是不是在沙箱里。两个都过了再动手。
攻的不是漏洞,是你每天闭着眼做的那两件事——做笔试题,装依赖。
