应对 Shai-Hulud Worm 2.0:Elastic 对 npm 供应链入侵的最新响应

大家都喜欢续集,对吧?自 11 月 24 日星期一以来,软件开发社区一直在关注 Shai-Hulud 蠕虫卷土重来并已更新至 2.0 版本的消息。社区已进入响应状态,Elastic 也不例外。虽然 Elastic 产品未预装 Node 包管理器 (npm),但我们的软件和许多其他软件一样,在构建过程中会使用 npm 从 npmjs.com 包注册表中获取软件包。
在本博客中,我们将详细介绍 Elastic 为监测并采取措施以缓解因遭入侵的软件包数量不断增加而带来的威胁所采取的步骤。此外,我们还将根据这一新版 Shai-Hulud,共享我们的预防和检测规则、狩猎查询以及相关建议。
了解不断演变的威胁:Shai-Hulud 2.0
npm 生态系统的庞大规模使其成为恶意活动的主要目标。继 2025 年 9 月首轮攻击事件后,2025 年 11 月出现一款新版 npm 恶意蠕虫变种,因攻击者在 GitHub 仓库简介中写入专属攻击活动标记,该恶意样本被命名为 Shai-Hulud:二次降临,目前该蠕虫仍在积极泄露数据。它已经入侵了数百个软件包,包括来自 AsyncAPI、Zapier、PostHog 和 Postman 的热门项目。
与初始变种的相似之处在于,npm 包被植入了可自我复制的恶意软件。然而,Shai-Hulud 2.0 与其初代版本的区别在于,它会使用 setup_bun.js 文件安装 bun,然后利用该文件执行包含恶意代码的 bun_environment.js 文件。随后,它会通过创建随机命名的 GitHub 存储库来窃取数据,通常会将一位受害者的数据发布到与另一名无关受害者关联的存储库中,这种行为被称为“跨受害者数据窃取”。新创建的 GitHub 存储库的描述为“Sha1-Hulud:第二次降临”。
归根结底,这意味着仅仅搜索您自己的存储库可能不会发现从环境中泄露的数据。此外,Shai-Hulud 不再局限于感染 20 个 npm 软件包;现在它最多可以感染 100 个 npm 软件包,如果无法使用 GitHub 或 npm 凭据进行身份验证,则会清除用户的主目录。
Elastic 的响应
吸取了 Shai-Hulud 事件的教训并采取了相应措施后,Elastic 能够迅速部署全面的防御措施。
依赖清单:Elastic 使用软件组成分析 (SCA) 工具持续扫描我们的产品,这使我们能够快速了解正在使用哪些软件包以及在哪里使用。
威胁情报:利用多个威胁情报源,将不断增长的恶意软件包列表与我们的依赖项清单进行比对,并触发警报。
Npmjs 最佳实践和限制:自 9 月的 Shai-Hulud 1 事件以来,Elastic 团队已逐步迁移到 Trusted Publisher,允许符合条件的用户继续发布;任何剩余的令牌都被撤销,从而防止使用长期有效令牌进行发布的能力。
依赖项最短发布时间:我们在自动化流程中实施了软件包发布的最短等待时间(冷却期),确保新软件包版本在发布 14 天后才会自动拉取。
实施终端扫描:使用适用于 Elastic Agent 的 OSQuery 集成,我们对安装在 Elastic 笔记本电脑上的已知受感染 npm 包实施了持续扫描。
运行开箱即用 (OOTB) 检测规则:Elastic Security Labs 已经提供了 OOTB Elastic Security 检测规则,帮助识别已安装并正在运行受感染软件包的系统。我们在下面列出了相关保护措施的更多详细信息,您可以将其用于自己的威胁狩猎。
通知 Elastic 开发人员:已向 Elastic 开发人员发送安全公告,通知他们正在进行的调查,并禁止更新或安装新的 npm 软件包。
二次降临离我们越来越近了
通过我们的合作伙伴 Entro,Elastic 得知 Elastic 持续集成 (CI) 管道运行了 Shai-Hulud 2.0 恶意软件,并将数据发布到了一个公共 GitHub 存储库。这个管道用于 GitOps,具体来说,是 Elastic Cloud 的编排器。对 Elastic Cloud 系统或 Elastic 客户没有造成任何影响。经查明,罪魁祸首是传递依赖关系。我们与工程团队的快速响应和协调确保了我们在潜在利用之前控制并消除了威胁。
快速控制与修复
从所有已识别的 Elastic GitHub 仓库中移除了包含恶意软件的开源依赖项
已识别出可能运行恶意软件的管道或手动流程
已识别的 CI 运行及受影响的用户
这些运行中可用的已识别机密
已轮换所有密钥(非临时密钥)
已确认未对客户造成影响
GitHub 迅速删除了暴露 Elastic 提取数据的存储库,其中包含四个文件:
cloud.json 不包含任何数据
contents.json 包含有关 CI 运行器以及一个无关的 GitHub 用户及其 GitHub 令牌的详细信息
truffleSecrets.json 包含误报的机密检测结果
environment.json 包含与 CI 运行器关联的环境变量,包括构建中使用的机密。 注意: Elastic 确保这些机密已被撤销。
没有证据表明 Elastic 机密曾在 Elastic 外部使用过。
目前没有证据表明该蠕虫已经传播到 Elastic npm 包中。
该管道与 Elastic 产品无关。
对 Elastic 客户没有任何影响。
猎捕查询
我们也建议 Elastic Security 的客户检查他们自己的环境中是否存在潜在的安全漏洞。可以使用以下 KQL 查询来识别与这种供应链漏洞相关的行为:
// IOC for the Github Self-Hosted Actions runner name
process.name:Runner.Listener and process.command_line:*SHA1HULUD*
// IOC - node/bun executing bun_environment.js
process.name:(node or bun) and process.args:*bun_environment.js
// credentials discovery using trufflehog from node/bun or node_modules related working directory
process.name:("trufflehog" or "trufflehog.exe") and process.args:"filesystem" and process.args:"--json" and (process.parent.name : (node or bun or node.exe or bun.exe) or process.working_directory:*node_modules*)
// curl used to download GH actions runner to victim machine
process.name:(curl or or curl.exe or powershell.exe or wget or wget.exe) and process.command_line:*github.com/actions/runner/releases/download*
//docker escape via mounting the host file system and executing bash commands to tamper with the host file system
process.name:docker and process.args :("--privileged" and run) and process.args :"-v" and process.args :/\:/* and process.args :(bash or sh or cp)匹配示例:


OOTB Elastic 检测
以下开箱即用的检测和预防规则还为 Shai-Hulud 蠕虫 2.0 的活动提供了更新的防护覆盖:
与可疑网络服务的异常网络连接(检测引擎)
连接到常见滥用网络服务(检测引擎)
对 DPAPI 主密钥进行潜在发现 (Elastic Defend)
发现 Windows 凭据管理器存储的潜在风险 (Elastic Defend)
通过未签名进程访问 Web 浏览器凭据 (Elastic Defend)
潜在的浏览器信息发现 (Elastic Defend)
通过未签名或不可信进程访问的 Web 浏览器凭证数据 (Elastic Defend)
- 通过 TruffleHog 执行访问凭据(检测引擎)
对安全的承诺
安全性是 Elastic 开发生命周期和运营流程的基础。新型 Shai-Hulud 蠕虫凸显了全球软件供应链面临的网络威胁持续存在且快速演变的特性。我们环境中的这一事件表明了安全团队的有效性以及快速响应的重要性。我们始终致力于:
持续监控:对我们的系统和网络进行 24/7 全天候监控,以发现任何入侵迹象。
快速响应:确保我们的安全团队能够迅速有效地应对新威胁。
透明度:与我们的用户和社区就安全事件和我们的缓解措施进行公开沟通。
我们将持续监测最新信息。随着我们对此次事件的了解,我们将更新本出版物。有关 Elastic 如何帮助您保护环境的更多信息,请访问我们的安全解决方案页面。
本文中描述的任何功能或功能性的发布和时间均由 Elastic 自行决定。当前尚未发布的任何功能或功能性可能无法按时提供或根本无法提供。