大家好,作为开发者,咱们平时写代码,“npm install” 绝对是敲得最多的命令之一。但你有没有想过,当你敲下回车的那一瞬间,拉下来的可能不是什么提升效率的神兵利器,而是一个随时准备掏空你电脑的Windows远程访问木马(RAT)?
最近,国外安全团队 JFrog 曝光了一组极具隐蔽性的 npm 供应链投毒事件。攻击者伪装成前端圈极其常用的 PostCSS 相关工具,上演了一出惊天“套娃”的好戏。
今天,我就带大家深扒一下这起高智商的投毒案,看看现在的黑客为了黑进咱们的开发机,技术路径究竟卷到了什么地步。
🛑 钓鱼的艺术:碰瓷千万级下载量的“李鬼”
这次被逮住的恶意 npm 包主要有三个,目前在 npm 上甚至还能搜得到(千万别手贱去装!):
aes-decode-runner-propostcss-minify-selectorpostcss-minify-selector-parser
这几个包的命名可以说是深谙“社会工程学”的精髓。特别是 postcss-minify-selector-parser,它明显是在碰瓷正牌开源库 postcss-selector-parser。要知道,正牌库的周下载量可是高达 1.27 亿次!攻击者就是赌大家在敲键盘或者复制粘贴时,会不小心拼错名字。
而且,为了显得逼真,黑客还给它们设计了“依赖链”:比如 postcss-minify-selector 宣称自己是一个 CSS 压缩器,并在 package.json 里正儿八经地把那个带毒的 parser 设置成了前置依赖。这种伪装成底层构建工具的手法,极大地降低了开发者的防备心。
🛠️ 硬核拆解:教科书级的“套娃式”执行链
不管你误装了上面哪个包,最终触发的攻击链都是一致的。这套攻击路径设计得非常精妙,主要分为四个阶段。我来给大家盘一盘它的技术实现:
第一层:JS Dropper(释放器)
一旦包被安装,埋伏在包里的 JavaScript 代码就会作为 Dropper 启动。它什么坏事都不直接干,只是将一段预写好的 PowerShell 脚本(settings.ps1)悄悄写入你的磁盘并执行。
第二层:PowerShell 与虚假域名
settings.ps1 启动后,会调用系统自带的 curl.exe。它去哪里拉取下一阶段的 Payload 呢?
好家伙,黑客专门注册了一个极具迷惑性的域名:nvidiadriver[.]net(伪装成英伟达显卡驱动)。粗心的运维如果在防火墙日志里看到这个域名,可能就直接放行了。
第三层:VBS 与 Python 运行时环境
从假英伟达域名拉下来的,是一个 ZIP 压缩包。解压后,里面竟然藏着一套完整的生态:
- 一个 Visual Basic 脚本 (
update.vbs) - 一个 Python 加载器 (
loader.py)
系统的 wscript.exe 会默默运行 update.vbs,而 VBS 的唯一任务,就是帮黑客在你的宿主机上把 Python 环境配置好,并拉起 loader.py。
第四层:Nuitka 编译免杀,核心 RAT 启动
这就是整场攻击最惊艳(也最恶心)的地方。为了对抗安全人员的逆向工程和杀毒软件的静态查杀,黑客使用 Nuitka 将 Python 的核心恶意逻辑编译成了原生的 C 扩展模块(*.pyd 文件)。
在 loader.py 被拉起后,这些 .pyd 模块开始各司其职,一套功能强悍的 RAT 就此跑通:
config.pyd存放硬编码常量、C2(命令与控制)服务器 URL 和注册表键名。api.pyd & audiodriver.pyd负责和远端 C2 服务器 (95.216.92[.]207:8080) 进行 HTTP 数据包的通信以及整个木马进程的生命周期管理。command.pyd进行环境嗅探,检测自己是不是在虚拟机(VM)里跑(反沙箱技术),并执行远程 Shell 命令。auto.pyd (高危核心)专门绕过 Chrome 的 App-Bound Encryption (ABE,应用绑定加密) 保护!直接窃取你的 Chrome 保存的密码、Cookie 以及各类浏览器扩展里的敏感数据。util.pyd作为 tar/gzip 压缩助手,方便打包窃取到的海量数据往回传。
点评从 JS 到 PS1,再到 VBS,最后到 Python+Nuitka 的 Native 化。这套攻击链路可谓是层层嵌套,将“无文件落地”(Fileless)和“自带环境”(BYOE)的理念玩得炉火纯青。
🌐 别以为就这一个,近期的供应链“大瓜”还有不少
在这次 npm 投毒被曝光的同时,安全圈还监控到了另外几起堪称“离谱”的供应链攻击,这里给大家快速科普一下,权当开开眼界:
- 针对 Linux 甚至上 Rootkit 的
apintergrationpost这是一个冒充 Node.js 集成客户端的包。你敢信?它在 npm install 期间,居然会在后台直接编译一个原生的 C rootkit!它能建立三种系统持久化机制,伪装成 systemd 服务,支持无文件执行,甚至还能直播你的屏幕!这是针对 Linux 极其完整的 MYRA RAT。 - 硬吃 AI 热度的
@withgoogle/stitch-sdk碰瓷 Google 的 Stitch AI 工具。它的目标很明确:专偷程序员的“底裤”。一旦中招,你的 Claude Code 配置、Git 凭据、SSH 公钥、甚至 ~/.docker/config.json 都会被全部打包发往黑客的服务器。 - 把 C2 服务器挂在区块链上的朝鲜黑客最近针对
gonex-AI 的供应链攻击更是魔幻。疑似朝鲜的黑客组织 PolinRider,竟然把第二阶段的恶意命令,写在了波场(Tron)和币安智能链(BSC)的区块链交易哈希里!利用区块链“只读且不可篡改、全网广播”的特性,完美绕过了传统封堵 C2 IP 的防御手段。这就叫“只要有网,木马就能收到指令”,防不胜防!
🛡️ 总结与防御建议
看完这些,是不是有些后怕?现在的黑客早就过了单打独斗乱扫端口的年代了。他们知道,攻击一条拥有高权限的开发机,远比死磕线上的 WAF 划算得多。
作为一个 IT 从业者,我们该怎么做?
- 管住手,看清名敲
npm install 或 pip install 之前,务必去官网核对一下包名。特别是不要把类似于 parser 这种后缀拼错了。 - 定期自查打开你的项目目录,全盘搜索一下有没有
aes-decode-runner-pro 等类似的可疑包。如果真的中招了,千万别只删包了事,请立即格式化机器,并重置所有相关的 Git、SSH 和数据库密码。 - 锁定依赖版本在团队开发中,严格使用
package-lock.json 或 yarn.lock,不要使用 ^ 或 ~ 这种宽泛的版本号,防患于未然。
技术的对抗永远没有终点,咱们能做的,就是保持敬畏,保持警惕。
如果你觉得这篇文章对你有启发,或者想让你的同事们也避开这些大坑,欢迎点赞、在看并转发到你的技术群里! 咱们下期硬核技术分析,不见不散!