沙虫再临:超 300 个 NPM 包遭感染

最近,一场大规模的供应链攻击感染了超过 300 个 NPM 软件包。攻击者通过伪装成引入 Bun 运行时的方式,植入恶意脚本来窃取开发者的敏感信息,包括 NPM 令牌、云服务凭证和环境变量。该恶意软件利用工具扫描本地密钥,并通过创建 GitHub Actions Runner 将数据外泄,同时具备蠕虫般的自我传播能力,被认为是“Shai-Hulud”黑客组织的再次行动。

攻击概述

在短时间内,超过 300 个 NPM 包被发布了恶意更新。这些更新声称引入了 Bun 运行时,但实际上通过修改 package.json 文件添加了一个恶意脚本。

    • 注入点:package.json 中添加 "preinstall": "node setup_bun.js"
    • 恶意文件: 攻击包含两个核心文件,setup_bun.js 和一个经过高度混淆的 bun_environment.js 文件。

一旦开发者安装或更新受感染的包,恶意脚本就会自动执行。

攻击行为分析

攻击者的手法清晰且具有高度自动化特征。整个攻击流程旨在最大化信息窃取的范围和效率。

恶意脚本的功能

    • setup_bun.js: 这个文件主要扮演一个启动器的角色,其代码模仿了 Bun 的正常安装流程,但其核心目的是调用并执行 bun_environment.js

  • bun_environment.js: 这是一个体积超过 10MB 的高度混淆的 JavaScript 文件,是整个攻击的核心。它的主要功能包括:

      • 信息收集: 搜集本地环境中的敏感凭证,例如 AWS、Azure、GCP、GitHubNPM 的访问令牌。
      • 深度扫描: 下载并运行 TruffleHog 工具,对本地文件系统进行深度扫描,以发现更多未在环境变量中暴露的密钥。
      • 数据外泄: 通过创建一个名为 SHA1HULUD 的 GitHub Actions Runner,将窃取到的数据打包并发送出去。

值得注意的是,该恶意软件还具备蠕虫传播能力。它会利用窃取到的 NPM 令牌,自动修改本地环境中其他项目的 package.json 文件,注入同样的恶意代码,然后重新打包并发布到 NPM 仓库,从而感染更多开发者。

数据窃取方式

恶意代码通过创建一个名为 .github/workflows/formatter_123456789.yml 的恶意工作流文件来配置数据外泄通道。所有窃取到的密钥和凭证信息(如 github_token, AWS_ACCESS_KEY_ID 等)会被进行两次 Base64 编码,然后通过 GitHub Actions 传输出去。

受影响的包

此次攻击波及了众多知名且下载量巨大的软件包,对整个 JavaScript 生态系统构成了严重威胁。部分受影响的高流行度包包括:

    • @zapier/zapier-sdk: 每周下载量超过 260 万次。
    • @posthog/core: 每周下载量接近 200 万次。
    • posthog-node: 每周下载量超过 150 万次。
    • @asyncapi/specs: 每周下载量超过 140 万次。
    • @postman/tunnel-agent: 每周下载量超过 120 万次。

这仅仅是冰山一角,完整的受影响列表包含了从大型应用框架到小型工具库的各种软件包,显示了攻击的广泛性和无差别性。