文章摘要
攻击者通过恶意GitHub Actions工作流窃取了具有广泛发布权限的npm令牌,并利用该令牌发布了包括@ctrl/tinycolor在内的20个恶意包。GitHub和npm安全团队迅速响应,撤销了恶意版本,作者随后发布了干净版本以清除缓存。此次攻击未直接涉及钓鱼或恶意包安装,且未通过拉取请求进行,因为仓库管理员可直接添加GitHub Actions。
文章总结
标题:@ctrl/tinycolor 供应链攻击事件回顾
主要内容:
2025年9月15日,@ctrl/tinycolor 项目遭遇了一次供应链攻击。攻击者通过向一个共享的 GitHub 仓库推送恶意的 GitHub Actions 工作流,窃取了一个具有广泛发布权限的 npm 令牌。随后,攻击者利用该令牌发布了包括 @ctrl/tinycolor 在内的20个恶意版本的 npm 包。
尽管我的 GitHub 账户和 @ctrl/tinycolor 仓库并未直接受到攻击,但攻击者通过一个名为 angulartics2 的共享仓库获取了 npm 令牌。该仓库仍保留着一个具有广泛发布权限的 GitHub Actions 密钥。攻击者通过强制推送一个名为 Shai-Hulud 的分支,并立即运行恶意工作流,成功窃取了令牌。
GitHub 和 npm 安全团队迅速响应,撤销了恶意版本的发布。我随后发布了经过验证的干净版本,以刷新缓存并恢复信任。
此次攻击的影响包括多个 npm 包的恶意版本短暂上线,其中 @ctrl/tinycolor 每周下载量约为200万次。安装这些恶意版本可能会触发后安装脚本,具体细节由 StepSecurity 详细记录。
为了防止类似事件再次发生,我计划采用 npm 的 Trusted Publishing (OIDC) 功能,彻底消除静态令牌的使用。同时,我将继续使用 pnpm,以防止未经批准的后安装脚本运行,并考虑启用 pnpm 的 minimumReleaseAge 设置。
感谢 Wes Todd、OpenJS 基金会以及 GitHub/npm 安全团队的快速响应和协调处理。
(注:本文删除了与主题无关的细节,如社区讨论链接、图片描述等,保留了事件的主要经过、影响及后续防范措施。)
评论总结
评论主要围绕npm包发布过程中的安全问题展开,以下是主要观点总结:
npm令牌的安全性问题:
- 评论1指出,攻击者通过恶意GitHub Actions工作流窃取了具有广泛发布权限的npm令牌,并发布了恶意包。作者对为何angulartics2的npm令牌能发布tinycolor包表示不解。
- 引用:"An admin on angulartics2 gets hacked, his Github access is used to push a malicious workflow that extracts an npm token."
- 评论5批评了令牌的安全性,认为它们类似于静态密码,并提出GitHub作为AWS的令牌提供者是一个更好的例子。
- 引用:"I freaking HATE tokens. I hate them. There should be a better way to do authentication than a glorified static password."
- 评论1指出,攻击者通过恶意GitHub Actions工作流窃取了具有广泛发布权限的npm令牌,并发布了恶意包。作者对为何angulartics2的npm令牌能发布tinycolor包表示不解。
多因素认证(MFA)和签名审批:
- 评论2建议引入多作者加密签名审批,以增强安全性。
- 引用:"Two-factor auth for publishing is helpful, but requiring cryptographically signed approval by multiple authors would be more helpful."
- 评论7提出将MFA集成到自动化发布流程中,但目前过程复杂,希望npm或GitHub提供更简便的方式。
- 引用:"I’ve got no problem with doing an MFA prompt to confirm publish by a CI workflow - but last I looked this was a convoluted process."
- 评论2建议引入多作者加密签名审批,以增强安全性。
自动化发布流程的争议:
- 评论3认为自动化发布流程是问题的根源,主张手动发布并启用2FA。
- 引用:"The real problem here is automated publishing workflows. What is so fucking difficult about running
npm publishmanually with 2FA?"
- 引用:"The real problem here is automated publishing workflows. What is so fucking difficult about running
- 评论6介绍了“可信发布”机制,使用短期令牌替代长期令牌,已在多个生态系统中实施。
- 引用:"One of the advantages of Trusted Publishing is that we no longer need long-lived tokens with publish rights."
- 评论3认为自动化发布流程是问题的根源,主张手动发布并启用2FA。
工具和脚本的需求:
- 评论4询问是否有工具可以检查易受攻击的npm包。
- 引用:"Anyone know of a published tool/script to check for the existence of any of the vulnerable npm packages?"
- 评论4询问是否有工具可以检查易受攻击的npm包。
Git历史树的潜在风险:
- 评论8提出如果CI作业强制推送了Git历史树深处的内容,可能会带来风险。
- 引用:"if the ci job force pushed something deep in the git history tree?"
- 评论8提出如果CI作业强制推送了Git历史树深处的内容,可能会带来风险。
总结:评论者普遍关注npm发布流程中的安全问题,特别是令牌管理和自动化发布的风险。多因素认证、签名审批和短期令牌被认为是潜在的解决方案,同时也有对工具和流程改进的需求。