Synth Daily

Axios 在 NPM 遭破坏——恶意版本植入远程控制木马

2026年3月30日,全球流行的 HTTP 客户端库 Axios 在 NPM 官方仓库遭到供应链攻击。攻击者通过劫持主要维护者的账号,发布了带有恶意代码的 1.14.10.30.4 版本。这些版本植入了一个名为 plain-crypto-js 的恶意依赖,通过安装脚本在 Windows、macOS 和 Linux 系统中植入远程访问木马(RAT),并具备极强的自毁和伪装能力。开发者若已安装上述版本,应视系统已被完全入侵,需立即采取降级版本、清理恶意文件及更换所有凭证的补救措施。

攻击手法:精准的账号劫持与流程绕过

攻击者并非通过常规的自动化流水线(CI/CD)发布版本,而是采用了更直接的手段:

  • 账号劫持:攻击者控制了 Axios 核心维护者的 NPM 账号,将关联邮箱修改为匿名邮箱,并利用泄露的 Access Token 手动发布了受损版本。
  • 绕过验证:由于是手动发布,这些版本缺少 GitHub Actions 的加密签名(OIDC 信任发布机制),且在 GitHub 源码仓库中找不到对应的提交记录或标签。
  • 预先部署:恶意依赖项 plain-crypto-js 在 Axios 受损版本发布前 18 小时就已上传至 NPM,旨在规避安全扫描器对“全新包”的警报。

恶意载荷:跨平台木马与证据清理

受损的 Axios 版本引入了名为 [email protected] 的依赖。该包在 Axios 源码中从未被引用,其唯一目的就是执行恶意安装脚本。

核心威胁:该恶意依赖包含一个 postinstall 钩子,一旦开发者运行 npm install,木马就会自动触发,无需任何额外的代码调用。

1. 针对不同操作系统的攻击

木马会检测宿主系统并分发不同的二次载荷:

  • macOS:下载二进制文件并伪装成苹果系统路径 /Library/Caches/com.apple.act.mond(模仿活动监视器守护进程)。
  • Windows:将 PowerShell 副本重命名为 wt.exe 以实现持久化,并通过隐藏窗口运行木马脚本。
  • Linux:下载并运行 Python 编写的木马载荷 /tmp/ld.py

2. 隐蔽与自毁机制

为了逃避取证分析,恶意脚本在执行后会进行“清道夫”作业:

  • 删除自身:删除安装脚本文件 setup.js
  • 篡改配置:删除包含恶意钩子的 package.json,并用一个干净的备份文件替换。
  • 伪装流量:与远程控制服务器(C2)通信时,在请求头中加入 packages.npm.org 前缀,使流量看起来像正常的 NPM 注册表通信。

如何判断是否受影响?

您可以运行以下命令检查项目是否引用了受污染的版本:

  • 检查 Axios 版本npm list axios | grep -E "1\.14\.1|0\.30\.4"
  • 检查残留目录: 即便脚本已自毁,但恶意包的文件夹可能依然存在。检查是否存在 node_modules/plain-crypto-js 目录。
  • 检查系统症状
    • macOS: 检查是否存在文件 /Library/Caches/com.apple.act.mond
    • Linux: 检查是否存在文件 /tmp/ld.py
    • Windows: 检查是否存在文件 %PROGRAMDATA%\wt.exe

紧急响应方案

如果您确认安装了受影响的版本,请务必假设您的系统、环境变量和所有访问凭据均已泄露

  1. 版本降级

    • 1.x 用户请强制降级至 1.14.0
    • 0.x 用户请强制降级至 0.30.3
    • package.json 中使用 overridesresolutions 锁定版本。
  2. 清理环境

    • 删除 node_modulespackage-lock.json
    • 运行 npm install --ignore-scripts 以防止安装期间再次触发恶意脚本。
  3. 更换凭据(最关键)

    • 立即更改所有在开发机或 CI/CD 环境中接触过的密钥:包括 AWS、GCP、Azure 凭证,NPM 发布令牌,SSH 私钥以及 .env 文件中的敏感信息。
  4. 封禁风险域名

    • 在网络层拦截恶意 C2 域名:sfrclak.com

经验教训:增强供应链安全

  • 启用 --ignore-scripts:在 CI/CD 流水线中,建议默认使用 npm ci --ignore-scripts,仅在确实需要时手动开启脚本权限。
  • 监控依赖变更:对于像 Axios 这种周下载量过亿的基础库,任何非预期的依赖新增都应触发最高级别的安全预警。
  • 验证发布来源:优先使用具有 OIDC 签名(Trusted Publisher)的包版本,避免手动发布的非校验版本。