Wednesday, November 11, 2026 Security Releases
The Node.js Project
安全版本已发布
针对以下问题,26.x、24.x、22.x Node.js 发布系列的更新现已可用。
已修复的漏洞
本次安全版本包含以下依赖更新,以解决公开漏洞:
- llhttp 于 22.x、24.x、26.x
- undici 于 24.x、26.x
- sqlite 于 22.x、24.x
HTTP/2:远程中止,~Http2Session() 中的 CHECK_EQ(current_nghttp2_memory_, 0)(CVE-2026-123863)-(高危)
Node.js HTTP/2 会话拆除过程中存在一个可触发的断言,使任何未经身份验证的客户端都能中止服务器,无论通过 TLS 还是明文。客户端可以设法让一个仍持有 nghttp2 分配的头部缓冲区的 Http2Stream 比其会话存活更久:该流会从会话的流集合中移除,但从未被分离,因此当 ~Http2Session() 运行时内存计数不为零,CHECK_EQ(current_nghttp2_memory_, 0) 断言失败,导致进程终止。触发该问题只需要一个默认的 http2 服务器,其处理程序在请求体结束前就作出响应,而这属于典型情况。它是 CVE-2024-27983 的一个变体,此前的修复并未覆盖,因为那次修复只分离了仍被会话跟踪的流。
- 此漏洞影响活跃发布系列中的所有用户:24.x、26.x
感谢 Chris Rohlf 与 Claude 和 Anthropic Research 合作报告此漏洞,感谢 mcollina 修复此漏洞。
HTTPS:零长度 TLS 写入会重入 llhttp_execute(),服务器将自身堆内存复制到请求体中(CVE-2026-123864)-(高危)
Node.js HTTPS 中的一个重入缺陷使未经身份验证的客户端能够读取属于其他连接的内存,包括 TLS 私钥和其他用户的请求。当被要求写入零字节时,TLSWrap::DoWrite() 会直接调用 ClearOut();如果该写入是由运行在 HTTP 解析器 on_body 回调中的 JavaScript 发起的,ClearOut() 会在解析器仍处于请求体中途时解密下一条 TLS 记录,从而重入 llhttp_execute(),导致释放后使用和堆越界读取。随后服务器会将那段已释放或无关的堆内存复制到该请求体的响应中。触发该问题需要一个处理程序在请求体结束前调用 res.flushHeaders(),并在之后以非空数据块调用 res.end(),而读取泄露的内存则需要任何回显或存储请求体的普通路由。明文 node:http 不受影响。
- 此漏洞影响活跃发布系列中的所有用户:22.x、24.x、26.x
感谢 Chris Rohlf 与 Claude 和 Anthropic Research 合作报告此漏洞,感谢 mcollina 修复此漏洞。
如果在连接关闭期间触发协议错误,HTTP/2 会话将永远不会清理(CVE-2026-123865)-(高危)
未经身份验证的 HTTP/2 客户端可以永久泄漏 Node.js 服务器内存和文件描述符。如果对端在会话已处于关闭过程中时触发协议错误,例如过大的帧头,nghttp2 会在内部拆除会话,但 Node.js 永远不会察觉,从而留下一个悬空会话:套接字停留在 CLOSE_WAIT 状态,该连接的所有 Node.js HTTP/2 状态被无限期保留在内存中,而攻击者无需再付出任何代价。攻击者可以通过发送 GOAWAY(NO_ERROR) 远程启动关闭过程,因此对默认 HTTP/2 服务器可靠有效。这是 CVE-2026-48937 的不完整修复案例:那次修复通过监视非关闭状态下发送的 GOAWAY 来检测 nghttp2 内部终止,但漏掉了在会话已处于关闭过程中到达的终止。
- 此漏洞影响活跃发布系列中的所有用户:22.x、24.x、26.x
感谢 pimterry 报告此漏洞,感谢 mcollina 修复此漏洞。
文章标题:2026年11月11日星期三 安全版本发布
正文:
HTTP/2 流拆除可能将已释放的响应内存发送给对端(CVE-2026-123866)-(高危)
Node.js HTTP/2 流拆除中的释放后使用(use-after-free)漏洞可能将响应内存泄露给对端,包括其他连接的响应缓冲区内容。当流在写入仍处于背压状态时被拆除——例如由对端 RST_STREAM 或服务器自身的每流超时销毁该流——流的响应缓冲区被释放,但对它的引用仍被使用,因此被释放的或无关的堆内存被写入套接字,而不是预期的响应。在 Node.js 26.x 和 24.x 上,一旦存在 26.9.0 和 24.22.0 引入的窗口大小变更,拆除就可以完全由远程对端驱动;在所有受支持的分支上,同一缺陷也可通过应用发起的拆除(例如每流空闲超时)触达。
- 此漏洞影响活跃发布分支中的所有用户:22.x、24.x、26.x
感谢 aidan02 报告此漏洞,感谢 mcollina 修复此漏洞。
Node.js 易受通过延迟握手回调远程触发的 TLS 服务器未捕获异常影响(CVE-2026-126051)-(高危)
Node.js TLS 服务器握手处理中的延迟回调销毁后使用(use-after-destroy)漏洞允许远程未认证攻击者终止服务器进程。当 TLS 服务器使用 SNICallback、OCSPRequest、newSession 或 resumeSession 钩子中的任意一个,或使用 server.addContext() 时,相应的 OpenSSL 回调会被延迟执行,而延迟执行的代码没有处理底层套接字在调度与执行之间被销毁的情况。通过发送一个到达易受攻击路径的 client hello(例如不带 SNI 同时附带 OCSP 请求),随后发送填充数据和套接字 FIN,攻击者使 OpenSSL 在同一 tick 内交付 client hello 和文件结束,因此套接字在延迟回调运行之前被销毁,进程抛出未捕获异常,而不是发出 'error' 事件。
- 此漏洞影响活跃发布分支中的所有用户:24.x、26.x
感谢 pimterry 报告此漏洞并修复此漏洞。
TLS 1.2 重协商允许客户端单方面更改 servername 以绕过客户端证书认证(CVE-2026-123872)-(高危)
Node.js TLS 中的客户端证书认证绕过漏洞允许客户端在 TLS 1.2 重协商期间更改 servername,以访问其未被授权访问的端点。在按主机名应用不同客户端证书策略的服务器上——例如一个主机上采用更严格的管理员专用客户端证书认证,另一个主机上采用普通客户端证书认证——为允许的主机完成认证的客户端可以在不同的 servername 下重协商 TLS 1.2 连接,并将其现有认证携带到受保护的主机,从而绕过更严格的策略。
- 此漏洞影响活跃发布分支中的所有用户:22.x、24.x、26.x
感谢 pimterry 报告此漏洞并修复此漏洞。
HTTP/2:当 respondWithFile() 流在待处理写入期间被重置时 Http2Stream 的释放后使用(CVE-2026-123874)-(高危)
Node.js HTTP/2 中的释放后使用漏洞允许未认证客户端破坏服务器内存,在 TLS 和明文传输下均可触发,前提是服务器使用 respondWithFile() 或 respondWithFD() 提供文件。客户端可以使服务器在指向某个 Http2Stream 的写请求仍排队在套接字上时释放该 Http2Stream;当该写入完成时,代码解引用该已释放对象并通过它进行虚调用。唯一的前提条件是应用程序使用 stream.respondWithFile() 或 stream.respondWithFD() 提供文件,其余均为默认设置。
- 此漏洞影响活跃发布分支中的所有用户:24.x、26.x
感谢 Chris Rohlf 与 Claude 和 Anthropic Research 合作报告此漏洞,感谢 mcollina 修复此漏洞。
使用长 origin 调用 session.altsvc() 时出现远程未认证 HTTP/2 堆缓冲区溢出 (CVE-2026-123828) - (中危)
Node.js HTTP/2 Alt-Svc 处理中存在一字节堆缓冲区溢出,可让远程未认证攻击者破坏进程内存。当应用程序将攻击者可控的值(例如请求的 :authority 头)传给 Http2Session.altsvc() 时,src/node_http2.cc 中的 AltSvc 实现会按 origin 长度分配缓冲区,然后写入一个空终止符,从而在分配范围末尾之外多写一个字节。单个携带较长但语法有效的 :authority 的请求即可触发该越界写入,导致进程中止,并构成远程堆破坏原语。
- 此漏洞影响所有处于活跃发布线的用户:24.x、26.x
感谢 zonduu 报告此漏洞,感谢 mcollina 修复此漏洞。
仅含 CA 的 SNI 客户端 CA 覆盖会失效开放至默认 CA,从而绕过按主机 mTLS 授权 (CVE-2026-123867) - (中危)
Node.js 中存在按主机双向 TLS 授权绕过,可让已获默认主机名授权的客户端访问其无权访问的受保护主机名。当 TLS 服务器通过 server.addContext(host, { ca: protectedCA }) 为某主机名分配不同的客户端证书 CA,但该 SNI 上下文中没有服务器证书时,按主机的客户端 CA 永远不会被安装,握手会回退到默认客户端 CA。在 src/crypto/crypto_tls.cc 中,CertCbDone 仅在 setSniContext 成功时才安装 SNI 上下文的 CA,但 setSniContext 对没有服务器证书的上下文返回 false,因此仅含 CA 的 SNI 上下文会静默保留默认 CA。持有受默认 CA 信任、但不受受保护 CA 信任的证书的客户端,因此可以完成到受保护主机名的 mTLS 并读取其响应,即使启用了 requestCert 和 rejectUnauthorized;而由受保护 CA 认证的客户端则会被拒绝。
- 此漏洞影响所有处于活跃发布线的用户:22.x、24.x、26.x
感谢 aur0r4_glyph 报告此漏洞,感谢 mcollina 修复此漏洞。
排队在未排空流上的 HTTP/2 入站数据不计入任何会话预算,因此 maxSessionMemory 既无法限制它,也无法拒绝新流 (CVE-2026-123868) - (中危)
未认证的 HTTP/2 客户端可以耗尽 Node.js 服务器内存,因为排队在未排空流上的入站数据不计入任何会话预算。每个入站数据帧都会在接收流的可读队列中创建一个 JavaScript Buffer 视图,但没有任何机制将该队列计入 current_session_memory_:套接字读取缓冲区仅在解析期间计入并立即释放,因此任何留在队列中的数据都不计入任何预算。对端用一字节数据帧填满流的接收窗口时,每帧在网络上约付出 10 字节,而服务器每帧保留约 114 字节,因此单个连接上的单个流可以从发送的几十兆字节中保留数百兆字节。maxSessionMemory 既无法限制这种增长,也无法拒绝新流,因为 Http2Session::CanAddStream 使用同一个永远看不到该队列的计数器来控制准入。
- 此漏洞影响所有处于活跃发布线的用户:24.x、26.x
感谢 jiri1234 报告此漏洞,感谢 mcollina 修复此漏洞。
ERR_PROXY_INVALID_CONFIG 错误消息中泄露代理凭据 (CVE-2026-123871) - (中危)
文章标题:2026年11月11日星期三 安全版本发布
正文: Node.js 在 ERR_PROXY_INVALID_CONFIG 错误消息中泄露代理凭据。CVE-2026-48615 确立了代理凭据不得出现在 Node.js 错误消息中,并从 ProxyConfig.href 中隐去了用户名和密码,但该修复遗漏了同一子系统中的四条错误路径,其中一条位于同一个构造函数内,这些路径会将包含凭据的原始代理 URL 插值到 ERR_PROXY_INVALID_CONFIG 消息中。代理 URL 来自环境变量,但缺陷在于输出端:一个 Node.js 在其他所有地方都会隐去的机密,被原样输出给了远比进程环境更广泛的受众,例如 stderr、容器日志、日志聚合和崩溃报告服务。
- 此漏洞影响所有活跃发布版本的用户:22.x、24.x、26.x
感谢 p-v-p 报告此漏洞,感谢 mcollina 修复此漏洞。
Node.js https.Agent 中通过跨策略 TLS 会话复用绕过证书验证 (CVE-2026-123877) -(中危)
Node.js https.Agent 中的证书验证绕过漏洞,使得在一个 CA 策略下通过认证的缓存 TLS 会话,可被后续采用更严格策略的请求复用。https.Agent.prototype.getName() 会为省略 ca 的请求和显式提供 ca: [] 的请求分配相同的 Agent 和会话缓存键,因为省略的值不会向键中追加任何内容,而空数组字符串化后为空字符串。这两种策略不同:省略 ca 使用默认信任存储,而提供 ca 则会替换它。由于它们共享同一个键,在更宽泛的默认策略下通过认证的 TLS 会话被交给了在后续 ca: [] 策略下建立的新连接,而 TLS 1.3 会话恢复会将先前的认证延续下来,因此第二个请求报告 authorized === true,并将机密数据传输给一个按其自身 CA 策略在全新连接上会被拒绝的服务器。
- 此漏洞影响所有活跃发布版本的用户:22.x、24.x、26.x
感谢 aegis1337 和 mickeyjoe 报告此漏洞,感谢 mcollina 修复此漏洞。
HTTP/2:取消一个 respondWithFile() 下载会导致服务器崩溃(StreamPipe 中的 NULL 解引用)(CVE-2026-123875) -(中危)
Node.js HTTP/2 中的 NULL 指针解引用漏洞,使得未经认证的客户端可以通过取消文件下载,在 TLS 和明文两种模式下均导致服务器崩溃。当服务器使用 stream.respondWithFile() 或 stream.respondWithFD() 提供文件,而客户端取消请求时,用于传输的 StreamPipe 会以某种顺序被拆除,从而留下一个 NULL 指针,随后该指针被解引用,导致进程中止。无需构造任何帧,针对默认文件服务处理程序的少量取消请求就足以触发。
- 此漏洞影响所有活跃发布版本的用户:22.x、24.x、26.x
感谢 Chris Rohlf 与 Claude 和 Anthropic Research 合作报告此漏洞,感谢 mcollina 修复此漏洞。
递归 fs.watch 中的权限模型绕过泄露被拒绝后代项的名称 (CVE-2026-123829) -(低危)
Node.js 递归文件监视中的权限模型绕过漏洞,会泄露进程无权读取的文件和目录名称。在 macOS 和 Windows 上,递归模式下的 fs.watch() 和 fs.promises.watch() 由原生 libuv 监视器支持:FSEventWrap::Start 仅在被监视的根目录上检查一次 kFileSystemRead,随后 FSEventWrap::OnEvent 将 libuv 报告的每个文件名(任意深度的相对路径)转发给 JavaScript 回调,而不检查每个路径是否被读取授权覆盖。因此,在 --permission 下运行且对某个目录拥有精确读取授权的代码,可以获知诸如 sub/secret.txt 这样的名称,即使对该子目录的 readdir 被拒绝。该缺陷暴露的是名称和时序元数据,而非文件内容,且需要 macOS 或 Windows,以及由其他行为者在被监视目录下创建的文件。
像 {{NAME_ab12cd34}} 这样写入的值是真实值的占位符。在回复和工具调用中都请完全按原样使用它们:它们会在任何内容运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。
文章标题:2026年11月11日星期三 安全版本发布
正文:
- 此漏洞影响所有活跃发布版本的用户:22.x、24.x、26.x
感谢 Trail of Bits(OpenAI)报告此漏洞,感谢 RafaelGSS 修复此漏洞。
zlib:待处理的 params() 加上 destroy() 会抛出无法捕获的 ERR_INTERNAL_ASSERTION(CVE-2026-123862)-(低)
Node.js zlib 流式 API 中存在一个无法捕获的异常,对端在数据压缩过程中断开连接即可使进程崩溃。zlib.params() 会排队一次 flush,并在该写入的回调中完成其工作;如果流先被销毁(正如 pipeline() 在对端消失时所做的那样),Writable 仍会带着错误调用该回调,但回调忽略其参数,并断言原生句柄仍然存在。句柄已不存在,因此从流内部抛出 ERR_INTERNAL_ASSERTION,绕过流的 error 事件、params() 回调和 pipeline() 回调,导致进程终止。仅当应用在向对端流式传输时调用 deflate.params() 才会受影响,这种情况并不常见。
- 此漏洞影响所有活跃发布版本的用户:22.x、24.x、26.x
感谢 Chris Rohlf 与 Claude 和 Anthropic Research 合作报告此漏洞,感谢 mcollina 修复此漏洞。
权限模型文件系统因通配符基数树查找而过度授权(CVE-2026-106071)-(低)
Node.js 权限模型文件系统过度授权允许通配符 --allow-fs-read 或 --allow-fs-write 规则匹配本不应匹配的路径。当请求的路径短于通配符授权的前缀时,基数树查找会提前停止比较并将该路径视为匹配,因此例如 --allow-fs-read=/etc/passwd.* 也会允许读取 /etc/passwd。这要求通配符授权直接位于权限树的根之下,例如当它是该作用域的唯一授权时。
- 此漏洞影响所有活跃发布版本的用户:22.x、24.x、26.x
感谢 malikhamzaiqbal 报告此漏洞,感谢 jasnell 修复此漏洞。
下载与发布详情
- Node.js v22.23.5
- Node.js v24.22.3
- Node.js v26.13.1
Node.js 项目将于 2026年11月11日星期三或之后不久发布 26.x、24.x、22.x 发布线的新版本,以解决:
此版本中修复的最高严重性问题为 HIGH。
影响
26.x 发布线中修复的最高严重性问题为 HIGH。24.x 发布线中修复的最高严重性问题为 HIGH。22.x 发布线中修复的最高严重性问题为 HIGH。
需要注意的是,发生安全版本发布时,End-of-Life 版本始终会受到影响。为确保系统安全,请使用我们发布日程中所述的最新版本。
发布时间
版本将于 2026年11月11日星期三或之后不久提供。
联系与未来更新
当前 Node.js 安全策略见 https://nodejs.org/en/security/。如果您希望报告 Node.js 中的漏洞,请遵循 https://github.com/nodejs/node/blob/master/SECURITY.md 中所述的流程。
订阅低流量、仅发布公告的 nodejs-sec 邮件列表:https://groups.google.com/forum/#!forum/nodejs-sec,以随时了解 Node.js 及 nodejs GitHub 组织中维护的项目的安全漏洞和安全相关版本。
像 {{NAME_ab12cd34}} 这样写出的值是真实值的占位符。请完全按原样使用它们,在回复和工具调用中都是如此:它们会在任何内容运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。