
Node.js 18.9.1 安全修复版本深度解析六大 CVE 修复、llhttp 6.0.10 升级与 WebCrypto 弱随机性问题【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.orgNode.js 18.9.1 是 2022 年 9 月 23 日随 9 月安全发布窗口September Security Releases一同放出的 Current 版本一次性修复了 6 个已公开编号的 CVE其中包括 2 个高危问题--inspect模式下的 DNS rebinding 绕过影响 macOS与 WebCrypto 密钥生成弱随机性。本文基于 nodejs.org 官方仓库中归档的发布说明原文与配套的安全公告逐条拆解每个漏洞的成因、影响面与修复方式并顺带说明这类安全发布博客在 nodejs.org 网站仓库中的生成与管理机制帮助你完整掌握该版本的安全脉络、升级决策依据与产物校验方法。版本背景一次典型的安全补丁发布Node.js 18.9.1 发布于 2022-09-23版本代号为 Current非 LTS。该版本没有引入任何新特性全部内容围绕安全修复展开属于典型的安全补丁版本。其前身 v18.5.0 曾修复过 CVE-2022-32212 与 CVE-2022-32213但本次发布说明明确指出这两项修复不完整Insufficient fix on v18.5.0需要在本版本中彻底闭环。从仓库归档的同批次发布来看2022 年 9 月的安全发布窗口同时覆盖了三条版本线Node.js v14.20.1 (LTS)Node.js v16.17.1 (LTS)Node.js v18.9.1 (Current)三份发布说明互相引用同一份安全公告受影响范围覆盖当时全部活跃版本线14.x、16.x、18.x差异仅在具体漏洞的命中情况上。高危漏洞详解CVE-2022-32212macOS 上--inspect的 DNS rebinding 绕过High这是对 v18.5.0 已修复问题的补充修复。原修复覆盖了可路由 IP 地址routable IP的场景但 macOS 在访问http://0.0.0.0时存在特殊行为攻击者控制的 DNS 服务器可以把计算机名.local解析到任意 IP进而让受害者的浏览器在http://0.0.0.0上加载任意内容从而绕过 DNS rebinding 防护。影响面所有 18.x、16.x、14.x 版本。该问题由 Zeyu Zhangzeyu2001报告Rafael Gonzaga 修复。对应的修复提交为2c379d341dsrc: fix IPv4 non routable validation这也是发布说明 Commits 列表中唯一一个src层面的修复——它补全了之前针对可路由地址的校验逻辑把非可路由地址场景一并覆盖。CVE-2022-35255WebCrypto 密钥生成的弱随机性High这是本版本中第二个高危问题根因位于原生层。Node.js 在SecretKeyGenTraits::DoKeyGen()对应源码src/crypto/crypto_keygen.cc中调用EntropySource()获取随机熵时没有检查其返回值——它假设EntropySource()永远成功但实际上该调用可能且有时确实会失败。一旦失败生成的密钥将基于不可靠的随机源产生弱密钥。影响面所有 18.x 与 16.x 版本。该问题由 Ben Noordhuis 报告并修复对应提交0c2a5723becrypto: fix weak randomness in WebCrypto keygen。安全公告给出了明确的处置建议这一点对所有使用 WebCrypto 的开发者都至关重要重新生成并重新签发所有通过WebCrypto.subtle.generateKey()生成的密钥并重新评估使用这些密钥加密的数据的机密性。也就是说升级版本只是第一步修复后必须轮换密钥因为旧密钥的随机性可能已经被破坏。中危漏洞详解CVE-2022-32222macOS 启动时读取构建机 openssl.cnfMediumNode.js 18 及以上版本在启动时进程会尝试读取 macOS 上的/home/iojs/build/ws/out/Release/obj.target/deps/openssl/openssl.cnf——这是构建机build machine上遗留的路径普通用户机器上通常不存在。攻击场景是拥有共享 macOS 主机访问权限的攻击者可以故意创建用户名为iojs的账户在该路径放置恶意 openssl.cnf从而影响其他用户的 OpenSSL 配置。该问题由 Michael Dawson 报告并修复对应提交ffb6f4d51ddeps: MacOS - fix location of OpenSSL config file仅影响 18.x 版本线。三连 HTTP Request SmugglingCVE-2022-32213 / CVE-2022-32215 / CVE-2022-35256Medium这是本版本中数量最多的一类问题全部集中在http模块依赖的llhttpHTTP 解析器中且全部可导致 HTTP 请求走私HTTP Request SmugglingHRSCVE问题点说明CVE-2022-32213Transfer-Encoding 头解析缺陷的 obs-fold 绕过v18.5.0 的修复可被 obs-fold 机制绕过当 Node HTTP 模块作为代理时错误解析 transfer-encoding 头并以折叠形式把非法的Transfer-Encoding: chunked abc转发给下游服务器CVE-2022-32215多行 Transfer-Encoding 解析llhttp 未正确处理多行 Transfer-Encoding 头系 v16.16.0 / 18.7.0 上不完整修复的延续CVE-2022-35256未以 CRLF 结尾的头部字段解析llhttp 未正确处理未以 CLRF 结尾的头部字段三个问题的影响面均为所有 18.x、16.x、14.x 版本。报告者分别来自 Haxatron、JFrog CSO 团队的 Liav Gutman 与 VVX7修复由 Paolo Insogna 完成对应提交01bffcdd93http: disable chunked encoding when OBS fold is used。llhttp 升级到 6.0.10解析器层面的集中修复发布说明专门为 llhttp 列出了一小节。llhttp 是 Node.jshttp模块默认采用的 HTTP 解析器上述三个走私漏洞CVE-2022-32213、CVE-2022-32215、CVE-2022-35256的最终修复都落在 llhttp 6.0.10 中随本次 Node.js 版本一起内置修复 Transfer-Encoding 头解析校验缺陷CVE-2022-32213 的 obs-fold 绕过修复多行 Transfer-Encoding 头的处理CVE-2022-32215修复未以 CRLF 终止的头部字段处理CVE-2022-35256安全公告中明确标注llhttp v6.0.10 contains the fixes that were updated inside Node.js。理解这一点对排查问题很有价值——如果你的应用作为代理/网关使用 Node HTTP 模块处理不可信输入走私类攻击正是需要重点防范的对象升级后 llhttp 会以更严格的语义拒绝这些畸形请求。本次发布的完整提交清单发布说明的 Commits 部分共收录 4 个提交与 6 个 CVE 一一对应全部来自私有的 nodejs-private 安全仓库提交哈希模块修复内容对应 CVE0c2a5723becrypto修复 WebCrypto keygen 弱随机性CVE-2022-35255ffb6f4d51ddeps修复 macOS OpenSSL 配置文件位置CVE-2022-3222201bffcdd93http使用 obs-fold 时禁用 chunked encodingCVE-2022-322132c379d341dsrc修复 IPv4 非可路由地址校验CVE-2022-32212这种发布说明与安全公告互相引用、提交归并到私有仓库的流程是 Node.js 安全发布的标准做法漏洞细节先在公告中统一披露各版本线的发布说明再各自列出对应的修复提交保证信息可追溯。下载产物与完整性校验发布说明末尾附带了完整的平台产物清单覆盖 Windows32/64 位 Installer 与 Binary、macOSIntel 与 Apple Silicon 二进制、Linuxx64、PPC LE、s390x、ARMv7、ARMv8、AIX 以及源码包文件名遵循统一的node-v18.9.1-平台.扩展名模式全部托管在 Node.js 官方 dist 目录下。仓库中 downloadsTable.mjs 揭示了这些下载清单的生成逻辑每种产物的标题与 URL 模板被集中维护并依据语义化版本规则做条件裁剪——例如v18.9.1早于 19.9.0因此不会包含 Windows ARM 产物早于 16.0.0 则不含 macOS Apple Silicon 二进制。这些规则保证了每个历史版本的下载清单与当时的发布产物严格一致。SHASUMS 与 PGP 校验发布说明末尾的 SHASUMS 区块是一份 PGP 签名的 SHA-256 校验和清单SHASUMS256.txt.asc覆盖全部平台产物含.tar.gz、.tar.xz、.msi、.pkg、.zip、.7z及node.exe等。它的作用是让用户在下载后验证文件完整性下载对应平台的二进制产物获取同一目录下的SHASUMS256.txt.asc使用 Node.js 项目发布密钥验证 PGP 签名确认校验和清单本身未被篡改用shasum -a 256macOS/Linux或Get-FileHashWindows PowerShell比对目标文件的 SHA-256 值是否与清单一致。签名块中的iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbiq0389VXvQFAmMt2FIACgkQiq0389VXvS72g即标识了负责签名的发布密钥指纹凡涉及生产环境安装都建议执行这一校验流程。这些发布说明在 nodejs.org 仓库中如何产生本仓库不仅归档了发布说明还提供了生成它们的工具链。查看 scripts/release-post/index.mjs 可知运行node index.mjs [version]即可自动生成一篇发布博客从 Node.js 官方 changelog 抓取对应版本号节点的变更记录fetchChangelog通过正则a id${version}/a定位从 changelog 头部解析发布作者如## 2022-09-23, Version 18.9.1 (Current), RafaelGSS与版本策略Current/LTS从SHASUMS256.txt.asc拉取校验和通过 downloadsTable.mjs 生成下载清单并逐条 HEAD 探测可用性不可用则标记*Coming soon*最终由 template.hbs 模板渲染并写入apps/site/pages/en/blog/release/vX.md。也就是说v18.9.1.md 这类文件的 frontmattercategory: release、layout: blog-post、author等字段正是由模板定义的。在站点侧types/blog.ts 中定义的BlogPost类型将每篇文章归类为announcements | release | vulnerability三种类型之一BlogHeader 组件测试还验证了release与vulnerability分类会分别渲染出对应分类的 RSS feed 链接。由此可以看到一条完整链路发布流程生成 Markdown → frontmatter 驱动分类 → 页面与 feed 自动聚合这也是该仓库作为 Node.js 官网的内容运转方式。升级与处置建议综合安全公告与发布说明建议按以下步骤完成本次安全修复升级版本18.x 用户升级到 v18.9.116.x 用户升级到 v16.17.114.x 用户升级到 v14.20.1轮换 WebCrypto 密钥对任何使用WebCrypto.subtle.generateKey()生成的密钥执行重新生成与重新签发并重新评估相关加密数据的机密性针对 CVE-2022-35255关注代理/网关场景如果你的服务以 HTTP 代理形态接收不可信请求升级后应回归测试畸形 Transfer-Encoding 与头部字段场景确认 llhttp 6.0.10 的严格解析行为符合预期针对三连走私漏洞校验产物完整性安装前使用 SHASUMS256.txt.asc 完成 PGP 签名与 SHA-256 双重校验持续跟进注意公告中继续以低音量邮件列表订阅安全通告的机制建议以便第一时间获得后续安全发布窗口的通知。Node.js 18.9.1 作为一次纯粹的安全修复版本其价值不在于新功能而在于对 6 个 CVE 的完整闭环——尤其是对 v18.5.0 两次不完整修复的补全以及对 WebCrypto 随机源的根治。对于仍在维护历史版本线的团队理解每个 CVE 的触发面与修复提交是评估升级优先级和制定密钥轮换策略的基础。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考