Shai-Hulud供应链攻击:npm生态面临的多波次、自复制恶意软件战役

GitHub Security Lab深度分析Shai-Hulud供应链攻击,揭示攻击者如何通过窃取凭证、注入恶意npm生命周期脚本实现自我复制和CI/CD渗透。文章提供防御建议,包括启用MFA、使用OIDC可信发布和阶段性发布机制,帮助维护者应对下一波恶意软件战役。

⛓️ High 供应链攻击

GitHub Security Lab披露了名为Shai-Hulud的多波次供应链攻击,该攻击针对JavaScript/npm生态系统,通过窃取凭证和植入恶意生命周期脚本实现自我复制和横向移动。攻击者利用被攻陷的维护者账户和OAuth令牌,在安装时执行恶意代码,窃取CI/CD令牌和云凭证,并针对CI环境进行权限提升,展现了高组织性和快速迭代能力。

来源:GitHub Security Lab | 0 | 原文链接

🔍 关键发现

  • Shai-Hulud攻击从机会主义凭证滥用演变为工程化、定向攻击,第二波引入了跨受害者凭证暴露、CI环境特权提升和自托管Runner注册C2功能。
  • 攻击者利用安装后脚本(post-install)注入恶意代码,通过条件激活(如环境检测)和混淆技术规避静态检测,并利用包名和版本号伪造合法更新。
  • 攻击者快速迭代变种(第二波缩短了变种间时间间隔),绕过已有防御措施,表明其具备组织化对抗能力,目标为持久访问和大规模传播。

⚔️ 攻击链分析

1. 初始入侵:通过钓鱼或凭证泄露获得维护者账户或OAuth令牌。 2. 凭证收集与横向移动:在受感染系统中窃取npm令牌、CI令牌、云凭证等,并利用这些凭证发布恶意包或感染其他项目。 3. 恶意包传播:将恶意post-install脚本注入合法包或依赖链,通过条件触发(如环境检查)执行有效载荷,实现数据窃取和自我复制。 4. CI/CD环境渗透:在检测到CI环境时,执行权限提升技术,注册自托管Runner实现端点C2,进一步扩大攻击范围。

🚩 失陷指标 (IOC)

  • npm包名:使用与合法包相同的名称,但版本号被篡改为看似更新的版本(如补丁版本号)。
  • 恶意脚本:在package.json的postinstall字段中动态下载并执行外部有效载荷,或通过环境变量判断后执行条件性代码。

🛡️ 缓解建议

  • ✅ 启用抗钓鱼的多因素认证(MFA),并强制设置令牌过期时间,定期审计和撤销未使用的GitHub/OAuth应用。
  • ✅ 使用隔离开发环境(如GitHub Codespaces、容器或虚拟机)以限制恶意软件的影响范围。
  • ✅ 采用可信发布(OIDC)机制,并在发布流程中引入阶段性发布(Staged Publishing),在包上线前进行审查和MFA确认。

涉及漏洞:[]


⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。

🤖 常见问题解答(FAQ)

❓ Shai-Hulud攻击如何绕过静态检测?

攻击者将恶意代码隐藏在post-install脚本中,并通过环境变量(如检查是否在CI环境)条件触发执行,同时使用代码混淆和动态下载有效载荷的方式,使静态分析工具难以识别。

❓ 为什么阶段发布(Staged Publishing)能防御此类攻击?

阶段发布要求包在发布前经过审查期和MFA确认,使维护者有机会在包公开前发现注入的恶意脚本或异常变更,从而阻断恶意包到达下游用户。

❓ 攻击者如何利用CI环境进行横向移动?

攻击者通过窃取的CI令牌注册自托管Runner,建立持久性C2通道,并在CI构建过程中执行权限提升,窃取更多云凭证和令牌,从而感染其他项目和组织。

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)