一、漏洞概述
2026年10月26日,安全运营中心监测到Node.js官方发布了10月安全更新,本次更新修复了10个漏洞,包含4个高危漏洞。其中最需要重点关注的是CVE-2026-111497(Brotli 解码器 RCE),漏洞威胁等级:严重(CVSS v4.0评分9.2)。另外三个高危漏洞为 CVE-2026-105482(dns.resolve* 空字节截断)、CVE-2026-105483(TLS主机名校验绕过,仅影响26.x/24.x)和 CVE-2026-106069(TLS 主机名校验绕过),其余为中危、低危漏洞。
二、漏洞详情
CVE-2026-111497 Brotli 解码器越界写
(一)漏洞原理
Brotli 流在声明只有一种数据块类型后再做块类型切换,属于格式错误。旧代码对该错误返回与「还需要更多输入」相同的值,调用方未检查返回值,解码器带着错误状态继续运行。随后对内部8 字节残余比特缓存的写入可以越过该缓存,覆盖解码器状态中的位置、距离和环形缓冲区相关字段,形成越界写。补丁将该情况改为立即返回格式错误BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH(值为 -17)。
(二)受影响场景
本漏洞在进程对不可信数据执行Brotli解压时触发。以下场景会执行该解压:
1. 应用作为HTTP客户端访问外部资源。内置fetch()(由 undici 实现)在响应头为 Content- Encoding: br 时调用zlib.createBrotliDecompress。axios、got默认同样解压,可配置关闭。按用户给定URL抓取外部资源(URL 预览、图片代理、webhook 回调、构建产物或软件包下载)且使用上述客户端时 ,可能形成该漏洞的攻击路径;实际触发需要上游返回特制的恶意Brotli数据。
2. 应用作为HTTP服务端,使用Express 5 / body-parser 2的json()、raw()。请求头为Content-Encoding: br 时解压请求体(inflate 选项默认为true)。
3. 应用自行调用zlib.brotliDecompress、zlib.brotliDecompressSync、zlib.createBrotliDecompress(文件或构建产物解压、持续集成缓存等)。仅使用 http.createServer、未再接会解压的中间件时,入站请求体不会自动解压。
(三)漏洞危害
Node.js官方评级为High,漏洞标题为越界写可导致远程代码执行。Google给出CVSS 4.0 评分9.2(Critical)。具体影响分三层讨论:
拒绝服务:构造流可让解码器自旋或挂起,Node异步 zlib默认只有4个libuv线程,几个请求就能占满并拖垮同进程的fs/crypto/DNS,同步API直接卡事件循环。
内存泄露:越界读可能把堆内容带进解压输出或错误路径 ,泄露密钥、指针等。
远程代码执行:越界写可污染pos、max_distance、ringbuffer等字段,进而做任意读写并劫持控制流;Vercel 的安全公告也确认研究者在未修复的22/24/26上演示了进程内存泄漏和命令执行。
可利用性需客观看待。公开PoC在披露后48小时内已出现多个,Imperva等团队在特定Node构建上完成了无需调试器的 RCE;但成功往往依赖堆布局、分配器行为、ASLR和多次尝试,不是对任意Node服务都能稳定一击必中。
(四)处置建议
优先升级并重启会解压不可信Brotli的进程。容器镜像、CI运行器、 Electron等内嵌Node或同一套Brotli C库的程序一并升级。
部分Linux发行版把Node动态链接到系统libbrotlidec。这种情况除升级Node外,还需将系统Brotli库升到1.0.10、1.1.1或1.2.1(或发行版已backport的对应版本)。
第三方研究指出漏洞涉及PHP multipart上传处理中未认证的远程代码执行路径,另有分析指向session.upload_progress处理函数(php_session_rfc1867_callback)中的堆释放后使用(Use-After-Free),被缓存的zval指针在释放后仍被引用,最终可达zend_call_function形成代码执行。完整技术成因与利用条件将在官方补丁发布时一并公开。PHP官方紧急安全更新定于2026年10月21日22:00(北京时间)发布,若细节扩散或出现攻击,补丁可能提前发布。
三、影响版本
CVE 编号 |
严重程度 |
漏洞名称 |
受影响版本 |
CVE-2026-111497 |
高危 |
Brotli 解码器 RCE |
26.x、24.x、22.x |
CVE-2026-105482 |
高危 |
dns.resolve* 空字节截断 |
26.x、24.x、22.x |
CVE-2026-105483 |
高危 |
TLS 主机名校验绕过 |
26.x、24.x |
CVE-2026-106069 |
高危 |
TLS 主机名校验绕过 |
26.x、24.x、22.x |
CVE-2026-105481 |
中危 |
HTTP 请求与响应顺序错误 |
26.x、24.x、22.x |
CVE-2026-106072 |
中危 |
TLS 证书主机名校验不当 |
26.x、24.x、22.x |
CVE-2026-106074 |
中危 |
密码学随机值重复 |
26.x、24.x、22.x |
CVE-2026-106070 |
低危 |
ZIP 校验失败后暴露不可信数据 |
26.x |
CVE-2026-106071 |
低危 |
权限模型文件系统访问绕过 |
26.x |
CVE-2026-106073 |
低危 |
fs.realpathSync 权限绕过 |
26.x、24.x、22.x |
四、处置建议
(一)临时处置
1. CVE-2026-111497(Brotli 解码器越界写)
·防护类设备或反向代理若能检查HTTP头部,可拒绝Content-Encoding中含br的入站请求(按编码令牌比较,忽略大小写)。
·应用作为客户端访问不可信上游时:axios、got可关闭自动解压。
2. CVE-2026-105482(`dns.resolve*`域名空字节截断)
在调用 dns.resolve* 前检查域名:若包含空字节( '\0'),拒绝本次查询。
以上临时缓解措施不能替代升级,建议尽快升级到修复版本。
(二)官方修复
升级到修复版本(22.23.4、24.22.1或26.12.1)并重启。容器更换镜像标签后重建、滚动发布。CI运行器、Electron应用同样升级其内嵌运行时。