Axios 中招,不只是一个 npm 事故:当开源世界开始把维护者当“供应链入口”

安全 2026年4月3日
Axios 中招,不只是一个 npm 事故:当开源世界开始把维护者当“供应链入口”
Axios 官方披露,两个恶意版本曾短暂进入 npm,并通过额外依赖投放跨平台远控木马。这起事件最刺眼的地方,不只是包被污染,而是攻击者直接绕过代码仓库,从维护者个人账户和设备下手,精准打在开源供应链最脆弱的一环上。

一次只有 3 小时的投毒,却足够让整个 JavaScript 世界冒冷汗

如果你写过前端、Node.js,甚至只是搭过一个普通的 Web 项目,大概率都见过 axios。这个老牌 HTTP 请求库几乎像自来水一样存在于现代 JavaScript 生态里,平时没人会专门夸它,但一旦它出事,影响面就不是“一个库崩了”这么简单。

4 月 2 日,Axios 团队发布事后复盘,确认 2026 年 3 月 31 日,恶意版本 axios@1.14.1axios@0.30.4 曾被上传到 npm。问题不在 Axios 代码本体被悄悄改了多少,而在于这两个版本被植入了一个名为 plain-crypto-js@4.2.1 的依赖,后者会在 macOS、Windows 和 Linux 上安装远程访问木马。换句话说,这不是单纯的“供应链污染”,而是朝开发者机器直接开门。

更让人心里一紧的是时间窗口:恶意版本在 npm 上存活了大约 3 个小时。三小时听起来不长,现实里却足够 CI/CD 系统自动拉包、足够开发者执行一次 npm install、也足够把一台构建机变成下一轮攻击的跳板。开源世界最怕的,从来不是一个 bug,而是“你以为自己在升级依赖,实际上是在给攻击者发邀请函”。

攻击者没有先碰代码,而是先碰人

Axios 在复盘里说得相当直接:攻击者是通过针对主维护者的社工攻击和 RAT 恶意软件,拿下了其个人电脑,继而获得 npm 账户凭证,最终发布了恶意版本。这一点非常关键。它提醒我们,今天的供应链攻击早就不局限于“偷偷往仓库里塞几行代码”。相比硬啃 GitHub、代码审查和签名流程,攻击维护者本人,往往更便宜、更安静,也更有效。

这几年类似剧本已经越来越熟悉了。大家还记得 event-streamua-parser-jscolors/faker 引发的连锁反应,也记得 2024 年震惊安全圈的 xz 后门事件。它们路径不完全一样,但共同点很明确:攻击者开始理解开源生态的真实结构。真正的关键节点,不只是代码库,而是发布权限、个人设备、CI 凭证、注册表账户,甚至是维护者下班后的那台私人电脑。

这件事里最让人唏嘘的一幕,是社区成员在第一时间提交 issue 报告异常,结果这些 issue 又被遭入侵的账户删除。这个细节很像电影里的监控画面被人先掐掉:攻击者知道只要拖延几小时,自动化下载和镜像同步就会把问题放大。也就是说,现代供应链攻击不只是“投毒”,还会主动干扰告警链路,争取传播时间。

这件事为什么比一次普通漏洞更严重

很多非安全从业者看到这类新闻,第一反应常常是:升级回安全版本不就好了?可惜没那么轻松。Axios 官方给出的建议里有一句非常重:如果你的锁文件里出现受影响版本或 plain-crypto-js,应该把那台机器视为“已经被攻陷”。接下来不是简单卸载,而是降级版本、删除恶意依赖、轮换所有密钥和令牌、检查与 sfrclak[.]com142.11.206.73:8000 的网络连接,CI 环境还要额外轮换构建时注入的 secrets。

为什么要这么麻烦?因为远控木马一旦落地,问题就已经从“依赖污染”升级成“终端失守”。开发者机器上通常放着什么?GitHub Token、云平台密钥、SSH 私钥、私有 npm 凭证、生产环境配置、Slack 或 IM 登录态,甚至浏览器里现成的单点登录会话。攻击者一旦拿到其中一部分,受害范围就会像推倒多米诺骨牌一样扩散。

这也是为什么这起事件值得所有技术团队警醒。它不是某个边缘包的小范围事故,而是一次对“默认信任依赖升级”习惯的公开审判。过去很多团队对“最新 patch 版本自动更新”抱有天然好感,觉得小版本升级风险低、收益高。但现实是,只要发布链条被攻破,patch 版本恰恰最容易绕过警觉,因为大家太习惯信任它了。

