ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Node.js 12.15.0(LTS)安全发布深度解析:严格 HTTP 解析与三个 CVE 的修复

Node.js 12.15.0(LTS)安全发布深度解析:严格 HTTP 解析与三个 CVE 的修复 Node.js 12.15.0LTS安全发布深度解析严格 HTTP 解析与三个 CVE 的修复【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org2020 年 2 月 6 日Node.js 项目发布 v12.15.0LTS这是一次面向全部支持版本线的安全发布一次性修复了三个 CVE含一个 Critical 级别的 HTTP 请求走私漏洞并同步收紧了 HTTP 头解析的严格程度。本文以 nodejs.org 仓库中收录的 v12.15.0 发布博客 为主体结合同仓库的 2020 年 2 月安全公告、发布博客生成脚本与下载数据生成逻辑逐条拆解漏洞成因、--insecure-http-parser/insecureHTTPParser的兼容性逃生门、提交清单以及 PGP 签名校验方法帮助读者理解 Node.js HTTP 解析层的安全加固思路。发布概览一次覆盖全部支持版本线的安全发布v12.15.0 是 Node.js 12.xLTS版本线的补丁发布发布于 2020-02-06发布说明的作者是 Bethany Nicolle Griggs。发布博客的 front matter 明确标注了category: release与layout: blog-post正文开篇即声明This is a security release.这是一次安全发布。同期发布的安全公告 february-2020-security-releases.md 给出了完整的上下文本次安全发布覆盖当时所有受支持的版本线——10.x、12.x 和 13.x 全部受影响对应发布三个修复版本Node.js v10.19.0LTSNode.js v12.15.0LTSNode.js v13.8.0Current公告还给出了发布节奏原计划在 2020 年 2 月 4 日周二或其后不久发布实际发布于 2 月 6 日。影响评估为1 个 Critical 级别 2 个 High 级别同时版本中还包含了非漏洞驱动的 HTTP 解析严格化改动。三个漏洞详解CVE-2019-15605 / 15606 / 15604CVE-2019-15605HTTP 请求走私CriticalAffected Node.js versions can be exploited to perform HTTP desync attacks and deliver malicious payloads to unsuspecting users.该漏洞的成因是畸形的Transfer-Encoding请求头攻击者可以构造带有恶意Transfer-Encoding头的 HTTP 请求造成前端代理与 Node.js 后端对请求边界request boundary的解析不一致从而触发HTTP desync去同步攻击向无辜用户投递恶意载荷。公告进一步指出这类载荷可能被用于劫持用户会话session hijacking、投毒 Cookie、实施点击劫持clickjacking具体危害取决于底层系统的架构。该漏洞由 eBay 软件工程师 Ethan Rubinson 报告。修复提交中对应有一项专门的回归测试test: using TE to smuggle reqs is not possible直接用使用 TE 头走私请求不可行作为测试意图验证畸形Transfer-Encoding头不再能构造走私请求。CVE-2019-15606HTTP 头值未裁剪尾部 OWSHighOptional whitespace should be trimmed from HTTP header values. Its presence may allow attackers to bypass security checks based on HTTP header values.HTTP 规范要求头值两端的可选空白Optional WhitespaceOWS应当被裁剪。若头值尾部残留空白不同组件对同一头值的判定可能不一致攻击者可以利用这种差异绕过基于 HTTP 头值的安全检查。该漏洞由 Google 的 Alyssa Wilk 报告。修复方式是在解析阶段对头值执行尾部 OWS 剥离http: strip trailing OWS from header values同时为性能基准补充了对可选请求头的支持benchmark: support optional headers with wrk。CVE-2019-15604畸形证书字符串触发 TLS 服务器断言HighConnecting to a NodeJS TLS server with a client certificate that has a type 19 string in its subjectAltName will crash the TLS server if it tries to read the peer certificate.攻击者只需向 Node.js TLS 服务器发起连接并携带一个在subjectAltName中包含type 19 字符串的客户端证书只要服务器尝试读取对端证书就会触发断言失败assertion导致进程崩溃属于可远程触发的拒绝服务风险。该漏洞由 Rogier Schouten 与 Melvin Groenhoff 报告。对应修复提交为crypto: fix assertion caused by unsupported ext修复由不支持的扩展导致的断言位于 crypto 模块。CVE严重级别模块风险类型报告者CVE-2019-15605CriticalHTTP请求走私 / desync 攻击Ethan RubinsoneBayCVE-2019-15606HighHTTP头值残留空白绕过安全检查Alyssa WilkGoogleCVE-2019-15604HighTLS / crypto畸形证书触发断言崩溃Rogier Schouten、Melvin Groenhoff核心变更HTTP 解析严格化与--insecure-http-parser逃生门除三个 CVE 外v12.15.0 还引入了一项非漏洞驱动的安全加固更严格的 HTTP 解析stricter HTTP parsing。安全公告中对其定性为 Strict HTTP header parsing (None)——即没有已知漏洞被修复但历史上宽松lax的 HTTP 解析一直是问题的重要来源因此主动收紧。Also, HTTP parsing is more strict to be more secure. Since this may cause problems in interoperability with some non-conformant HTTP implementations, it is possible to disable the strict checks with the --insecure-http-parser command line flag, or the insecureHTTPParser http option. Using the insecure HTTP parser should be avoided.发布说明给出了两个明确结论严格化可能破坏互操作性某些不合规non-conformant的 HTTP 实现会生成不符合规范的请求头严格解析会拒绝或改变这些请求的行为提供显式逃生门但不推荐使用可通过--insecure-http-parser命令行标志或 HTTP 层面的insecureHTTPParser选项关闭严格检查但官方明确建议避免使用。逃生门的使用方式--insecure-http-parser是一个 Node.js 命令行启动标志作用于进程级默认行为node --insecure-http-parser app.js而insecureHTTPParser是更精细的 HTTP 选项允许**按流per-stream或按服务器per-server**粒度进行配置——这正是本版本中一项 SEMVER-MINOR 级提交http: make --insecure-http-parser configurable per-stream or per-server带来的能力。典型用法是全局保持严格解析仅对确认存在互操作问题的特定服务器开启宽松模式const http require(node:http); // 仅对这一个 server 关闭严格解析其余保持严格模式 const server http.createServer({ insecureHTTPParser: true }, (req, res) { res.end(ok); }); server.listen(3000);配套的另一项 SEMVER-MINOR 提交http: opt-in insecure HTTP header parsing则说明了该选项的设计取向是opt-in——安全行为默认开启宽松解析必须显式选择而不是默认宽松再手动收紧。此外还有一条专门测试test: check that --insecure-http-parser works验证该开关在命令行下确实生效。依赖层的变化严格解析的实现落在解析器依赖的升级上本次涉及两个解析器llhttp 升级至 2.0.4llhttp 是 Node.js 12 中实际使用的 HTTP 解析器本次修复的走私与 OWS 裁剪问题主要在其解析逻辑中落地http-parser 升级至 v2.9.3另有一个 SEMVER-MINOR 的 v2.9.1 先行提交http-parser 是历史遗留的 C 解析器v2.9.x 的升级同样承载了解析严格化与漏洞修复。两个解析器同步升级保证了不同配置路径下行为的一致性。Commits 清单逐条解读v12.15.0 的提交清单共有 11 条涵盖了修复、测试与基准三个层面提交哈希模块内容性质209767c7a2benchmark支持 wrk 的可选请求头基准测试基建02c8905051crypto修复不支持的扩展导致的断言对应 CVE-2019-15604漏洞修复25d6011912deps更新 llhttp 至 2.0.4依赖升级8162f0e194deps升级 http-parser 至 v2.9.3依赖升级d41314ef99deps升级 http-parser 至 v2.9.1SEMVER-MINOR7fc565666chttp--insecure-http-parser支持按流/按服务器配置SEMVER-MINOR496736ff78httpopt-in 开启不安全的 HTTP 头解析SEMVER-MINOR76fd8910e9http从头值剥离尾部 OWS对应 CVE-2019-15606漏洞修复9cd155eb4atest验证使用 TE 头走私请求不可行对应 CVE-2019-15605回归测试ab1fcb89cbtest验证--insecure-http-parser生效回归测试注意其中三条(SEMVER-MINOR)标记本次是 12.x 的补丁patch版本正常情况下不应引入新特性但由于需要为insecureHTTPParser提供可配置能力这些改动被以 minor 语义并入 patch 版本是安全发布中以最小代价提供兼容性出口的典型处理方式。下载产物与 PGP 签名校验各平台安装包清单发布说明列出了 v12.15.0 的完整下载产物覆盖 Windows、macOS、Linux、AIX、SmartOS 与 ARM 平台平台产物Windows 32-bit安装包node-v12.15.0-x86.msi、二进制win-x86/node.exeWindows 64-bit安装包node-v12.15.0-x64.msi、二进制win-x64/node.exemacOS 64-bit安装包node-v12.15.0.pkg、二进制node-v12.15.0-darwin-x64.tar.gzLinux 64-bitnode-v12.15.0-linux-x64.tar.xzLinux PPC LE 64-bitnode-v12.15.0-linux-ppc64le.tar.xzLinux s390x 64-bitnode-v12.15.0-linux-s390x.tar.xzAIX 64-bitnode-v12.15.0-aix-ppc64.tar.gzSmartOS 64-bitnode-v12.15.0-sunos-x64.tar.xzARMv7 32-bitnode-v12.15.0-linux-armv7l.tar.xzARMv8 64-bitnode-v12.15.0-linux-arm64.tar.xz源码node-v12.15.0.tar.gz这份清单与仓库中 downloadsTable.mjs 所体现的按版本裁剪逻辑是自洽的例如 macOS Apple Silicon 二进制仅对 16.0.0的版本生成、Windows ARM 产物仅对 19.9.0生成因此 v12.15.0 的清单中自然不包含这两类新平台产物。需要说明的是该脚本反映的是当前仓库的生成逻辑与 2020 年发布时的清单在细节上存在演进差异例如当前脚本已不含 SmartOS但从源码结构可以确认发布博客中的下载清单由模板按版本号批量渲染而非手工维护。PGP 签名的 SHASUMS发布说明尾部附带了完整的SHASUMS256.txt.asc内容——即被 PGP 签名的 SHA-256 校验清单。这一机制的意义在于官方只信任签名验证通过的校验值下载二进制后应与清单中的哈希逐一比对。SHASUMS 文件开头为 PGP 签名声明结尾为签名块中间是每个产物的 SHA-256 哈希-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 4674d94402b8c0d79a9e20d4320652830032f0a7171cea2c815858b76d3d2ee9 node-v12.15.0-aix-ppc64.tar.gz b6449cec39ac15b37abe4e59ef0eae50dcdfbf060c5276a01cc590f2a3372b7d node-v12.15.0-darwin-x64.tar.gz fc2b68255c61663fe74338d372678fbb1fec367fef46924498e6d1b5e220c0b1 node-v12.15.0-darwin-x64.tar.xz 48e8ba40339e6cb9edc820f320b690b3401643e2c6bd36a7f2267ebf84cf98f2 node-v12.15.0-headers.tar.gz 44217fee8c0d003888783f65c36eec871d36b93d7347333b659633e30cbd85db node-v12.15.0-headers.tar.xz 9349bb00a522da9ecd0d2f9453b500904ccd56e271852ab2defb51a8c77a1aca node-v12.15.0-linux-arm64.tar.gz c582cb65a0ec7f648618d3d33b4f87c374a3f930518b57eca1693828c965d6e5 node-v12.15.0-linux-arm64.tar.xz 53c4b21b23b8dc31da0ab9b5bdae7041d87fd7b7247e0b6cecaca36ca1d7e05d node-v12.15.0-linux-armv7l.tar.gz a865e69914c568fcb28be7a1bf970236725a06a8fc66530799300181d2584a49 node-v12.15.0-linux-armv7l.tar.xz 91c4d019e2c86d088fcb0874f3dab6a074c354d4fe0fcce1fa2f535c86396f5e node-v12.15.0-linux-ppc64le.tar.gz 9b0c4faf637e9cd272964052933e7ff2ca05c50d89a473cf6f40031f55783fd0 node-v12.15.0-linux-ppc64le.tar.xz 3594746ef6a98d21e56b4f1c7a60526c53fd97750c9ba2347ffc3df24ea3b21a node-v12.15.0-linux-s390x.tar.gz 30f150720cc1a9f53d4d9a881961431428603dfe151cd487cdaec555f29db0c7 node-v12.15.0-linux-s390x.tar.xz 218279a33603b8bc958c46cce04c14851fd9d685bd21f5a39d6b98d08d80aae5 node-v12.15.0-linux-x64.tar.gz 63df953deb091c1500e1044bef01d1953117970e757e74e90d915e1a4a0d1c9c node-v12.15.0-linux-x64.tar.xz f3c3103bcceb33898a8bc44c54d337c5bcb709dcdca95408e9307b6d4a86ca31 node-v12.15.0.pkg 4783ba63bcdfb8fa54cd4526401051df32835dc112cf7c11d64d98451ece20a6 node-v12.15.0-sunos-x64.tar.gz b14aab80ccdf268f6347b17bd449217139fe46df3cceac00960e59ef835cec8b node-v12.15.0-sunos-x64.tar.xz fb357de9262f60425ea3970dd09afd63312006a7b8355a808d358694e867f4fd node-v12.15.0.tar.gz d2fb4fa80ccf321570552b0a6e6b5f2aedeb281a8450207b057cf54c54d5a81b node-v12.15.0.tar.xz 5b7d4beb9fc4c16b08b06de394b738caeec94f3d22d38f78ca02f386b9897f83 node-v12.15.0-win-x64.7z 48b29cab597962f12b0aac081522e6192bc8642c582cd0fc1bf51557273888da node-v12.15.0-win-x64.zip a033ff4501155b3f0d63f08a40bf02d3bebd98485895ffd0cb638c6071eb6f6c node-v12.15.0-win-x86.7z e76057fda953d964e9f53c1a210ca4daf7104072574744616eb079e053a0d3d9 node-v12.15.0-win-x86.zip 615fe16ec99ebb7de92cb0e1c343979f7ac9d943373e61cff17cd6a9f76547e8 node-v12.15.0-x64.msi f558f19deea306c6caf167a687fe1ee65c4b191b1d327188c7f0d9fa7966d818 node-v12.15.0-x86.msi 51d09b8ce41fa3e6b7206141609e52e92f435b99e44932592cd529a9463bbf17 win-x64/node.exe bd0c3ac36b1e484ddbc3de5e04abe399c1221057fabf16e74155b44af012504d win-x64/node.lib 9a644dfb80d9d6a4e01e83993b8c5de219130a39e5324ea78696d0ca7303c3bb win-x64/node_pdb.7z 7f7e3cff51f3d475e9f5427a74968cb83b2ef9625bcea006a9ac8ea1bc4fdf96 win-x64/node_pdb.zip 839ef38f0ed23a9dcca4f0a807e205f95e26370f35ec9ea9915721c06eda04f2 win-x86/node.exe 95fd2202f2ba9695cf4db59e932f50d3c96052e1d171797dfa955e348d96df1f win-x86/node.lib d3659e3381a6c6fa7eec2ee0b340bc6049e47f23c055ef0d724d25bacabe4fdc win-x86/node_pdb.7z cf15fcc38600ef4dc89c9a6e9eeb58a44ca35f9a59d9823dd0f839a8d6ee95d4 win-x86/node_pdb.zip -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEETtd49TnjY0x3nIfG1wYoSKGrAFwFAl47g5kACgkQ1wYoSKGr AFxTTAfKUOw9HAEJkEe6VF3S3bnadaT0ItS42lyOIqaRgeIVh15HR3vi4KBc3 3ifsE7b8blLBFiyX/TQWl4prlK/fRvPmw9Q6VMpiu/qqdiwGFncAjhGiJBEJBGFs 9jdQJbHnL0n7UTNQcBPljWEk9JHvyExRFnWFY52VEV6R2jO1FtWoMEwj1HEA73Y ICiwVss0gduFiYVrBghLtC7BaI/gtf3Z5XTon07cBcXXQqnZJCSLDitXGdk7Iwk kHmTrLligB0iWnNffQtAkfvjqXJith9Ya2hPQhZJsdz16UL3K5q59s6jeOdrgv9 L1vXMNIioydW/l9BcN4FjTrhm35CSg oRsp -----END PGP SIGNATURE-----当前仓库的 下载页 中同样保留了验证已签名 SHASUMSverify signed SHASUMS的指引校验流程对每个发布版本一致先验证 PGP 签名归属可信再核对本地下载文件与清单哈希一致两者缺一不可。仓库侧支撑这份发布博客是如何生成与呈现的nodejs.org 仓库不仅存储这篇发布博客还完整保留了生成它的工具链可以作为理解发布内容组织方式的证据发布博客生成脚本scripts/release-post/index.mjs 是发布博客的自动生成器使用方式为node index.mjs [version]省略版本参数时会从 dist 索引自动选取最新版本。其工作流包括抓取 changelog从上游 Node.js 仓库的CHANGELOG_V主版本.md中按v12.15.0锚点切出对应发布章节并将*列表统一转换为-解析发布策略与作者通过正则从章节标题如## 2020-02-06, Version 12.15.0 Erbium (LTS), BethGriggs提取版本策略LTS与作者账号抓取 SHASUMS拉取SHASUMS256.txt.asc全文失败时占位为[INSERT SHASUMS HERE]验证下载链接对每个二进制产物执行 HEAD 请求不可用则标记Coming soon渲染与落盘通过 template.hbs 的 Handlebars 模板拼装 front matter、changelog、下载清单与 SHASUMS再经 Prettier 格式化后写入pages/en/blog/release/v{version}.md。也就是说本文所读的 v12.15.0.md 的结构——front matter Notable changes Commits 下载清单 SHASUMS——正是这套模板的输出产物其中的Notable changes段落由发布者手工补充其余部分均为自动化生成。下载清单的版本裁剪downloadsTable.mjs 依据 semver 范围对产物进行裁剪 16.0.0不生成 macOS Apple Silicon 产物、 19.9.0不生成 Windows ARM 产物、 23.0.0不再提供 32 位产物、 24.0.0不再提供 ARMv7 产物。这与 v12.15.0 清单中没有 Apple Silicon / Windows ARM的事实互相印证。下载页的渲染与版本数据在 下载页 中通过Release.BlogPostLink组件链接到[博客](https://link.gitcode.com/i/9c19d8da429188b4fd7c537f386b2237)其 href 即[ReleaseContext](https://link.gitcode.com/i/49f9c338056d0aceaf7b334f47c175ee)中当前版本的/blog/release/v{version}。而版本数据的 LTS / Current / EOL 状态判定位于 releaseData.mjsgetNodeReleaseStatus先判断是否已到 EOL 日期再依据最新版本是否处于 LTS 线判定状态——v12.15.0 发布时属于 12.x LTS 线因此状态为 LTS。升级建议与注意事项综合发布博客与安全公告给出以下实践要点影响范围所有支持版本线10.x、12.x、13.x均受影响凡运行在这些版本线的生产环境都应尽快升级到对应修复版本v10.19.0、v12.15.0、v13.8.0优先保持严格解析除非确认存在与非合规 HTTP 实现的互操作问题否则不应使用--insecure-http-parser或insecureHTTPParser如需使用应限制在最小范围如单个 server 实例而不是全局放开验证产物完整性下载后务必执行 PGP 签名验证与 SHA-256 哈希比对发布说明末尾的完整校验清单可作对照关注解析器行为变化llhttp / http-parser 的严格化可能导致此前被宽容接受的畸形请求头被拒绝升级后应观察业务流量中的 4xx 变化排查是否有客户端生成了不合规的头。从架构视角看v12.15.0 是一次典型的漏洞修复 主动加固组合发布三个 CVE 覆盖了请求走私、头值校验绕过与 TLS 崩溃三类高风险面而 HTTP 解析严格化则针对宽松解析历史上反复成为问题来源这一根因做了长期防御并通过显式 opt-in 的逃生门平衡了安全性与互操作性——这套默认严格、按需放开、禁止全局关闭的思路至今仍是 HTTP 解析层安全设计的参照范式。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表