跨平台威胁 – Axios 软件包被入侵



背  景

JFrog 安全研究团队近期发现了一起针对 axios npm 包的供应链攻击。如果您安装了 axios@1.14.1 或 axios@0.30.4,则必须假定您的环境已被入侵。请注意,此次持续攻击中还有其他软件包受到影响,请参阅下文第四“已知恶意软件包”部分。




技术分析

这并非运行时后门。攻击者并未触及 Axios 的 HTTP 客户端逻辑。相反,他们将一个新的依赖项 plain-crypto-js 版本 4.2.1 添加到 axios-1.14.1 的 package.json 清单文件中。这样做的目的是为了在运行 npm install 时执行代码。


我们知道这是有意为之,因为 Axios 的代码中根本没有导入 plain-crypto-js。这个包的存在仅仅是为了触发安装钩子。


除了 plain-crypto-js 包之外,还有 3 个包包含相同的恶意载荷:@shadanai/openclaw 和 @qqbrowser/openclaw-qbot。尽管它们没有被注入到 Axios 中,但安装了这些包的用户也应该采取相应的防范措施。


1、第一阶段装载器

恶意依赖项依赖于一个混淆的 postinstall 脚本(setup.js)。它使用两步转换来隐藏其字符串:反转文本,对其进行 base64 解码,并将结果与硬编码的键(OrDeR_7077)以及常量 333 进行异或运算。

脚本反混淆后会执行一些操作。它会确定你的操作系统,创建一个临时文件,并连接到 hxxp[:]//sfrclak[.]com:8000/。它使用 POST 请求,请求体告诉服务器要返回哪个特定于操作系统的有效负载(macOS 为 /product0,Windows 为 /product1,Linux 为 /product2)。


2、平台特定有效载荷

服务器充当交换机的角色,根据受害者的机器分发不同的后门:

Windows 系统:该脚本会找到您的 PowerShell 二进制文件并将其复制到 %PROGRAMDATA%\wt.exe。然后,它会释放 VBScript 和 PowerShell 启动器来获取第二阶段的程序。最终的有效载荷是一个完整的 PowerShell 后门。它通过释放 %PROGRAMDATA%\system.bat 并添加一个注册表 Run 键项来获得持久性。每次您登录时,它都会将后门重新下载到内存中。

macOS 系统:该脚本会将一个 AppleScript 文件写入临时目录(/tmp/.XXXXXX.scpt),并使用 osascript 启动它。这会获取一个已编译的 Mach-O 二进制文件,并将其保存到类似 /private/tmp/.%s 的隐藏路径,或直接保存到 /Library/Caches/com.apple.act.mond。它会将该文件标记为可执行文件,并使用 zsh 在后台运行它。对这个通用的 FAT Mach-O(x86_64 和 arm64)进行逆向工程后发现,它是用 C++ 编写的,使用了 nlohmann::json,依赖 libcurl 进行网络连接,并通过 argv[1] 参数接收 C2 URL。该二进制文件还会泄露开发者环境路径,造成额外的安全漏洞(/Users/mac/Desktop/Jain_DEV/client_mac/macWebT/macWebT/…),并且包含调试风格的授权(com.apple.security.get-task-allow = true),而不是经过强化的生产签名。

Linux 系统:备用方案比较简单。它会下载一个 Python 脚本到 /tmp/ld.py 并在后台运行。我们在恢复的 Linux 样本中没有发现任何持久化机制。


3、第二阶段后门

这三个有效载荷都采用相同的操作模型。它们利用平台特定的机制(例如,在 Windows 上查询 Win32_OperatingSystem 等 WMI 类,在 Linux 上遍历 /proc/<pid>/cmdline 和 /proc/<pid>/stat 文件,或在 macOS 上使用 sysctl)来分析您的主机。它们窃取当前用户名、获取进程列表并扫描您的目录。它们将这些数据封装在 JSON 中,进行 Base64 编码,然后通过 POST 请求发送回命令与控制服务器。值得注意的是,它们都使用伪造的、硬编码的 Internet Explorer 8 用户代理字符串来伪装。

一旦运行,这些后门程序会持续向服务器发送信标,等待任务。它们区分初始的 FirstInfo 信标(用于深度系统和文件系统清点)和周期性的 BaseInfo 信标。它们支持执行任意脚本、枚举目录以及将有效载荷直接注入内存的命令。


4、实施缺陷

尽管采用了复杂的跨平台设计,但攻击者仍然犯了一些错误:

