教程|

Axios 刚被投毒了:一次普通的 npm update,怎么就可能把后门请进公司电脑

axios 这次中招,不是代码里多了几行恶意逻辑,而是有人用被盗的维护者账号发了带后门依赖的版本。对开发者来说,这件事最吓人的地方不是‘某个包出事了’,而是你一次看起来再普通不过的 npm update,也可能直接把机器送进事故现场。

Axios 刚被投毒了:一次普通的 npm update,怎么就可能把后门请进公司电脑

有些安全新闻看完,会让人觉得‘哦,又一个包出事了’。

axios 这次不太一样。因为它不是某个冷门小库,也不是那种你八百年都碰不到一次的边角依赖。它几乎是 JavaScript 世界里最熟脸的 HTTP 客户端之一,很多项目里都默认装着,很多人甚至不会专门想起自己在用它。

也正因为太常见,这次事件最吓人的地方才成立:你可能只是顺手跑了一次 npm installnpm update,结果装进去的不是一个小版本修复,而是一条通往后门的链路。

根据 StepSecurity 的披露,这次被投毒的是 axios@1.14.1axios@0.30.4。攻击者拿到了维护者的 npm 凭证,绕过了项目原本更可信的发布流程,手动把恶意版本发上了 npm。表面看它还是 axios,实际上却偷偷多塞了一个从来没在源码里真正用到的依赖,用来触发安装阶段的恶意脚本。

这才是供应链攻击最烦的地方:它不一定改你看得见的业务代码,它只要混进你默认信任的安装链路里,就够恶心了。

先说结论:这次到底发生了什么

如果你没跟这条新闻,可以先看核心信息:

  • 受影响版本是 axios@1.14.1axios@0.30.4
  • 攻击者不是往 axios 源码里硬塞木马,而是新增了一个伪装依赖
  • 这个依赖会在安装时通过 postinstall 脚本执行恶意逻辑
  • 目标不分平台,macOS、Windows、Linux 都在打击范围里
  • 恶意包后来被下架了,但装过的人不能只当无事发生

用大白话讲,这不是‘代码写坏了’,而是‘发包链路被人拿去干坏事了’。

真正阴的地方,不在 axios 代码里

很多人一听‘包被投毒’,下意识会去翻源码,看看是不是多了什么奇怪的请求、加密逻辑或者上传代码。

但这次更阴。

报道里提到,恶意版本并没有直接在 axios 自己的源码里塞明显后门,而是注入了一个额外依赖。这个依赖本身几乎没有业务意义,它存在的价值主要就是在安装阶段执行脚本,把后续恶意负载拉下来。

这种做法比直接改源码更脏,原因很简单:

  • 开发者平时不太会逐个审查每个依赖的安装脚本
  • 很多人只看应用能不能跑,不会专门检查依赖树里有没有幽灵包
  • 就算事后去翻 node_modules,攻击痕迹也可能已经被清掉

换句话说,它利用的不是某个语言特性,而是整个生态里那种‘大家默认装包流程是可信的’的习惯。

为什么这件事比普通漏洞更让人头皮发麻

传统漏洞至少还有一种‘系统本身有洞’的感觉。你补丁打了,规则配了,风险边界相对清楚。

供应链攻击不一样。它像什么?像有人穿着快递员衣服,把危险物品送进了你家门口,而且门还是你自己开的。

你没点奇怪链接。
你没运行陌生脚本。
你甚至可能只是做了一个再普通不过的依赖更新。

这就解释了为什么这类事件越来越让团队焦虑:

  • 信任被利用了:你信的是官方包、主流库、正常版本号
  • 动作很日常:安装、升级、CI 拉依赖,都是每天都在发生的事
  • 爆炸半径很大:像 axios 这种量级的包,一旦中招,不是一个项目的问题
  • 排查门槛很高:很多团队根本不知道自己有没有在那个时间窗口里装到问题版本

说狠一点,这种攻击就是专门挑人最松懈的地方下手。

这次事件暴露了一个老问题:我们把 npm install 想得太无害了

前端和 Node 圈有个很常见的错觉:

写代码才算‘执行’,装依赖只是‘准备环境’。

现实是,很多时候安装依赖本身就是执行

只要包里带了 postinstallpreinstall 之类的生命周期脚本,安装过程就不是一个纯粹的下载解压动作,而是带执行能力的。你在本地装,它会跑;你在 CI 装,它也会跑;你在新机器初始化项目,它照样跑。

所以这次 axios 事件真正该让人改掉的,不是‘以后别用 axios 了’这种情绪化反应,而是一个更基础的认知:

依赖安装链路,本来就该被当成高风险执行面。

如果你的环境装过可疑版本,该怎么处理

如果你确认自己装过受影响版本,最不该做的事就是只把版本号降回去,然后假装世界恢复和平。

更稳妥的处理思路是:

  • 先确认项目、CI 或开发机有没有在受影响时间内安装过对应版本
  • 检查锁文件、构建日志、CI 日志里是否出现相关版本记录
  • 轮换可能暴露过的凭证,尤其是环境变量、部署密钥、云服务访问令牌
  • 审查安装期间机器的异常外联、可疑进程和新增计划任务
  • 对高价值环境直接按‘可能已失陷’处理,而不是只做表面清理

这听起来有点狠,但安全里最怕的不是反应过度,而是带着侥幸心理继续上线。

对普通开发团队来说,接下来最值得补的不是鸡血,而是流程

每次出这种新闻,总有人会喊‘开源不安全了’。这话说得又大又空。真正有用的问题不是要不要继续用开源,而是你打算怎么降低被波及的概率。

我会更建议团队先把几件朴素但管用的事情补起来:

  • 锁版本:别让生产环境随手漂到一个刚发布的小版本
  • 区分安装环境:开发机、CI、生产构建机的权限别混着来
  • 减少长期凭证:能短期就短期,能细粒度就别全局通吃
  • 盯住异常依赖:新增但从未被代码引用的依赖,应该算高风险信号
  • 保留可追溯日志:谁在什么时候装了什么版本,最好能查得到

这些动作都不性感,也不适合写成‘AI 帮我十倍提效’那种热血帖,但它们真比口号有用。

这事对 AI 和开发工具时代,反而更值得警惕

现在很多团队已经把自动化拉得很满了:

  • Agent 自动改代码
  • CI 自动装依赖
  • 机器人自动提 PR
  • 部署流水线自动推进

效率是上去了,但也意味着一旦某个基础包出问题,传播速度会比过去更快。以前一个人本地装错,影响可能还有限;现在一个受污染的依赖,很可能顺着自动化链路一路扩散。

所以我越来越觉得,未来开发体系里真正贵的东西,不是‘谁写代码更快’,而是谁能把默认流程做得更不容易出事故

这也是为什么像这次 axios 事件,看上去是安全新闻,实际上打到的是整个工程协作的底层假设:

你以为自己在升级工具,实际上你是在重新决定系统愿意信任谁。

最后

axios 这次投毒事件,最值得记住的并不是某两个版本号。版本号迟早会过去,热搜也会下去。

真正该留下来的教训是:

在今天的开发环境里,一次看起来平平无奇的依赖安装,早就不只是‘下载一个包’这么简单了。

它可能是构建动作,可能是权限动作,也可能在最糟的时候,直接变成安全事件的起点。

如果你最近在整理团队的依赖治理、安全基线或者 CI 权限边界,这条新闻非常值得拿去内部复盘。因为下一次出事的,未必还是 axios;但下一次被攻击利用的,大概率仍然是大家最习惯忽略的那条链路。

延伸阅读

准备好了吗?

免费注册,立即体验全部功能