目录
概要
- 我们分析了 DataDog 恶意软件包数据集 中共 5,576 个开源软件包。
- 其中 96.2% 被我们的代码扫描引擎检测为恶意软件包。
- 恶意软件包中 64%(3,611 个)来自
npm,35%(1,965 个)来自PyPI。 - 71.9% 的检测为高置信度,含有多个信号和证据。
- T1041 – 通过 C2 通道外泄数据 是最常见的 TTP。
- 前两大行为是
exfiltration via Burp Collaborator和pre-install command execution in NPM scripts。 - 90% 的恶意软件包体积非常小(< 10KB)。
- 发现 44 起明显的 typosquatting(域名仿冒)攻击,目标是流行库(如
beautifulsoup‑numpy、djangoo)。 - 10 条 YARA 规则匹配了超过 75% 的恶意软件包,表明存在常见的 TTP。
关键发现一览
TTP
匹配超过 75% 恶意软件包的 Top 10 YARA 规则如下所示。这些规则源自 YARA Forge 项目,是恶意行为者最常使用的 TTP 的指标。
burp_collab 规则匹配表明攻击者利用 Burp Collaborator 进行数据外泄。在我们过去的研究中,我们识别出多个使用 Burp Collaborator 进行数据外泄的恶意软件包。
下表展示了主要行为的 MITRE ATT&CK 映射。
| 行为 | MITRE ATT&CK ID | 战术 |
|---|---|---|
| Burp Collaborator 使用 | T1041 – 通过 C2 通道外泄数据 | 外泄 |
| npm preinstall 任意执行 | T1059 – 命令和脚本解释器 | 执行 |
| 系统信息收集 | T1082 – 系统信息发现 | 发现 |
外部 IP 发现(ipify.org) | T1016.001 – 互联网连接发现 | 发现 |
| 运行时回连 / 信标 | T1071.001 – Web 协议(C2) | 命令与控制 |
| 硬编码的主机用于外泄 | T1567.002 – 通过 Web 服务外泄 | 外泄 |
setuptools 自定义命令执行 | T1059.006 – 命令和脚本解释器:Python | 执行 |
| 硬编码 IP 回连 | T1071.001 – Web 协议(C2) | 命令与控制 |
| 系统信息 + 上传 | T1567.002 – 通过 Web 服务外泄 | 外泄 |
| 敏感文件访问 | T1552.001 – 文件中的凭据 | 凭据访问 |
按文件扩展名分类的信号
以下展示了促成证据(信号)的文件扩展名分布,基于这些信号软件包被判定为恶意。
注意
JSON 文件由于在 package.json 文件中大量使用 npm 安装钩子而被分类。
恶意软件包的体积
有趣的是,恶意软件包的体积非常小,90% 的软件包小于 10KB。
Typosquatting(域名仿冒)
Typosquatting 是一种攻击者用来诱骗用户安装恶意软件包的技术。在这种技术中,攻击者创建与流行软件包相似的软件包,但只改变几个字符。以下是针对流行库最常见的 typosquatting 尝试:
| 仿冒名称 | 目标软件包名称 | 注册表 | 数量 |
|---|---|---|---|
| expresss | express | npm | 7 |
| reqests | requests | PyPI | 5 |
| djangoo | django | PyPI | 4 |
| lodashs | lodash | npm | 4 |
| reactjs | react | npm | 3 |
| beautifulsoup‑numpy | beautifulsoup4 + numpy(组合诱饵) | PyPI | 3 |
| pandas3 | pandas | PyPI | 3 |
| flaskk | flask | PyPI | 2 |
| asyncioo | asyncio | PyPI | 2 |
| webpackjs | webpack | npm | 2 |
观察到的常见模式:
- 双字母或缺失字母(
expresss、reqests、djangoo、flaskk)仍然是攻击者捕获误击安装的最简单方式。 - 版本导向诱饵(
pandas3)和组合诱饵(beautifulsoup‑numpy)试图显得"新颖"或"功能丰富"。
依赖混淆
依赖混淆攻击 是数据集中观察到的另一种最常见技术。以下是基于异常高版本号的一些示例:
| 软件包名称 | 版本 |
|---|---|
32red-admin | 999.9.9 |
32red-analytics | 999.9.9 |
32red-api | 999.9.9 |
32red-api-client | 999.9.9 |
32red-auth | 999.9.9 |
虽然示例不足以得出结论,但常见观察是红队经常在依赖混淆尝试中使用高版本号以获取对目标组织的访问权限。
背景
我们在 SafeDep 构建并维护一个代码分析引擎,专门用于扫描开源软件包中的恶意代码。该引擎采用混合方法,包括:
- 使用 YARA Forge 规则检测已知恶意模式
- 静态代码分析识别执行特定操作的代码块(例如
network:connect、fs:write、process:exec等) - 基于 [1] 和 [2] 的 LLM 代码分析,用于分析可能恶意的代码基本块
我们使用此代码分析引擎持续扫描发布到受支持注册表(如 npm、PyPI、RubyGems 等)的所有开源软件包。该分析引擎的数据被 vet 使用——我们免费开源的供应链安全工具,用于保护用户免受近实时恶意 OSS 软件包的侵害。
评估数据集
分析工作流程中 LLM 的使用使得整个系统具有概率性,这是 LLM 固有的本质。为了能够维护和改进分析质量,我们需要一个评估数据集。DataDog 的恶意软件包数据集 非常适合我们的需求。
方法论
分析使用 SafeDep 软件包分析 引擎进行,并进行了必要的定制以支持分析 zip 文件中的恶意软件包,而非直接从软件包注册表分析制品。原因在于,数据集中的许多恶意软件包由于其恶意性质已从软件包注册表中移除。
进行了以下定制:
- 原本支持直接从软件包注册表扫描 OSS 软件包
- 一个自定义脚本,使用
infected密码从输入的 DataDog 恶意软件包数据集中解压 zip 文件到本地文件系统 - 一个自定义适配器,从本地文件系统读取软件包文件
- 使用 SafeDep 软件包分析引擎扫描本地软件包
虽然我们使用的扫描引擎目前尚未开源,但任何人都可以通过 vet(我们的免费开源供应链安全工具)使用它。开发者可以使用软件包分析 API 构建自定义工具。
结论
虽然本分析的目的是评估和创建代码分析引擎的基准,但结果对于社区了解恶意开源软件包的本质及其在野外分布情况非常有用。事实上,此分析帮助我们微调分析引擎以提高准确性并减少误报。感兴趣的读者可以使用这些数据进行自己的分析和研究。
-
vet 与分析 API 集成,在 CI/CD 管道中防范恶意 OSS 软件包。
-
关于如何使用恶意软件包分析服务的文档
-
vetpkg.dev/mal 是一个示例应用,展示最近分析的 OSS 软件包
-
npm
-
pypi
-
analysis
-
malware
-
research
SafeDep 博客最新更新
关注以获取开源安全与工程的最新更新和洞察