· Windows 系统:该脚本包含冗余的调试代码(Write-Host $data 将原始服务器任务 JSON 打印到控制台)、未使用的变量,以及内存注入(peinject)不一致的成功报告机制,返回字符串“Wow”而不是预期的结构化对象。

· Linux 系统:由于未定义变量和字节解码错误,用于有效载荷注入的通用临时文件执行器已失效。此外,进程枚举会截断长度小于 60 个字符的命令,UID 解析存在缺陷,并且有效载荷会使用全局可写的 rwxrwxrwx 权限释放临时文件。这意味着攻击者在 Linux 目标系统上无法完全执行攻击!但是,其余功能(例如运行任意脚本)仍然可用。


5、掩盖行踪

最突出的是清理程序——他们将 plain-crypto-js 降级到不包含恶意有效载荷的版本 4.2.0。

初始有效载荷触发后,setup.js 会执行以下操作:

(1)它会删除自身。

(2) 它会删除已激活的恶意 package.json 文件。

(3)它会将一个干净的备份文件(package.md)重命名为 package.json。

恢复后的清单文件中没有 postinstall 脚本。如果您稍后检查 node_modules 文件夹,它看起来像是一个正常的旧版本。攻击者故意销毁了他们自己的第一阶段证据,以逃避取证审查。




补救指南

如果您安装了 axios@1.14.1 或 axios@0.30.4,您的机器或 CI/CD 运行程序可能已被入侵。请立即采取以下步骤:


第一步:隔离和凭证轮换

该恶意软件会扫描系统,并能从C2服务器执行任意脚本。机器上的所有机密信息都面临风险:

 轮换环境中所有可访问的密钥,包括 AWS 密钥、npm 令牌、SSH 密钥和数据库密码。

 检查注册表或源代码控制日志,查看是否存在任何未经授权的访问或推送。


第二步:清除持久性和后门

如果您使用的是 Windows 系统,则必须移除持久化机制:

◎ 删除注册表项:HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate

◎ 删除已丢弃的批处理文件:%PROGRAMDATA%\system.bat

◎ 删除已复制的 PowerShell 二进制文件:%PROGRAMDATA%\wt.exe

在 macOS 和 Linux 系统上,攻击者会从临时目录执行脚本。重启机器并清除 /tmp 文件夹可以阻止当前的脚本执行,但由于攻击者具备远程代码执行能力,因此彻底清除机器数据是最安全的方法。


第三步:移除软件包

将项目中被入侵的软件包移除:

◎ 删除 node_modules 文件夹并清除 npm 缓存:

rm -rf node_modules

npm cache clean –force

在 package.json 和 package-lock.json 文件中,将 Axios 降级到安全版本。

◎ 重新安装依赖项。


第四步:预防

◎ 运行 npm config set ignore-scripts true 以阻止 postinstall 钩子自动运行。

◎ JFrog Curation:通过 JFrog Curation (https://jfrog.com/curation/)实施自动化依赖关系扫描和审批工作流程,确保只有经过审核的软件包才能进入您的供应链。




已知恶意软件包

软件包名称

恶意版本

Xray ID

axios

1.14.1, 0.30.4

XRAY-958970

plain-crypto-js

4.2.1

XRAY-958969

@shadanai

/openclaw

2026.3.31-2, 2026.3.31-1, 2026.3.28-3, 2026.3.28-2

XRAY-958979

@qqbrowser

/openclaw-qbot

0.0.130

XRAY-958980




结   论

鉴于近期 TeamPCP 攻击事件频发,热门软件包频繁遭到入侵已成为一种常态。


尽管攻击者针对 Linux 的有效载荷存在技术漏洞,但此次攻击的跨平台能力仍然令所有操作系统用户感到担忧。


任何使用过上表中所列软件包的用户都应立即启动补救措施,并假定其敏感凭证和机密信息已被泄露。


JFrog Xray 和 JFrog Curation 已具备检测这些恶意软件的功能,用户可以使用技术摘要中提供的特定 Xray ID 来识别这些软件包。




威胁指标

1.软件包

◎ axios-1.14.1

◎ plain-crypto-js-4.2.1

◎ @shadanai/openclaw

◎ @qqbrowser/openclaw-qbot


2.网络

◎ URL:hxxp[:]//sfrclak[.]com:8000/6202033

◎ 域名:sfrclak[.]com


3.文件

◎ com.apple.act.mond, SHA-256: 92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a

◎ 6202033.ps1, SHA-256: 617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101

◎ ld.py, SHA-256: fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf

◎ system.bat, SHA-256: f7d335205b8d7b20208fb3ef93ee6dc817905dc3ae0c10a0b164f4e7d07121cd

◎ setup.js, SHA-256: e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09