npm 出现了新攻击方式:TanStack Router 官方 npm 包被植入恶意代码。攻击者入侵了项目发布流程,上传了带后门的官方版本。这些包会窃取开发者电脑里的各种密钥,并尝试继续感染开发者拥有权限的其他 GitHub 仓库,再借 npm 进一步传播。
令人绝望的是:它绕过了现代 npm 生态最核心的一整套“信任链”:
但发布出去的代码,是恶意的。
另外,有安全研究员认为,这是 npm 历史上第一次出现真正“会自我传播”的蠕虫式供应链攻击。

这次出问题的是 TanStack Router,一个非常流行的 JavaScript 路由库,在 npm 上每周下载量超过数百万次,被大量前端项目使用。
攻击者先从临时分枝提交了一段恶意代码。虽然这个提交很快就被关闭了,但项目的自动化系统还是运行了它。
这段代码随后污染了 CI 缓存。后来,另一个完全正常的更新触发正式发布流程时,系统再次读取了这个缓存,最终把恶意代码一起打包进了官方 npm 版本里。
TanStack 复盘的时候说:
攻击者先提交一个恶意 PR
↓
这个 PR 触发了 GitHub Actions
↓
CI 在运行过程中执行了攻击者代码
↓
攻击者污染了 CI 缓存(cache poisoning)
↓
正式发布流程再次读取这个缓存
↓
恶意代码进入官方 release pipeline
↓
CI 自己生成合法 OIDC 发布凭据
↓
官方流程亲手发布了恶意 npm 包

这些恶意包并不是伪造的“假包”,而是真正通过官方流程发布出来的。
攻击者甚至没有入侵 npm 账号,他们只是提交了一个 Pull Request,随后利用项目自动化流程中的漏洞,把恶意代码混进了官方发布版本。
普通的包中毒只是“守株待兔”,等你去下。
普通的投毒是需要开发者、用户去下载、安装,才会中招。
但这个恶意代码只要你在本地运行了它,它就会立刻扫描你的电脑,偷走你的 npm 令牌和 GitHub 密钥。
然后,它会利用你的权限,自动去翻你参与过的其他 GitHub 仓库,悄悄修改它们的 CI 配置,这意味着,你维护的其他项目,在下一次自动化构建时,都会变成新的毒源。
而这个过程,不就是蠕虫病毒(Computer Worm)吗?
蠕虫病毒是一种通过网络自动传播的独立恶意程序,无需人工干预即可利用系统漏洞自我复制。
过去,我们总觉得,只要不下载莫名其妙的安装包、看准官方认证、官网,守护好自己的账号,应该就安全了,稳了!
但现在,你甚至不能信任「官方渠道的上游代码」,就有点残酷了。
这就好比在某官方旗舰店购买了一台手机,虽然旗舰店是真的、手机外包装也是真的、甚至数据线都是真的,但手机是假的。
在这个自动化的时代,可能除了自己写的那几行代码,其它的你都得留个心眼。
(现实是,自己的代码也是 AI 写的…)
手上的项目,先别着急升级,让子弹飞一会,等个一周两周的,再去碰最新的代码。
原文:https://www.appinn.com/tanstack-npm-compromise/
另外,npm 攻击已经…很多次了 😭
光青小蛙注意到的就有:
攻击者都不直接攻击最终用户,而是先污染开发者依赖的 npm 包。只要拿下了自动化路径中的某一点,就能完成攻击。