Node.js 26 转入 Active LTS:26.11.0 的服务端新 API 与 26.12.1 的四个 High 修复
从 2026-10-28 起,Node.js 26.x 由 Current 转为 Active LTS,同时 27.x 进入 Alpha。这轮切换前后有两个版本值得服务端代码重点关注:10-07 的 26.11.0(semver-minor,含 Buffer/HTTP/sqlite 的 API 变更)和 10-21 的 26.12.1(安全版,四个 High)。
一、发布时间线
按 nodejs/Release 的排期:
| 版本线 | 状态 | 初始发布 | Active LTS | 维护期开始 | EOL |
|---|---|---|---|---|---|
| 22.x | Maintenance LTS | 2024-04-24 | 2024-10-29 | 2025-10-21 | 2027-04-30 |
| 24.x (Krypton) | Maintenance LTS | 2025-05-06 | 2025-10-28 | 2026-10-20 | 2028-04-30 |
| 26.x | Active LTS | 2026-05-05 | 2026-10-28 | 2027-10-20 | 2029-04-30 |
| 27.x | Alpha | 2026-10-28 | 2027-10-20 | — | 2030-04-30 |
也就是说,现在只有 26.x 还在接收常规的功能性更新,24.x 自 2026-10-20 起只进安全补丁,22.x 更早(2025-10-21)就进入了维护期。
二、26.11.0 中对服务端有用的新增
Buffer
Buffer.isLatin1()(#66298):判断一段 Buffer 是否整段都是合法 Latin-1。以前要自己遍历字节或先解码再比对,现在一次调用完成。Buffer.stringLength()(#66064):先算长度再分配,避免toString()之后再取length的额外拷贝。
HTTP / HTTP2
http.isValidHeaderName()/http.isValidHeaderValue()(#66334):头名的合法性校验从内部函数变成公开 API,写代理、网关、自定义 header 处理逻辑时可以直接调用,不用再自己维护正则。http2新增connectionWindowSize选项(#65619):连接级流控窗口可在建连时配置,对高吞吐、大 body 的 HTTP/2 服务端有实际意义。
进程与运行时
process.ref()/process.unref()从实验转为 stable(#66213)。- 新增
--process-timeout=N(#66138):给进程整体加一个超时上限,超时后退出,适合批处理、CI 脚本和一次性任务。 - heap profile 输出中新增
size和count(#65737),采样文件不用再手工统计。
perf_hooks
- 新增
histogram.diff()和histogram.snapshot()(#66099),可以拿两个时间点的直方图做差,观察一段区间内的延迟分布,而不是看累计值。 RecordableHistogram允许记录 0 值(#66114)。- 修复
monitorEventLoopDelay分辨率被截断的问题(#66115)。 - 直方图导出格式升到 version 2(#66098),如果下游有解析脚本,需要同步改。
sqlite
DatabaseSync与StatementSync改名(#65988)。这是node:sqlite内的命名调整,升级时留意类型名和文档引用。
其他
- 文档层面把 Alpine Linux 提升为 tier 2 支持(#63737)。
- 依赖更新:npm 11.20.0、undici 8.11.2、openssl 3.5.9、timezone 2026e。
三、26.12.1 安全版(2026-10-21)
发布说明见 v26.12.1。这次最高等级为 High,共四条:
- TLS 拒绝非规范 IP 地址(CVE-2026-106069、CVE-2026-106072,High):同一处的两个编号,处理证书/SNI 中出现的非规范形式 IP 字面量。
- dns
resolve输入校验 null 字节(CVE-2026-105482,High):dns.resolve系列不再接受夹带 null 字节的主机名。 - TLS IP 归一化回归修复(CVE-2026-105483,High):修正上一处 IP 归一化引入的回归。
- brotli 越界(CVE-2026-111497,High):暴露
BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH,并从上游 cherry-pick 修复(deps: brotli: cherry-pick 0ed4268a4401abcb44720963)。
Medium 与 Low:
http:在无 I/O 场景下也让 agent 的 data guard 生效(CVE-2026-105481,Medium)。crypto:跨快照重置随机数缓存(CVE-2026-106074,Medium),涉及v8.startupSnapshot相关的进程。zlib:不再缓存非法的 ZIP local header(CVE-2026-106070,Low)。src:修复通配节点上的 fs permission 树节点(CVE-2026-106071,Low)。permission:在realpathSync路径上检查权限模型(CVE-2026-106073,Low)。
此外还有一次 V8 backport,以及根证书更新到 NSS 3.131.1。
同一批补丁同时进入 v22.23.4 和 v24.22.1,三条线的最高等级都是 HIGH。10 月的汇总页在 。
四、升级时要检查的几处
- 自定义
lookup:如果给https.request/net.connect传了自己的lookup函数,确认返回的地址是规范化的 IP 字符串——dns 的 null 字节校验和 TLS 的 IP 归一化改动都可能影响这条路径。 - 证书或 SNI 里用 IP 字面量:拒绝非规范 IP 之后,形如带前导零或多余格式的 IP 不再被接受。内网自签证书、以 IP 作 SAN 的服务要实际跑一遍握手。
- Buffer 上的 Latin-1 手工判断:
for循环逐字节检查<= 0xFF的代码可以直接换成Buffer.isLatin1(),行为一致且少一次遍历。 node:sqlite的类型名:确认代码和生成代码里引用的是改名后的DatabaseSync/StatementSync。- 直方图导出解析:导出格式已到 v2,监控侧如果有自写 parser,同步更新。
- 启用权限模型的服务:
realpathSync路径现在会检查权限,符号链接密集的目录可能首次报出之前没出现的拒绝。
三条 26 的 High 集中在 TLS 和 DNS,属于网络入口路径,建议先做灰度验证,再推全量。