通过运行时监控和基线异常检测识别 npm 供应链攻击的案例研究
引言
2025 年 11 月 23-24 日,npm 生态系统遭遇了有史以来最大规模的协同供应链攻击之一。此次攻击被称为 "Sha1-Hulud: The Second Coming",共入侵了超过 780 个 npm 包,其中包括 Zapier、ENS Domains、PostHog、Postman 和 AsyncAPI 的包。恶意代码以 CI/CD 环境为目标,窃取凭据并试图建立持久后门。
在运行这些被入侵包的数千个 CI/CD 流水线中,包括了 Backstage 的流水线——这是云原生计算基金会(CNCF)旗下的开源开发者门户平台,由 Spotify 创建,拥有超过 32,000 个 GitHub 星标数,并被广泛应用于企业环境。
StepSecurity Harden Runner 在所有监控工作流运行的仓库中检测到了这次攻击。由于 Backstage 是一个使用 Harden Runner 免费社区版(可公开访问洞察)的知名开源项目,我们将其作为案例研究,来说明基线驱动的异常检测如何识别此次攻击,以及这对保障 CI/CD 流水线安全意味着什么。
攻击经过
在攻击窗口期间,backstage/backstage\ 仓库中有九个 GitHub Actions 工作流运行了被入侵的 npm 包。受影响的作业属于 Backstage 的 E2E 测试工作流,具体是在运行以下命令的步骤中:
- name: Run E2E test
run: |
sudo sysctl fs.inotify.max_user_watches=524288
yarn e2e-test run当 yarn e2e-test run\ 解析并安装依赖项时,由于该包没有锁文件,它获取了某些包的最新版本。在攻击窗口期间,这些最新版本恰好已被入侵。恶意的 preinstall\ 脚本立即执行,触发了 Sha1-Hulud 有效载荷。
Harden Runner 如何检测到攻击
Backstage 使用的是 Harden Runner 的社区版,该版本对开源项目免费。Backstage 维护者自 2023 年 10 月起就开始使用 Harden Runner,这表明他们在 CI/CD 流水线安全方面采取了积极主动的最佳实践。Harden Runner 作为 GitHub Actions 运行器的 EDR(端点检测与响应)代理运行,监控运行时行为,包括所有出站网络连接。
基线驱动的异常检测
Harden Runner 为每个工作流建立预期网络目的地的基线。当工作流运行连接到该基线之外的网络端点时,会触发异常警报。
在 Sha1-Hulud 攻击期间,被入侵的包向 Backstage E2E 工作流历史中从未出现过的端点发起了连接:
| 异常端点 | 攻击中的用途 |
|---|---|
| bun.sh | 恶意软件下载 Bun JavaScript 运行时来执行其混淆的有效载荷 |
| oss.trufflehog.org | 恶意软件下载 TruffleHog 来扫描代码库和环境中的敏感信息 |
这些连接在 Harden Runner 的网络遥测数据中立即突出显示。它们不属于 Backstage E2E 测试的既定基线,后者通常连接到 npm 注册表、GitHub API 和测试基础设施——而不是可执行文件的下载端点。
如果启用了 Harden Runner 的阻止模式,这些连接本可以被完全阻止。恶意软件将无法下载 Bun 或 TruffleHog,从而阻止攻击进展到初始入侵阶段之后。
可验证的证据
由于 Backstage 使用的是 Harden Runner 的社区版,这些工作流运行的洞察数据是公开可访问的。任何人都可以验证检测结果:
-
Run 19625457065 - E2E Linux Jobs(https://app.stepsecurity.io/github/backstage/backstage/actions/runs/19625457065)
-
Run 19631408557 - E2E Linux Jobs(https://app.stepsecurity.io/github/backstage/backstage/actions/runs/19631408557)
-
Run 19632292852 - E2E Linux Jobs(https://app.stepsecurity.io/github/backstage/backstage/actions/runs/19632292852)
探索此交互式演示,查看 StepSecurity Harden Runner 如何检测到此次攻击:
访问这些洞察页面时,您会清楚地看到恶意连接被高亮显示。在这些运行中首次出现的新目的地——如 bun.sh\、oss.trufflehog.org\ 和 keychecker.trufflesecurity.com\——以橙色显示,并带有"异常"标签,使它们与预期的网络活动明显区分开来。
您还可以查看 Harden Runner 为此工作流建立的基线,包括基线基于多少次以前的运行。这让您可以轻松理解为何某些连接会触发警报:它们在工作流历史中从未出现过。
使用 Harden Runner 企业版获得更深入的可见性
虽然社区版通过网络异常检测识别了此次攻击,但 Harden Runner 的企业版提供了额外的功能,可对供应链攻击进行更深入的可见性。
HTTPS 监控和进程遥测
企业版包括:
- HTTPS 监控:完整可见 HTTPS 请求,而不仅仅是连接端点
- 进程事件:完整的进程执行遥测,包括进程树和命令行参数
- 实时通知:检测到异常时通过电子邮件、Slack、S3 和 webhook 集成立即发出警报
检测持久化机制
Sha1-Hulud 恶意软件试图通过在被入侵仓库上注册名为 "SHA1HULUD" 的自托管 GitHub Actions 运行器来建立持久化。这将赋予攻击者通过仓库讨论事件远程执行代码的能力。
通过企业版的 HTTPS 监控,这种持久化尝试可以直接观察到——恶意软件向 GitHub API 发出 HTTPS 调用来注册运行器。这提供了超越初始有效载荷下载的额外入侵证据,并揭示了恶意软件试图执行的完整范围。
您可以在我们的企业演示中看到这一点,其中 Runner.Listener\ 向 /actions/runner-registration\ 发起 POST 调用到 api.github.com\。这触发了检测,即使没有基线——工作流通常不会注册运行器,使这种行为本身就很可疑。
探索此交互式演示,查看 StepSecurity 如何为企业客户检测此次攻击:
实时告警
对于企业客户,这些检测会通过配置的集成触发即时通知。与其事后审查时才发现入侵,安全团队可以在异常行为发生时立即收到警报——实现快速响应和遏制。
负责任的披露与影响评估
我们将发现报告给了 Backstage 维护者,他们审查了检测数据并评估了影响。他们的分析得出结论,受影响的 E2E 工作流只持有只读 GitHub 令牌,且未配置其他敏感信息。因此,此次入侵对 Backstage 仓库没有造成影响。
我们想对 Backstage 维护者的快速响应和调查支持表示感谢。他们的协作使我们能够快速确认检测结果并评估影响。
从检测到预防
虽然检测到 Sha1-Hulud 攻击提供了有价值的可见性,但 Harden Runner 的阻止模式可以主动防止此类攻击成功。
在这种情况下,Backstage 以审计模式运行 Harden Runner,该模式监控并警告异常连接,但不阻止它们。如果启用了阻止模式,前往 bun.sh\ 和 oss.trufflehog.org\ 的连接将在网络层面被阻止。恶意软件的 preinstall\ 脚本会执行,但它将无法:
-
下载执行其混淆有效载荷所需的 Bun 运行时
-
下载 TruffleHog 来扫描敏感信息
-
在没有有效载荷的情况下外泄任何发现的凭据
攻击将在造成任何损害之前被阻止。对于有权访问敏感信息的工作流而言,这就是安全警报与安全事件之间的区别。
为何运行时监控至关重要
本案例研究验证了一条基本原则:您不能仅依赖部署前的安全检查来捕获供应链攻击。
传统安全方法侧重于:
-
扫描依赖项中的已知漏洞(CVE)
-
审查锁文件中的意外变更
-
使用 npm 包的允许列表
这些方法对像 Sha1-Hulud 这样的零日供应链攻击无效,因为:
-
被入侵的包在攻击时没有 CVE
-
许多项目不使用锁文件,在许多情况下安装的是包的最新版本
-
被入侵的包是合法的、受信任的包,只是被劫持了
运行时监控提供了缺失的那一层。通过建立预期行为基线并对异常发出警报,Harden Runner 根据代码实际做了什么——而不是它声称是什么——检测到了攻击。
这不是 Harden Runner 第一次检测到供应链攻击。先前的检测包括:
-
tj-actions/changed-files 被入侵:一个拥有 23,000+ 依赖仓库的流行 GitHub Action 被入侵
-
@aspect-build/rules_js 被入侵:一个流行的 Nx 构建系统包被入侵并植入数据窃取恶意软件
-
ctrl-tinycolor 及 40+ 个 npm 包:通过运行时分析检测到大规模 npm 包被入侵
在每个案例中,运行时监控都通过传统安全工具遗漏的异常行为识别了攻击。
建议
基于此次事件,我们建议:
对开源项目
-
在您的 GitHub Actions 工作流上启用 Harden Runner。社区版对公开仓库免费。
-
审查您的工作流权限。最小权限原则限制了 Backstage 的暴露面。
-
考虑启用出站策略执行。Harden Runner 可以阻止连接到您基线之外的端点,实时阻止攻击。
对企业
-
在 CI/CD 工作流上实施运行时监控,以获得供应链攻击的可见性。
-
将 CI/CD 运行器视为高价值目标。它们通常有权访问生产凭据和部署能力。
-
监控异常行为,而不仅仅是已知威胁。零日攻击需要行为检测。
-
假设您的依赖项可能会被入侵。围绕此假设构建您的安全态势。
结论
Sha1-Hulud 攻击入侵了超过 780 个 npm 包,影响了数千个仓库。在 Backstage 仓库中,Harden Runner 通过基线异常检测识别了攻击——发现连接到 bun.sh\ 和 oss.trufflehog.org\ 的网络连接,这些连接在工作流历史中从未出现过。
此次检测不是基于签名或 CVE,而是基于观察工作流突然开始执行其从未执行过的操作。
对于 Backstage 而言,有限的工作流权限意味着没有影响。但这次攻击是一个警告:供应链攻击越来越复杂,如果没有运行时监控,您可能永远不会知道您的 CI/CD 流水线已被入侵。
运行时监控提供了检测此类攻击所需的可见性。如果您不监控 CI/CD 运行器实际在做什么,您就是在盲目飞行。
了解更多关于 Harden Runner 以及它如何保护 CI/CD 流水线免受供应链攻击的信息,请访问 stepsecurity.io 或探索 GitHub Action。
有关 Sha1-Hulud 恶意软件的技术细节和被入侵包的完整列表,请参阅我们的 技术分析。