Node.js v14.18.1 (LTS) 安全发布解读:HTTP Request Smuggling 双漏洞修复与校验和验证指南
Node.js v14.18.1 (LTS) 安全发布解读HTTP Request Smuggling 双漏洞修复与校验和验证指南【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org本篇技术文章基于 Node.js 官方网站发布记录 v14.18.1 发布说明 编写完整还原 2021 年 10 月 12 日 Node.js 14 系列安全补丁版的核心内容两个中等严重度的 HTTP Request SmugglingHTTP 请求走私漏洞的原理、修复提交、全平台下载方式与 PGP 校验和验证方法。读者读完本文后可以掌握该版本的安全修复全貌、理解漏洞触发条件并能在生产环境中安全地完成升级与下载文件完整性校验。发布概览一次与 12.x、16.x 同步的安全补丁v14.18.1是 Node.js 14 发布线release line的一个LTS长期支持版本由 Danielle Adams 于 2021 年 10 月 12 日发布文档归类为release类别站点前端使用blog-post布局渲染。值得注意的是这一天 Node.js 官方同时发布了三个版本形成一个安全补丁批次版本发布线状态发布说明文档v12.22.712.xLTS发布说明v14.18.114.xLTS发布说明v16.11.116.xCurrent发布说明配套的官方安全公告《October 12th 2021 Security Releases》位于仓库的 vulnerability 类别其中明确指出16.x、14.x、12.x 三个发布线的所有版本均受下述两个中等严重度漏洞影响因此三个版本在同一天统一修复。Notable changes两个 CVE 漏洞详解v14.18.1 的 Notable changes 部分记录了本次发布的唯一主题——两个由 HTTP 解析器llhttp引发的安全漏洞CVE-2021-22959Header 中空格引发的 HTTP Request SmugglingThe http parser accepts requests with a space (SP) right after the header name before the colon. This can lead to HTTP Request Smuggling (HRS).漏洞原理HTTP 解析器接受了header 名称与冒号之间紧跟一个空格SP的请求。按 HTTP 规范header 行格式为Name: value名称与冒号之间不应出现空格但存在缺陷的解析器会将Name : value也解析为合法 header。这会造成前置代理与后端 Node.js 对同一请求产生不同解析结果攻击者借此在代理与服务器之间走私额外请求实现请求拆分、缓存投毒或绕过安全控制即经典的 HTTP Request SmugglingHRS攻击。CVE-2021-22960解析请求体时忽略 Chunk Extensions 导致 HTTP Request SmugglingThe parser ignores chunk extensions when parsing the body of chunked requests. This leads to HTTP Request Smuggling (HRS) under certain conditions.漏洞原理在解析Transfer-Encoding: chunked的请求体时解析器忽略了 chunk extensionschunk 大小后附加的扩展字段形如5;extvalue中的;extvalue。当后端忽略扩展而前置代理以不同方式处理时双方对消息边界尤其是最终 chunk 与 trailer 部分的判定产生分歧在特定条件下同样可被利用进行请求走私。这两个漏洞均属于Medium中等严重级别由 Mattias Grenfeldt 与 Asta Olofsson 报告。修复代码包含在llhttp v2.1.412.x、14.x 使用与llhttp v6.0.616.x 使用中详细信息以 CVE 公告正式发布为准。Commits三个提交构成完整修复v14.18.1 的提交记录共有三笔涵盖升级解析器 双侧回归测试的完整安全修复闭环提交主题模块作者对应私有 PRupdate llhttp to 2.1.4depsFedor Indutnynodejs-private/node-private#285add regression test for smuggling content lengthhttpMatteo Collinanodejs-private/node-private#285add regression test for chunked smugglinghttpMatteo Collinanodejs-private/node-private#285修复链条解析升级依赖将 llhttpNode.js 默认的 HTTP 解析器从受影响版本升级到 2.1.4从解析器层面根除两个漏洞。由于涉及未公开漏洞修复先合入私有的 nodejs-private 仓库再随公开版本发布。Content-Length 走私回归测试针对header 空格导致 Content-Length 解析分歧场景编写回归测试防止该漏洞在未来重构中回归。Chunked 走私回归测试针对chunk extensions 被忽略场景编写回归测试锁死请求体解析边界行为。这三个提交恰好对应两个 CVE 的根因也解释了为什么发布说明同时列出依赖升级与测试补充两类变更——安全修复不止要改代码更要以回归测试固化行为。全平台下载v14.18.1 支持的产物清单v14.18.1 发布说明列出了该版本官方提供的全部二进制产物以下链接为 Node.js 官方分发渠道安装时以官方最新指引为准平台产物链接Windows32-bit Installerhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-x86.msiWindows64-bit Installerhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-x64.msiWindows32-bit Binaryhttps://nodejs.org/dist/v14.18.1/win-x86/node.exeWindows64-bit Binaryhttps://nodejs.org/dist/v14.18.1/win-x64/node.exemacOS64-bit Installerhttps://nodejs.org/dist/v14.18.1/node-v14.18.1.pkgmacOSIntel 64-bit Binaryhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-darwin-x64.tar.gzLinux64-bit Binaryhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-linux-x64.tar.xzLinuxPPC LE 64-bit Binaryhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-linux-ppc64le.tar.xzLinuxs390x 64-bit Binaryhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-linux-s390x.tar.xzAIX64-bit Binaryhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-aix-ppc64.tar.gzLinuxARMv7 32-bit Binaryhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-linux-armv7l.tar.xzLinuxARMv8 64-bit Binaryhttps://nodejs.org/dist/v14.18.1/node-v14.18.1-linux-arm64.tar.xz源码Source Codehttps://nodejs.org/dist/v14.18.1/node-v14.18.1.tar.gz全部文件Other release fileshttps://nodejs.org/dist/v14.18.1/文档Documentationhttps://nodejs.org/docs/v14.18.1/api/从源码看下载清单的生成规则这份下载清单并非手工维护的静态文本。仓库中的 downloadsTable.mjs 定义了 16 个候选下载项并在生成发布说明时按语义化版本semver区间动态过滤 16.0.0排除 macOS Apple Silicon 二进制因此 v14.18.1 的清单中没有darwin-arm64产物Apple Silicon 官方支持从 16.0.0 开始 19.9.0排除 Windows ARM 安装器与二进制 23.0.0排除 Windows 32 位产物、 24.0.0排除 ARMv7 产物保证新旧版本清单与当时实际发布产物一致。这也解释了为何同时期发布的 v16.11.1 比 v14.18.1 多了macOS Apple Silicon 64-bit Binary一项而 v12.22.7 保留了SmartOS 64-bit Binary该产物在后续版本中已停止提供——清单差异完全由版本号驱动自动化生成避免人工遗漏。发布说明的最终渲染由 template.hbs 完成它把 changelog、下载文件列表、校验和按固定结构拼装为 Markdown。而驱动整个流程的脚本 release-post/index.mjs 会依次完成解析命令行传入的版本号缺省时从https://nodejs.org/dist/index.json拉取最新版本从CHANGELOG_V14.md按a id14.18.1锚点切出本节 changelog并解析版本策略LTS/Stable与发布作者拉取官方SHASUMS256.txt.asc签名校验和文件逐个 HEAD 探测下载地址是否可用不可用则标记*Coming soon*渲染模板并写入pages/en/blog/release/v14.18.1.md即本文所依据的文档。SHASUMSPGP 签名校验与完整性验证v14.18.1 发布说明末尾附带了完整的PGP 签名校验和文件。该块以-----BEGIN PGP SIGNED MESSAGE-----开头、以-----END PGP SIGNATURE-----结尾是对 SHA-256 校验和列表的签名用于证明校验和本身未被篡改-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 01092d92ec076778b9291983fa6854befd19a11655f261a3b3ec1c675154ecfb node-v14.18.1-aix-ppc64.tar.gz 78731152378577decf681167f4c6be6c31134dfef07403c1cebfbd3289d3886f node-v14.18.1-darwin-x64.tar.gz 4ad95cb566313c4a1c84449701f153aeb105b785852ae6ed7576916405b723ab node-v14.18.1-darwin-x64.tar.xz 3352973a1a737b47f2b1822ab9fd5d401427c7ba3b538ecae9928924d06b60a5 node-v14.18.1-headers.tar.gz 02ef2a81ad18e111cbb4a8bd1bde91f066b020d2b8a3fd71f2d0e59c1329cca6 node-v14.18.1-headers.tar.xz 3fcd1c6c008c2dfddea60ede3c735696982fb038288e45c2d35ef6b2098c8220 node-v14.18.1-linux-arm64.tar.gz 15c2ba182bafcc006c01a0e6f736a6ff3df101dec4c45026add51025095ab60d node-v14.18.1-linux-arm64.tar.xz 6da18f92ce3320e07f710435843d45e97040a2a51667e92af40bb005ebf651d1 node-v14.18.1-linux-armv7l.tar.gz a3109ffe919af2974dbad16ab634c8a9f47f51369d7321992d975637e6556ce3 node-v14.18.1-linux-armv7l.tar.xz dbd177d5033dcf3168068a69afbd43e4b8b518a979cd4843b11aec631d840edb node-v14.18.1-linux-ppc64le.tar.gz a4eb863418ecc1179a90b397ab4f221eacdb58336b41d30c7c7a322b25659e32 node-v14.18.1-linux-ppc64le.tar.xz 7019e933833f09bc880cbba7a06c77135b1caff8d5f88d700d21883ecfb286fb node-v14.18.1-linux-s390x.tar.gz e01f11308371b4268341a1b25dfb4433ae2e2403940f5acbfeb820b128ca7e27 node-v14.18.1-linux-s390x.tar.xz 088498c67bab31871a1cab40dbc9b7b82c1abf53a2cf740e061bd6033a74839d node-v14.18.1-linux-x64.tar.gz ad1e3baa1aee8028b43206da3b2be9b8867cb598b4318bc88a0ae4518cc062a2 node-v14.18.1-linux-x64.tar.xz 9021f68782bcdd65705fc15bb9e178c3c584efbe15586604ce053e6f803d85c0 node-v14.18.1.pkg 89d22d34fd4ba3715252dcd2dd94d1699338436463b277163ed950040c7b621a node-v14.18.1.tar.gz 3fa1d71adddfab2f5e3e41874b4eddbdf92b65cade4a43922fb1e437afcf89ed node-v14.18.1.tar.xz 36f51353a4650ed8c842b33991fe2aaad29dd0f80aae7864d591a52430a64503 node-v14.18.1-win-x64.7z 86737cd4544c4f8cda2abd8e60709a87dbf46119062c5f1d4ec297f71a9e204b node-v14.18.1-win-x64.zip bcd5b62a214479ec2b047f17224d5cdde14978cbb68ff58a8c2d23aa10bce9bd node-v14.18.1-win-x86.7z ba12288e444c6c2bf7e4d605bdcc8c34cad9c5dffea3910b5ecb67ae34f9e0bf node-v14.18.1-win-x86.zip 10d8e278201c3b1509d989425bcc6d81e772d2d7703613e0cba764579601397c node-v14.18.1-x64.msi 41d230dae23966f7d6de50b39a8dfc52f93c15153ff0616637b786cc632931fe node-v14.18.1-x86.msi 6d519ba12fbaa38485d50007e084ae552c55219d9534a0b6fec4c33f989fb5c6 win-x64/node.exe 8dc2fec0ce78af200bce0f60a59cd4544d8798ba6f50d6326ab7b9cc4246721e win-x64/node.lib 80d76f552c53d60b349b06c2d86193e49997a63114b72f7904e7802dd33dda76 win-x64/node_pdb.7z aeec6012f23a717337f1d9e008a736389e0ec7e266832767758710e14a94b574 win-x64/node_pdb.zip 22554f36f3a5ac26d6990f08043ae303043487a97a250daa2c4a083af42d8b9b win-x86/node.exe a02fb6e31fcd3cbdebb8966581cba025c77f9ca86727c9f1c2b5c988b0a4c19c win-x86/node.lib 3058b6a2187b9beee5da2f78be1d30175e53da4101c43cc614eca4414b6d9a14 win-x86/node_pdb.7z 29ab2a2a959c87e8f2b877302b9de9d0d3460839235af334cef5af9fb8ae2978 win-x86/node_pdb.zip -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEdPEmArbxxOkTqN606iWE2Q7YgEFAmFlqEgACgkQ06iWE2Q7 YgGu6A/J0TW1ngTwCWZ2cxvIdBEjkbFIhKzCt3nEvh3cGect6t6aIGywMJllrN fNrUSvtedxDjePznVZRmfYtQsocbcygMYfQZIFmlEXdeHioIp6guqqWPuGYuBo toNVHxJjBEA/DNOVwLZdbWERjPcjpOVjksOHc5ZWkiFPxCBrb5MyFHn3WwTjSNx7 opMQDeo/DA59t6WroTP4cdXqP78hbZY72Xg7R6WHVL/hazVZ67LDHzinvj/XqAN YErz7lHvKXBAio9NhK0ddIfFGrzB3yqe229GFlVV63XWLljNmRvR2gnVyFkDpuP TbKuQOcDwUV7BliY/dqAzeqjbNAvoiA1KpQ6b0slPyoLn0Sdx2pjpG92bgU84Ed 89xlmwc/ZlQ8a0KvlOsjx6c4NioS1RZsZW7l3t09vNhMte76yl5xKjsjxMlZW/yH mpHaoteu5nTBXzTQ6Ykns1KbfUQdl8fxf20uePmeA90h9udoVCreep4GoaHeSgEB zj02mUQ4vO5Ki/A4Jpn7aqrtkcdoZjI46pw1PYxOvHZjFrmmSKD/deYj1CmeYnS f2rNBR0ThaJHCFYemMnsbBcFi2NDAqOiZuy3d58QBf0Pa3sQW07YOjJkeidOCqgV PSnQSv9cgTToYDIe84Gvyv28siZuRG43QyfVZdIacxiIrXDU6k EI1x -----END PGP SIGNATURE-----校验方法三行命令完成验证下载 v14.18.1 后建议按以下流程验证文件完整性示例以 Linux x64 二进制为准# 1. 先验证签名块本身将发布说明中的 PGP 签名内容保存为 SHASUMS256.txt.asc gpg --verify SHASUMS256.txt.asc # 2. 或直接比对官方 SHA-256 校验和与本地文件计算值 sha256sum node-v14.18.1-linux-x64.tar.xz # 输出应与发布说明中对应条目一致例如 # ad1e3baa1aee8028b43206da3b2be9b8867cb598b4318bc88a0ae4518cc062a2 node-v14.18.1-linux-x64.tar.xz只有当本地计算的哈希值与发布说明中对应文件名的哈希完全一致且 PGP 签名验证通过时才可认为下载文件完整且未被篡改。这套签名机制在 release-post/index.mjs 中通过拉取官方SHASUMS256.txt.asc自动嵌入发布说明保证文档中的校验和与官方发布同步。安全升级建议立即升级如果生产环境仍运行 14.x 系列的旧版本14.18.1 之前且存在不受信来源的 HTTP 请求进入 Node.js 服务建议尽快升级到 v14.18.1 或同批次发布的 v12.22.7 / v16.11.1以消除两个 HTTP 请求走私漏洞。关注 LTS 生命周期v14 为 LTS 发布线安全修复会持续合入该线的最新补丁版后续维护中应升级到 14.x 线内最新补丁版而不仅是停留在 v14.18.1。验证产物从官网下载后务必使用上文 SHASUMS 流程校验哈希与 PGP 签名尤其在企业内网分发场景下。理解漏洞面两个 CVE 均属于解析器与周边代理反代、网关对 HTTP 语义理解不一致导致的走私类漏洞修复只能补上 Node.js 一侧生产架构中还应确保前置代理与 Node.js 对 header 与 chunked 编码的解析规则保持一致。延伸阅读仓库内资源原始发布说明apps/site/pages/en/blog/release/v14.18.1.md同日官方安全公告apps/site/pages/en/blog/vulnerability/oct-2021-security-releases.md同批次其他版本v12.22.7、v16.11.1发布说明自动化生成脚本apps/site/scripts/release-post/index.mjs、模板文件、下载清单生成器站点下载页依赖的兼容性解析逻辑apps/site/util/download/index.tsx、归档下载工具【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →