核心内容
▶ 10月21日修复的广泛用于Web服务器开发的Node.js安全漏洞“Node2Shell”(CVE-2026-111497),根源并非Node.js本身,而是谷歌开发的数据压缩技术Brotli中的缺陷。安全公司Aikido Security于10月23日披露了这一情况。
▶ 当程序解压攻击者故意制作的不合规压缩数据时,会发生错误,将数据写入允许的内存区域之外。
▶ 攻击者无需登录即可令服务器停止运行或读取内存;在特定条件下,还能远程执行代码。
▶ 谷歌Brotli 1.0.3至1.2.0版本受到影响,问题已在1.2.1版本中修复。

在Web服务器软件Node.js中发现的严重安全漏洞,并非Node.js单独存在的问题。
安全公司Aikido Security在23日发布的分析报告中指出,Node.js漏洞“Node2Shell”(CVE-2026-111497)源于谷歌开发的数据压缩技术Brotli中的解压功能缺陷。
后续调查还在Python压缩库、负责中继Web通信的Envoy,以及JavaScript运行环境Bun中发现了相同缺陷。
Aikido称,影响范围已从Node.js扩展到整个HTTP通信软件领域,因此将其命名为“HTTP-to-Shell”。韩国互联网振兴院(KISA)于23日发布了Node.js安全更新建议。
◆ 解压时向内存区域之外写入数据
Brotli是一种压缩技术,可缩减网页文本和程序代码的体积,以便更快地通过互联网传输。接收端的服务器或浏览器会解压数据,还原其原始内容,而缺陷就出在这一过程中。
解压程序会默认输入数据符合既定规范并进行处理。如果攻击者发送故意篡改规范制作的压缩数据,程序就可能无法将其拦截,并将数据写入允许的内存区域之外。
这可能导致服务器异常终止或内存信息泄露;在特定条件下,攻击者还可能远程执行恶意代码。根据CVSS 4.0漏洞评分标准,该漏洞得分为9.2分,属于最高级别“严重”。
攻击可以从两个方向发起:恶意客户端可以向服务器发送篡改过规范的压缩数据,恶意服务器也可以在响应中发送此类数据,攻击连接到它的程序。Imperva红队曾在未修复的Node.js 24.22.0正式版本上演示了代码执行。
◆ 不能只修复Node.js
Node.js开发团队于21日发布了22.23.4、24.22.1和26.12.1版本,修复Brotli解压缺陷。但随着问题被确认出在Node.js内置的Brotli库中,受影响范围也随之扩大。
谷歌Brotli 1.0.3至1.2.0版本受到影响,问题已在1.2.1版本中修复;旧分支则分别在1.1.1和1.0.10版本中修复。据Aikido称,Python库“Brotli”和“brotlicffi”也存在相同漏洞,分别在1.2.1和1.2.1.0版本中修复。
这些库会随Python网络通信工具urllib3、aiohttp和httpx一同安装,并自动解压数据,因此,即使开发者没有直接使用Brotli,也可能受到影响。
负责中继Web服务器与应用程序之间通信的Envoy已发布1.40.0等修复版本,Bun则在1.4.4版本中完成修复。已停止支持的Node.js 20、23和25系列没有修复版本。
Apache mod_brotli和Nginx在默认设置下不会解压Brotli请求,因此不受影响。攻击目标是使用受影响版本解压外部传入压缩数据的系统,并非所有使用Brotli的网站都存在风险。
◆ 2月已修复,却被搁置了8个月
这一缺陷早在2月就已被发现。据Aikido称,OpenAI于2月发现并报告了Brotli解压缺陷,谷歌Brotli的源代码也在当时进行了修复。但当时这一错误并未被视为严重安全漏洞。
修复后的代码没有作为正式安全更新发布,因此存在漏洞的版本仍被原样集成到Node.js和Python库等软件中,持续了8个月。OpenAI在其安全支持项目“Patch the Planet”网站上发布了Brotli安全公告。
安全检查工具也漏掉了这一缺陷。Aikido指出,截至23日,漏洞数据库中尚未关联Python软件包的受影响信息,因此pip-audit、Dependabot和Safety等工具无法发出警告。
这些工具会自动检查开发者使用的库是否存在已知漏洞;但如果漏洞虽已登记,却没有与受影响的软件包关联,就不会触发警告。截至25日,尚未报告实际攻击案例,该漏洞也未列入美国网络安全和基础设施安全局(CISA)的已遭利用漏洞目录。
◆ 需要逐一排查各个库
主要软件的修复版本已经发布。问题在于,Brotli还可能被打包在其他程序中。容器镜像、已构建的可执行文件以及操作系统软件包中捆绑的副本,都需要分别更新。
Aikido和Upwind建议,优先检查对外开放的代理服务器,以及会解压请求正文的服务;随后通过软件物料清单(SBOM)和镜像找出所有Brotli副本并确认版本,完成修补后务必重启。若不重启,正在运行的进程仍会继续使用旧版解码器。
如果暂时无法立即安装补丁,也可以采取临时措施:在代理或中间件环节拒绝带有“Content-Encoding: br”的请求;对于外部传入的响应,如果使用Brotli压缩,也在解压前拒绝处理。
如果Python项目并不必须支持Brotli,可以卸载Brotli和brotlicffi软件包,改用gzip等其他压缩方式。仅在请求标头中删除br并不足够,因为恶意服务器可能不受请求影响,直接发送Brotli压缩的响应。