如果你公司的应用、网站、网店或 API 是用 Node.js 开发的,包括 Next.js 网站以及基于 Express 或 NestJS 的后端,请今天就让开发人员把 Node.js 更新到 22.23.4、24.22.1 或 26.12.1 版本,然后重新构建并重启服务器。Node.js 项目于 2026 年 10 月 21 日发布了这些版本,修复一个名为 Node2Shell(CVE-2026-111497)的漏洞。该漏洞评分为 9.2 分(满分 10 分),攻击者无需任何密码,只要发送特制的压缩数据,就能在你的服务器上执行代码。沙特国家网络安全局(NCA)已发布「极高」级别的警报;10 月 27 日,美国网络安全机构 CISA 确认该漏洞正在被用于真实攻击。
到底发生了什么?
漏洞出在 Brotli 上。Brotli 是一种压缩格式,Web 服务器和浏览器用它来缩小相互传输的数据,而 Node.js 自带一份由 Google 开发的 Brotli 解码器副本。根据Node.js 安全公告,格式错误的压缩数据会让解码器越过内部缓冲区的末尾写入数据,可能导致应用崩溃、泄露内存内容,或让攻击者执行代码。公告将这一漏洞的报告者列为 OpenAI 的 Codex Security 团队;同一次发布共修复了 10 个漏洞,其中 4 个为高危。
此后事态发展很快。10 月 22 日,也就是修复发布后的第二天,Imperva 红队通过两条日常路径在官方 Node.js 24.22.0 镜像上执行了代码:内置的 fetch() 函数,以及由 Express 5 处理的请求体。10 月 26 日,ELLIO 记录到携带公开攻击代码的真实利用流量。10 月 27 日,CISA 将该漏洞加入其已被积极利用的漏洞目录。
这个缺陷本身由来已久。根据CVE 记录,它影响 Brotli 1.0.3 至 1.2.0 版本。OpenAI 表示,问题的根源早在 2026 年 2 月就已在 Brotli 源代码中修复,但当时没有人知道这是安全漏洞,也没有发布新版本,直到 10 月 21 日 Brotli 1.2.1 发布。如果你觉得似曾相识,那并非巧合:上周我们报道了打开 PHP 和 WordPress 服务器的 PHP2Shell 漏洞。对用 JavaScript 构建的应用来说,Node2Shell 是同一类风险。
我的应用受影响吗?
Node.js 承担着相当一部分现代网站、移动应用后端、管理后台和 API 的服务器端工作。如果你的系统是近几年由外包公司或自由开发者搭建的,那么它很可能在你不知情的情况下运行在 Node.js 上。受影响的版本线是修复版本之前的 22.x、24.x 和 26.x,以及已停止支持的 20.x、23.x 和 25.x;Node.js 项目指出,这些停止支持的版本线始终受影响,也不会获得修复。
仅仅运行 Node.js 并不意味着你一定暴露在风险中:必须有某个环节把攻击者的数据交给解码器。研究人员列出了三条常见路径:
- 传入的压缩请求。Express 5、body-parser 2 和 Koa 的请求体解析器会自动解压 Brotli 格式的请求体,甚至在你自己的代码运行之前就完成了。
- 你的服务器从外部获取的内容。如果你的应用会打开外部链接,例如链接预览、Webhook、爬虫,或读取网页的 AI 智能体,恶意网站就可以用被篡改的压缩数据作出响应。Node 内置的 fetch() 函数、axios 以及 Next.js 等框架中的服务器端请求都会自动解压这些数据。
- 用户上传的文件。任何会解压客户或访客提供的 Brotli 数据的代码。
风险并不止于 Node.js。NCA 的警报还点名了 Python、Bun 和 Envoy;微软于 10 月 25 日为 .NET 8、9、10 和 11,Visual Studio 2019、2022 和 2026,以及 PowerShell 7.4 至 7.6 发布了修复,并将该漏洞在 .NET 中评为「严重」,可利用性评估为「Exploitation More Likely」。微软指出,.NET 默认不启用 Brotli 解压,因此只有启用了该功能的应用才会暴露。
如果你的网站托管在 Vercel 上,该公司在其公告中表示,就在 Node.js 发布修复的同一天,它已为所有项目部署了拦截入站攻击路径的防火墙规则;自 10 月 28 日起,所有新部署都使用已修复的 Node.js。现有项目需要重新部署,仍在使用 Node.js 20 的项目必须切换到 22 或 24。
今天该做什么:五个步骤
- 以书面形式提一个问题。我们的服务器上和 Docker 镜像里运行的是哪个 Node.js 版本?请开发人员用 node -v 命令核对 Node.js 的版本号。不要依赖 Brotli 的版本号:ELLIO 发现,无论是否已修复,它都显示 1.2.0。
- 更新到修复版本。22.23.4、24.22.1 或 26.12.1。如果你还在用 20.x、23.x 或 25.x,请迁移到 22 或 24 等仍受支持的版本线,并在上线前完成测试。
- 重新构建并重启。正在运行的进程会继续使用旧代码。请基于已修复的基础镜像重新构建容器镜像,因为锁定在 24.22.0 的 Dockerfile 会一直交付有漏洞的版本,直到有人修改那一行。同时检查预发布服务器、构建流水线和无服务器函数。
- 更新其他副本。Python 的 Brotli 和 brotlicffi 包(1.2.1 版本和 1.2.1.0)、Bun、Envoy、你所用 Linux 发行版中的 Brotli 库,以及通过微软 10 月 25 日更新修复的 .NET。
- 检查日志和崩溃文件。留意异常庞大的 Brotli 压缩请求和反复出现的进程崩溃。ELLIO 警告说,大多数失败的攻击会让进程崩溃,而崩溃文件可能保存访客的会话 Cookie 和密钥,因此要限制谁能读取崩溃文件(core dumps),并缩短保留时间。
如果今天无法更新
作为临时措施,如果你的应用不需要,请在前端服务器或防火墙上拦截带有 Content-Encoding: br 请求头的入站请求。Vercel 和 Imperva 已为该漏洞添加防火墙规则,但 Vercel 自己也强调,防火墙无法覆盖你的服务器从其他网站获取的响应:只有更新 Node.js 才能堵住这条路径。请把任何防护层都当作争取来的时间,而不是更新的替代品。
Origami 的观点
一个月内,Web 的基础层接连出现两个严重漏洞,先是 PHP2Shell,然后是 Node2Shell,这说明了一件事:你的团队写的代码可能没有问题,但底层的运行环境却是敞开的。Node2Shell 的修复在 Brotli 源代码里躺了大约八个月,才有人意识到这是一个安全问题;而细节一公开,研究人员只用了一天就在官方版本上执行了代码。我们在很多公司看到的情况是:一个多年前交付的应用,没有人负责它的更新,也没有一份清单写明 Node.js 实际运行在哪里。如果这正是你的情况,今天就开始整理这份清单。Origami 开发 Web 应用和系统,其中许多基于 Node.js 和 Next.js,我们从第一天起就持续关注其运行环境的更新。如果你希望检查自己的应用,或在不停机的情况下升级 Node.js,欢迎联系我们。
来源
- 沙特国家网络安全局(NCA):Brotli 警报,编号 2026-7959
- Node.js:2026 年 10 月 21 日安全版本
- GitHub 上的 Google Brotli:1.2.1 版本发布说明
- CVE.org:CVE-2026-111497 记录、受影响版本及 9.2 分评分
- CISA:两个被利用的漏洞加入目录,2026 年 10 月 27 日
- 微软安全响应中心:CVE-2026-111497
- Vercel:关于 Node.js 的安全公告
- Imperva 红队:Node2Shell,从 Brotli 数据到代码执行
- ELLIO:Node2Shell 在真实攻击中被利用
- SecurityWeek:微软、Node.js 和 Python 包的修复
常见问题
如果公司网站是用 Next.js 搭建的,会受 Node2Shell 影响吗?
有可能。Next.js 运行在 Node.js 之上,它的服务器端请求会经过有漏洞的解码器。在 Vercel 上,自 10 月 28 日起新部署都使用已修复的 Node.js,所以重新部署即可;如果是自行托管,请把 Node.js 更新到 22.23.4、24.22.1 或 26.12.1。
哪些 Node.js 版本修复了 Node2Shell?
2026 年 10 月 21 日发布的 22.23.4、24.22.1 和 26.12.1。20.x、23.x 和 25.x 版本线已停止支持,不会获得修复,请迁移到 22 或 24。
怎么知道我的应用用的是哪个 Node.js 版本?
请开发人员在服务器上和每个 Docker 镜像中运行 node -v,并把结果以书面形式发给你。不要依赖 Brotli 的版本号:无论是否修复,它都显示 1.2.0。
用 Web 应用防火墙(WAF)代替更新可以吗?
不可以。WAF 可以拦截传入的恶意压缩请求,但无法覆盖你的服务器从其他网站获取的响应。Vercel 和 Imperva 都为该漏洞添加了 WAF 规则,但两家仍要求客户更新 Node.js。
在 Google 上关注 Origami
把 Origami 设为首选来源,我们的文章就会优先出现在您的 Google 搜索和热门新闻中。








