ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Node.js 12.22.7 (LTS) 安全发布解析:llhttp 升级与 HTTP Request Smuggling 漏洞修复

2026/9/18 3:51:37 拓冰建站 浏览量
Node.js 12.22.7 (LTS) 安全发布解析:llhttp 升级与 HTTP Request Smuggling 漏洞修复 Node.js 12.22.7 (LTS) 安全发布解析llhttp 升级与 HTTP Request Smuggling 漏洞修复【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org2021 年 10 月 12 日Node.js 项目针对 v12.x、v14.x、v16.x 三条发布线同步发布了安全更新其中 v12.22.7 发布说明 是 v12 LTS 线在该轮安全发布中的对应版本。本篇文章以该发布说明为骨架结合本仓库中同日的 安全公告、v14.18.1 / v16.11.1 的发布说明以及发布公告的自动化生成脚本源码完整拆解两个中危 CVE 的成因、修复方式、回归测试与下载校验流程帮助你理解HTTP Request Smuggling这类攻击形态以及 Node.js 团队如何用 llhttp 升级 回归测试的方式闭环安全问题。一、发布背景一次跨三条 LTS 线的同步安全更新v12.22.7 属于 Node.js v12 发布线2019 年 4 月发布、2022 年 4 月 EOL 的 LTS 版本。该版本发布于 2021 年 10 月 12 日作者为 Danielle Adams属于安全发布Security Release而非常规功能版本。从仓库中的官方安全公告可以确认这是一次跨发布线的同步更新v12.x、v14.x、v16.x 三条发布线同时受两个中危漏洞影响同一天分别发布了Node.js v12.22.7 (LTS)Node.js v14.18.1 (LTS)Node.js v16.11.1 (Current)这也解释了为什么三份发布说明v12.22.7、v14.18.1的 Notable changes 内容几乎一致——它们是同一次安全修复在不同发布线上的落版。对比可见v12.22.7 发布说明 与 v14.18.1 发布说明 的漏洞描述逐字相同仅 commit 哈希与私有仓库 PR 编号nodejs-private/node-private#286 vs #285不同。本次安全发布涉及的漏洞编号标题严重级别影响范围CVE-2021-22959HTTP Request Smuggling due to spaced in headers请求头中空格导致的 HTTP 请求走私Medium中危v12.x、v14.x、v16.x 全部版本CVE-2021-22960HTTP Request Smuggling when parsing the body解析请求体时的 HTTP 请求走私Medium中危v12.x、v14.x、v16.x 全部版本两个漏洞均由 Mattias Grenfeldt 与 Asta Olofsson 报告。二、漏洞原理什么是 HTTP Request SmugglingHTTP Request SmugglingHTTP 请求走私HRS是一种利用前端代理/负载均衡器与后端服务器对同一 HTTP 请求解析不一致的攻击技术。攻击者构造一个歧义请求使前端解析器认为是一个请求、后端解析器认为是另一个或多个请求从而把恶意请求走私到后端绕过访问控制、污染缓存或窃取其他用户的请求数据。CVE-2021-22959请求头冒号前的空格漏洞描述原文指出The http parser accepts requests with a space (SP) right after the header name before the colon.即 HTTP 解析器接受了**在头部字段名之后、冒号之前存在一个空格SP, 0x20**的请求。例如GET / HTTP/1.1 Host : example.com按照 HTTP 规范RFC 7230字段名与冒号之间不应有空格。当一台代理对Host :与Host:的解析结果不同例如代理认为头部名是Host而丢弃或忽略后端 Node.js 却接受为Host就可能出现前后端对同一请求头部解析结果不一致形成走私条件。CVE-2021-22960分块请求体中的 chunk extensions 被忽略漏洞描述原文指出The parse ignores chunk extensions when parsing the body of chunked requests.即当解析Transfer-Encoding: chunked的请求体时解析器忽略了 chunk extensions分块扩展。chunked 编码的每个分块可以携带分号后的扩展字段例如POST / HTTP/1.1 Transfer-Encoding: chunked 4;ext1 Wiki 5;ext2 pedia 0如果解析器错误地忽略;ext1这类扩展标记对分块边界的判定就会与严格遵守规范的代理不同同样会制造前后端解析差异进而在特定条件下触发 HTTP 请求走私。根因与修复升级 llhttp 到 2.1.4这两个漏洞的根因都位于 Node.js 内置的llhttpHTTP 解析器Node.js 用其替换了早年自研的 http_parser是处理入站 HTTP 请求的核心 C 语言解析库。修复方式是在三条发布线中统一升级 llhttpv12.22.7deps: update llhttp to 2.1.4v14.18.1deps: update llhttp to 2.1.4官方安全公告中明确说明The fix for this is included in llhttp v2.1.4 and v6.0.6.即修复同时落在了 llhttp 的 v2.1.4旧发布线使用与 v6.0.6新发布线使用两个版本分支上确保 v12/v14 与 v16 都能获得修复。三、Commits 清单修复 回归测试的组合拳v12.22.7 发布说明共列出 3 个 commit结构非常清晰1 个依赖修复 2 个回归测试。Commit模块内容说明21a2e554e3depsupdate llhttp to 2.1.4实际的漏洞修复升级解析器依赖Fedor Indutnyd5d3a03246httpadd regression test for smuggling content length针对content-length 走私场景的回归测试Matteo Collina0858587f21httpadd regression test for chunked smuggling针对chunked 分块走私场景的回归测试Matteo Collina为什么必须配套回归测试安全修复如果不配回归测试很容易在后续的 llhttp 或 http 模块重构中复发。这里的两个测试分别覆盖了走私攻击的两种典型载体content length 走私利用Content-Length与Transfer-Encoding并存时的解析差异chunked 走私利用分块编码解析差异与 CVE-2021-22960 直接对应。这些测试被合并到 nodejs-private/node-private#286v12 发布线对应的私有安全仓库 PR修复内容在公开前先经安全评审再随安全发布同步公开——这正是 Node.js 安全发布的标准流程先在私有仓库合入修复发布时间点统一公开。四、如何验证与使用该版本下载矩阵与 SHASUMS 校验发布说明完整列出了 v12.22.7 的下载入口。需要说明原文中的链接均为 nodejs.org 官方分发地址这里以表格形式整理其命名规律便于你从 dist 目录中定位文件平台文件格式说明Windows 32-bitnode-v12.22.7-x86.msi/win-x86/node.exe安装包 / 免安装二进制Windows 64-bitnode-v12.22.7-x64.msi/win-x64/node.exe安装包 / 免安装二进制macOS 64-bitnode-v12.22.7.pkg安装包IntelmacOS Intel 64-bitnode-v12.22.7-darwin-x64.tar.gz二进制压缩包Linux 64-bitnode-v12.22.7-linux-x64.tar.xz二进制压缩包Linux PPC LE 64-bitnode-v12.22.7-linux-ppc64le.tar.xz二进制压缩包Linux s390x 64-bitnode-v12.22.7-linux-s390x.tar.xz二进制压缩包AIX 64-bitnode-v12.22.7-aix-ppc64.tar.gz二进制压缩包SmartOS 64-bitnode-v12.22.7-sunos-x64.tar.xz二进制压缩包ARMv7 32-bitnode-v12.22.7-linux-armv7l.tar.xz二进制压缩包ARMv8 64-bitnode-v12.22.7-linux-arm64.tar.xz二进制压缩包源码node-v12.22.7.tar.gz完整源码包其他文件node-v12.22.7/目录headers、win 7z/zip、node.lib 等文档docs/v12.22.7/api/对应版本的 API 文档注意v12.22.7 发布于 Apple Silicon 尚未被官方支持的时间点因此没有darwin-arm64产物同时 v12 时代也还没有 Windows ARM64 安装包。这些版本规则的差异可以从本仓库 downloadsTable.mjs 源码中直接印证——脚本用semver.satisfies(version, 16.0.0)过滤掉macOS Apple Silicon 64-bit Binary用semver.satisfies(version, 19.9.0)过滤掉 Windows ARM64 相关产物。用 SHASUMS 验证下载完整性发布说明末尾附带了PGP 签名的 SHASUMS256 校验文件结构如下-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 32a88bed33b22ac4c7c0a11a66857748f1d2ba8f409527d87d0045e5edb11ea9 node-v12.22.7-aix-ppc64.tar.gz 4fa5bdee2ac420f8043b800c4789929b09e4a5226dfd5fa7162e53939c594eae node-v12.22.7-darwin-x64.tar.gz ... -----END PGP SIGNATURE-----它同时提供了两层安全保障SHA256 哈希校验每个产物对应一个 64 位十六进制哈希下载后可用sha256sum比对。例如校验 Linux x64 二进制echo 2768bc01d2f97ab8135b8c03b275b9689573964b426b5dd9082334fd70dcc583 node-v12.22.7-linux-x64.tar.xz | sha256sum -c -输出node-v12.22.7-linux-x64.tar.xz: OK即代表文件与官方一致。PGP 数字签名整个校验文件被 PGP 签名包裹用于证明校验值本身来自 Node.js 发布团队发布说明中的签名指纹以FiEEdPEmArbxxOkTqN606iWE2Q7YgEFAmFlqAo开头防止攻击者同时篡改二进制与校验和。五、发布说明是怎么生成的仓库中的自动化流水线这类结构高度统一的发布说明并非手工编写而是由本仓库的自动化脚本生成。发布公告由 release-post/index.mjs 驱动核心流程是版本输入通过命令行node index.mjs [version]指定版本省略时从https://nodejs.org/dist/index.json自动取最新版本抓取 changelog从 nodejs/node 仓库的CHANGELOG_V{releaseLine}.md中按a idversion/a锚点正则切出对应版本的变更段落见fetchChangelog解析作者与版本策略从 changelog 段落头部如## 2016-03-08, Version 5.8.0 (Stable), Fishrock123用正则提取发布作者与 LTS/Stable 策略抓取 SHASUMS拉取https://nodejs.org/dist/v{version}/SHASUMS256.txt.asc作为校验段内容fetchShasums验证下载链接用 HEAD 请求逐个探测下载矩阵中的 URL 是否真实存在verifyDownloads/urlOrComingSoon失败则标记为*Coming soon*模板渲染将上述数据灌入 template.hbshandlebars 模板再经 prettier 格式化写入pages/en/blog/release/v{version}.md。这正是你在 v12.22.7.md 中看到的固定段落结构Notable changes → Commits → 下载列表 → SHASUMS的由来。其中下载列表的 URL 全部由 downloadsTable.mjs 中的templateUrl模板如https://nodejs.org/dist/v%version%/node-v%version%-x64.msi用版本号替换%version%生成再按 semver 规则按版本过滤平台产物——因此 v12.22.7 的下载列表天然不包含 macOS ARM64 与 Windows ARM64 项。六、从发布数据看 v12 线的生命周期定位v12.22.7 作为 LTS 线中的 patch 版本其状态判定在本仓库的发布数据生成器中有明确逻辑getNodeReleaseStatus会根据该发布线最新版本的lts.isLts标志与 EOL 日期将其归类为EOL/LTS/Current三态之一。v12 线在 2021 年 10 月时处于 LTS 维护期支持截止 2022 年 4 月因此安全修复会持续同步到该发布线这也是 2021 年 10 月安全发布覆盖 v12.x 的原因。类似的同源修复公告还包括 v12.22.6上一版主要修复 npm CLI / node-tar / arborist 的 7 个 CVE见 v12.22.6 发布说明可见 v12 线在维护期内持续接收关键安全修复。七、运维建议与升级路径对于仍在运行 Node.js v12 生产环境的团队针对本轮安全发布建议优先升级到 v12.22.7这是 v12 线修复 CVE-2021-22959 / CVE-2021-22960 的最低安全版本若因依赖兼容性暂时无法跨大版本也应先升到本版本长远规划迁移v12 线 EOL 后不再有安全修复建议规划迁移至仍在 LTS 支持期内的发布线升级后验证重点回归与 HTTP 解析相关的场景反向代理后的路由、chunked 上传、自定义头部处理确认 llhttp 2.1.4 的解析行为变更不影响业务校验产物下载后务必按上一节的 SHASUMS PGP 流程校验防范供应链投毒。结语Node.js v12.22.7 是一次典型的小而关键的安全发布单个依赖升级llhttp 2.1.4 两个回归测试闭环了两个可导致 HTTP 请求走私的中危漏洞。通过本仓库的官方公告、三线同步发布说明与自动化生成脚本可以完整还原这次安全响应的全过程——理解它也就理解了 Node.js 团队在漏洞报告 → 私有仓修复 → 回归测试 → 统一披露 → 签名校验这条安全链路上的工程实践。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考