Axios 的补救动作是对的,但也暴露了开源的老问题

从复盘看,Axios 团队已经采取了几项补救措施:彻底清理主维护者设备、重置所有凭证、推进不可变发布流程、采用 OIDC 发布、更新 GitHub Actions 安全实践,并承认过去直接从个人账户发布是一个本可避免的风险。这个态度是坦诚的,也比很多项目出事后的“轻描淡写”强得多。

但坦白说,这些动作本来就该是高影响力开源项目的标配,而不是事故后的补课。OIDC、最小权限、不可变构建、独立发布身份、异常发布告警,这些词听起来像企业安全 PPT,过去总让人觉得离“靠爱发电”的开源社区有点远。问题在于,像 Axios 这样的包,早就不是“周末兴趣项目”的影响等级了。它被全世界海量应用、脚手架、企业内网系统默默依赖,安全治理却还常常停留在个人维护者模式。这种不对称,本身就是风险。

Axios 还提到一个很现实的问题:当时并没有自动化机制检测未授权发布,最初发现异常几乎完全依赖社区。说白了,就是“靠人眼”。这在今天的供应链环境里已经不够用了。企业用户会给生产系统配监控、告警、回滚、审计,开源项目同样需要一套面向发布环节的“安全可观测性”。否则再知名的项目,也可能因为一个夜里没人盯着的发布动作,瞬间把风险扩散到全球。

开源供应链进入“人比代码更脆弱”的阶段

这起事件还有一层更大的行业意味:开源安全的战线,正在从代码质量问题,转向身份与信任问题。过去我们谈依赖安全,容易想到 CVE、漏洞扫描、SCA 工具、SBOM。现在这些仍然重要,但已经不够。因为攻击者越来越擅长不制造明显漏洞,而是合法地“以维护者身份”发布恶意内容。工具扫描代码,未必能第一时间看穿一个表面正常的升级包;可一旦包名、版本号、维护者身份都是真的,防线就会变得暧昧。

这也带来一个值得争论的问题:像 Axios 这样体量巨大的开源项目,是否还应该继续依赖个人主导的发布模式?从理想主义角度看,开源精神强调开放与信任;但从现实主义角度看,全球关键依赖若仍系在少数个人账户和私人设备上,风险已经不是个人能独自承担的。也许未来会有更多基金会、平台方和商业公司介入,为这些“基础设施型开源项目”提供更制度化的安全支持,比如强制硬件密钥、多方签名发布、注册表侧异常检测、甚至专门的维护者反社工培训。

换个角度看,这次事故也许会推动 npm 乃至更广泛的软件包生态把“发布安全”往前再推一步。因为今天被点名的是 Axios,明天可能是别的你每天都在用、却从未认真看过 changelog 的包。供应链安全最讽刺的地方就在这儿:真正危险的,往往是那个你最熟、最顺手、最不设防的工具。

对于普通开发者和企业团队,这件事带来的结论其实很朴素。不要把锁版本、审计构建、隔离 CI 权限、轮换密钥、监控异常网络请求这些事情,当成“安全部门的爱好”。它们本质上已经是软件工程基本功。你可以不喜欢安全流程的繁琐,但攻击者恰恰最喜欢大家嫌它麻烦。

从记者视角看,Axios 这次复盘最有价值的地方,不是它证明了开源不安全,恰恰相反,它证明了开源社区在出事后仍愿意把错误摊开来讲,把过程交代清楚,把改进路线公开给所有人看。这种透明,本身就是修复信任的一部分。只是透明之后,行业不能再假装惊讶了:维护者,已经成了供应链战争里最先被瞄准的人。

Summary: Axios 事件不会是最后一次,因为攻击者已经发现,拿下一个维护者,往往比研究一堆代码更划算。我判断,未来一年开源生态会更快推进 OIDC 发布、不可变构建和多方签名,npm、GitHub 这类平台也会承受更大压力,必须把“发布异常检测”做成基础设施。对开发者来说,这次事故最大的提醒不是恐慌,而是认清现实:今天的软件供应链,守的早已不只是代码,而是信任本身。
开源供应链攻击Axiosnpm恶意依赖投毒远程访问木马维护者账户入侵plain-crypto-jsJavaScript 生态CI/CDNode.js