
最近,一则来自国外安全媒体的重磅消息让整个开发社区震动:每周下载量超过1亿次的流行HTTP客户端库Axios,成为了朝鲜国家级黑客组织UNC1069的攻击目标。
攻击手法并非利用复杂的0-day漏洞,而是通过社会工程学手段,成功盗取了Axios核心维护者Jason Saayman的npm官方账号权限。在掌握最高控制权后,攻击者向全球发布了两个带有恶意后门的版本:1.14.1和0.30.4。
你可能会有疑问:npm、Axios到底是什么?为什么它们的沦陷会引发如此大的关注?
理解被攻击的“数字基础设施”
-
npm:软件供应链的核心仓库
npm(Node Package Manager)是Node.js的官方包管理器,可以看作是开发者专属的“应用商店”。开发者通过package.json文件声明项目依赖,运行npm install后,npm会自动从云端下载所有需要的组件。这个生态的繁荣也带来了致命弱点:过长的信任链。任何一个流行包的维护者账号失守,都可能让依赖它的成千上万个项目瞬间沦陷。
-
Node.js:现代应用与AI的底层引擎
Node.js是基于JavaScript的服务器运行环境,是现代网页后端、自动化脚本乃至当前火热的AI智能体(如OpenClaw) 的常见运行底座。其生态依赖关系复杂,一个中型项目可能嵌套数千个包,使得供应链攻击的风险呈指数级放大。
-
Axios:无处不在的网络“信使”
Axios是前端和Node.js领域最主流的HTTP请求库。几乎任何需要与后端API或外部服务(如调用ChatGPT接口)通信的程序都在使用它。它的绝对统治地位意味着,一旦Axios被成功投毒,影响范围将如同在自来水系统中下毒般广泛。
攻击链拆解:一场“隐形”的完美犯罪
UNC1069这次实施的是一种典型的“依赖劫持”攻击,其高明之处在于完全避开了对核心源码的修改,让常规代码审查和漏洞扫描工具失效。
第一步:修改package.json,植入恶意依赖
攻击者在上传Axios 1.14.1时,并未改动核心业务代码,而是只修改了package.json文件,在其中强行添加了一个名为plain-crypto-js的依赖。
| Axios 版本状态 |
dependencies (依赖清单) |
危险程度 |
| 正常版 (1.14.0) |
仅包含follow-redirects,form-data等正常依赖 |
安全 ✅ |
| 恶意版 (1.14.1) |
正常依赖 + "plain-crypto-js": "x.x.x" |
极高风险 💀 |
开发者审查代码差异时,注意力通常集中在src目录下的业务逻辑,极易忽略配置文件中多出的这一个“不起眼”的包。
第二步:利用postinstall钩子,实现“安装即执行”
恶意包plain-crypto-js内部隐藏了致命机关。在其package.json中,攻击者设置了postinstall脚本钩子:
"scripts": {
"postinstall": "node setup.js"
}
postinstall是npm的生命周期钩子,其含义是“在包安装完成后,自动执行指定命令”。这意味着:受害者无需在代码中显式引入(require)这个恶意包,甚至无需启动项目。只要npm install执行完毕,恶意的setup.js脚本就会在后台静默运行。 整个过程没有弹窗、没有提示。
第三步:多平台适配攻击载荷
setup.js(安全研究人员将其命名为SILKBELL)充当了载荷分发器的角色。它会首先探测受害者的操作系统,然后精准投递对应的后门程序:
- Windows:释放隐藏的VBS脚本,进而拉起PowerShell执行载荷,尝试绕过安全软件。
- macOS:写入AppleScript,将编译好的Mach-O恶意二进制文件伪装成系统缓存文件(如
com.apple.act.mond),实现后台持久化。
- Linux/服务器:针对常见的CI/CD构建环境,下载Python后门脚本,并使用
nohup等命令使其在后台持续运行。
第四步:反取证与痕迹清除
为了增加事后分析的难度,该恶意脚本执行后会进行一系列“毁尸灭迹”操作:删除自身脚本、删除包含恶意postinstall的package.json,并用一个预先准备好的、内容干净的package.md文件替换为package.json。这使得安全人员在案发后检查node_modules目录时,难以发现直接的恶意文件证据。
第五步:植入高级持久化后门WAVESHAPER.V2
最终,攻击者会在受害机器上植入名为WAVESHAPER.V2的后门程序。该后门具备心跳机制(约每60秒与攻击者的C2服务器通信一次),并拥有多种高危能力:
kill:自我销毁,清除痕迹。
rundir:扫描磁盘目录和文件。
runscript:在受害者机器上执行任意Shell、PowerShell或AppleScript命令。
peinject:将更深层的恶意二进制文件直接注入到系统内存中运行,实现文件不落地的无文件攻击,规避传统杀毒软件的检测。
对AI智能体的潜在影响
本次攻击的深远影响在于其对上层应用,特别是AI智能体的威胁。像OpenClaw这类运行在Node.js环境中的AI应用,其底层依赖Axios进行网络通信。一旦部署环境在构建或更新时不慎安装了恶意版本的Axios,AI智能体本身就会在不知不觉中被“夺舍”。
攻击者可以利用已植入的远控后门,窃取AI智能体访问的敏感数据(如API密钥、私有模型参数)、篡改其决策逻辑的输出,甚至将其作为跳板,进一步渗透企业内网。这种从底层基础设施发起的供应链攻击,对高度依赖自动化与智能化的现代IT体系构成了严峻挑战。
安全建议与反思
- 锁定依赖版本:在
package.json中精确指定依赖包版本,避免使用波浪号(~)或插入符(^)等自动更新版本范围的符号。
- 启用依赖审计:定期使用
npm audit或集成类似的软件成分分析(SCA)工具,检查项目依赖中的已知漏洞。
- 审查
package.json变更:在更新任何依赖时,仔细查看package.json的diff,警惕新增的、来源不明的依赖项。
- 谨慎对待
postinstall等脚本:对于开源依赖,可审查其package.json中的脚本定义。在企业环境中,可以考虑配置npm或yarn,禁止运行生命周期脚本。
- 采用私有镜像源与安全扫描:企业应搭建内部的私有包镜像,并在镜像入口处实施严格的安全扫描和恶意代码检测。
这次事件再次凸显了开源软件供应链安全的极端重要性。作为开发者,我们需要时刻保持警惕,构建纵深防御体系。同时,关注和参与云栈社区等平台的安全讨论,共享威胁情报,是提升整体生态安全水位的关键。