应对Shai-Hulud蠕虫2.0:软件供应链安全防护实践

4 阅读6分钟

应对Shai-Hulud蠕虫2.0:软件供应链安全防护实践

自11月24日以来,软件开发社区一直在应对Shai-Hulud蠕虫以2.0版本卷土重来的消息。软件供应链安全再次面临严峻挑战。本篇文章将详细介绍为监控和缓解日益增长的恶意软件包威胁所采取的措施,并分享与此新变种相关的预防和检测规则、狩猎查询与建议。

了解进化的威胁:Shai-Hulud 2.0

npm生态系统的庞大规模使其成为恶意活动的主要目标。2025年11月,一种新的恶意npm蠕虫变种出现,因其在GitHub仓库描述中使用的活动标记而被称为“Shai-Hulud: The Second Coming”。它已感染了数百个软件包,涉及多家机构的流行项目。

与初始变种的相似之处在于,npm包被感染了自我复制的恶意软件。然而,Shai-Hulud 2.0的不同之处在于,它会通过文件setup_bun.js安装bun,然后使用它来执行包含恶意代码的bun_environment.js。随后,它通过创建随机命名的GitHub仓库来外泄窃取的数据,通常会将一名受害者的数据发布到与另一名无关受害者相关的仓库,这被称为“交叉受害者数据外泄”。新创建的GitHub仓库描述为“Sha1-Hulud: The Second Coming”。这意味着,仅仅搜索自己的仓库可能无法发现环境中泄露的数据。

此外,Shai-Hulud不再局限于感染20个npm包;现在它会感染多达100个npm包,如果无法使用GitHub或npm凭证进行身份验证,还会擦除用户的home目录。

防护与响应措施

借鉴首次Shai-Hulud事件的经验和已实施的机制,得以迅速部署全面防御。

  • 依赖项清单:持续使用软件成分分析(SCA)工具扫描产品,以便快速了解正在使用的软件包及其位置。
  • 威胁情报:利用多个威胁情报源,对照依赖项清单检查不断增长的恶意软件包列表,并触发警报。
  • 最佳实践与限制:自9月份Shai-Hulud 1事件以来,开发团队已转向使用“可信发布者”进行发布;任何剩余的令牌均被撤销,以防止使用长期有效的令牌进行发布。
  • 依赖项最低使用期限:在自动化流程中实施了软件包发布最低使用期限(冷却期),确保新版本的软件包在发布14天后才会被自动拉取。
  • 实施端点扫描:通过为Elastic Agent集成OSQuery,实现了对员工笔记本电脑上安装的已知被感染npm包的持续扫描。
  • 运行开箱即用(OOTB)检测规则:安全实验室已提供OOTB安全检测规则,以帮助识别已安装并正在运行受感染软件包的系统。
  • 通知开发人员:向开发人员发送了安全通告,告知他们正在进行的调查,并禁止更新或安装新的npm包。

威胁的近距离接触

通过合作伙伴获悉,一个用于GitOps(特别是某中心云编排器)的持续集成(CI)管道运行了Shai-Hulud 2.0恶意软件,并将数据发布到了一个公开的GitHub仓库。该事件对某中心云系统或客户未造成影响。调查发现根本原因是传递性依赖。快速的响应以及与工程团队的协作确保了在潜在利用发生之前遏制并修复了威胁。

快速遏制与补救措施包括:

  • 从所有已识别的GitHub代码仓库中移除包含恶意软件的开源依赖项。
  • 识别可能运行恶意软件的管道或手动流程。
  • 识别受影响的CI运行实例和用户。
  • 识别这些运行实例可访问的密钥。
  • 轮换所有(非临时性)密钥。

确认对客户无影响

GitHub迅速删除了暴露数据的仓库。其中包含四个文件:

  • cloud.json:不包含数据。
  • contents.json:包含有关CI运行器的详细信息,以及一个无关GitHub用户及其GitHub令牌。
  • truffleSecrets.json:包含误报的密钥发现。

没有证据表明某中心的密钥在外部被使用过。 没有证据表明蠕虫已传播到某中心的npm包。 该管道与产品无关。 对客户没有影响。

狩猎查询

建议安全客户在其自身环境中搜寻潜在的入侵迹象。以下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)检测规则

以下开箱即用的检测和预防规则也为Shai-Hulud蠕虫2.0活动提供了更新的覆盖:

  • 异常网络连接到可疑网络服务(检测引擎)
  • 连接到常被滥用的网络服务(检测引擎)
  • 潜在发现DPAPI主密钥
  • 潜在发现Windows凭据管理器存储
  • 通过未签名进程进行Web浏览器凭据访问
  • 潜在的浏览器信息发现
  • 未签名或不受信进程访问Web浏览器凭据数据
  • 通过Node.js生成的Curl或Wget进程(检测引擎)
  • 通过TruffleHog执行进行的凭据访问(检测引擎)

对安全的承诺

安全是开发生命周期和运营流程的基础。新的Shai-Hulud蠕虫突显了全球软件供应链面临的网络威胁具有持久性和快速演变的特性。此次内部环境事件证明了安全团队的有效性以及快速响应的重要性。对此的承诺包括:

  • 持续监控:对系统和网络进行24/7监控,以发现任何入侵迹象。
  • 快速响应:确保安全团队能够迅速有效地应对新威胁。
  • 透明度:就安全事件和缓解措施与用户和社区保持开放沟通。

将持续监测新信息,并随着对此事件的深入了解更新内容。