 安全版本深度解析:Policy 机制绕过漏洞修复与 OpenSSL 1.1.1v 升级)
Node.js 16.20.2 (LTS) 安全版本深度解析Policy 机制绕过漏洞修复与 OpenSSL 1.1.1v 升级【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org本篇文章以 nodejs.org 官网仓库中收录的 v16.20.2 发布公告 为骨架系统梳理 Node.js 16.20.2LTS这一安全补丁版本修复的全部 CVE、对应的源码级修复提交、随版本捆绑升级的 OpenSSL 1.1.1v以及官方发布产物的校验方式。读完本文你将能完整理解该版本修了什么、为什么修、怎么验证并掌握官网仓库中发布公告的生成链路与数据呈现方式。一、版本概览一次聚焦安全修复的 LTS 补丁发布Node.js 16.20.2 于2023 年 8 月 9 日发布公告 frontmatter 中date: 2023-08-09T16:51:54.265Z版本代号为 LTS长期支持版公告作者为 Rafael Gonzaga。其文件头元数据如下date: 2023-08-09T16:51:54.265Z category: release title: Node.js 16.20.2 (LTS) layout: blog-post author: Rafael Gonzaga这次发布属于典型的安全补丁发布Security Release。根据仓库中同期的 august-2023-security-releases.md 可知该轮安全发布同时覆盖 16.x、18.x、20.x 三条活跃发布线其中20.x 受 3 个高危、2 个中危、2 个低危问题影响18.x 受 1 个高危、2 个中危问题影响16.x 受 1 个高危、2 个中危问题影响——这正是 v16.20.2 本次修复的 3 个 CVE。二、修复的 CVE 详解Node.js Policy 机制的三处绕过本版本修复的 3 个 CVE 全部集中在 Node.js 的实验性 Policy 机制Permissions Policy上。Policy 机制允许通过policy.json声明哪些模块可以被加载、哪些资源可以被访问是一种运行时的安全约束手段。下述漏洞均围绕攻击者能否绕过 policy.json 的限制、加载范围之外的模块或执行任意代码展开。2.1 CVE-2023-32002通过Module._load()绕过 Policy高危使用Module._load()可以绕过 Policy 机制加载policy.json定义范围之外的模块。该问题影响所有使用实验性 Policy 机制的活跃发布线16.x、18.x、20.x。漏洞由 mattaustin 报告由 Rafael Gonzaga 与 Bradley Farias 修复。2.2 CVE-2023-32006通过module.constructor.createRequire()冒充其他模块中危module.constructor.createRequire()可以绕过 Policy 机制使模块冒充其他模块的身份去加载policy.json定义范围之外的依赖。该问题同样影响 16.x、18.x、20.x 三条发布线由 Axel Chong 报告Rafael Gonzaga 与 Bradley Farias 修复。2.3 CVE-2023-32559通过process.binding绕过 Policy中危使用已废弃的process.binding()API 可以绕过 Policy 机制攻击者通过加载内部模块进而利用process.binding(spawn_sync)在policy.json限定的范围之外运行任意代码。该问题影响 16.x、18.x、20.x由 LeoDog896 报告Tobias Nießen 修复。2.4 对应的源码级修复提交从发布公告的 Commits 列表中可以看到 3 个 CVE 的修复分别落地在policy模块上policy: handle Module.constructor and main.extensions bypass——修复Module._load/module.constructor路径的绕过对应 CVE-2023-32002、CVE-2023-32006policy: disable process.binding() when enabled——在启用 Policy 时直接禁用process.binding()从入口处堵死 CVE-2023-32559 的利用链。其中disable process.binding() when enabled是一种典型的最小化攻击面修复思路既然process.binding()本身已属废弃 API 且是绕过 Policy 的通道那么在启用 Policy 时直接将其禁用比逐一修补其内部行为更彻底。需要说明的是这些 CVE 爆发时 Policy 机制仍处于**实验性experimental**状态官方在安全公告中对此有明确标注这也是为什么该机制后续逐步演进为独立的 Permission Model权限模型主要作用于 20.x 发布线。三、随版本捆绑升级的 OpenSSL1.1.1v除 Node.js 自身代码修复外本版本还捆绑了 OpenSSL 安全更新涉及 2023 年 7 月发布的三个安全通告7 月 14 日、7 月 19 日、7 月 31 日。对应到本次公告的 Commitsdeps依赖模块共有 3 个提交deps: update archs files for OpenSSL-1.1.1v——更新 OpenSSL 的平台架构archs配置文件deps: fix openssl crypto clean——修复 OpenSSL 加密相关构建的清理逻辑deps: upgrade openssl sources to OpenSSL_1_1_1v——将 OpenSSL 源码升级到1.1.1v版本。三个提交同属 PR #49043。Node.js 16.x 发布线使用 OpenSSL 1.1.1 系列因此以升级到该系列最新的 1.1.1v 补丁版来封堵上游安全通告中的问题。这也提醒升级者Node.js 的补丁版本往往同时携带自身安全修复与依赖OpenSSL 等的安全修复及时跟进 LTS 补丁版本是保持运行时安全性的必要手段。四、发布产物清单与下载资源v16.20.2 的发布公告列出了覆盖 Windows、macOS、Linux、AIX 等平台的完整二进制产物。结合仓库中 downloadsTable.mjs 的产物生成逻辑各平台产物可归纳如下%version%即16.20.2平台产物类型文件命名模式Windows32 位安装包node-v16.20.2-x86.msiWindows64 位安装包node-v16.20.2-x64.msiWindows32 位二进制win-x86/node.exeWindows64 位二进制win-x64/node.exemacOS64 位安装包node-v16.20.2.pkgmacOSApple Silicon 二进制node-v16.20.2-darwin-arm64.tar.gzmacOSIntel 二进制node-v16.20.2-darwin-x64.tar.gzLinux64 位二进制node-v16.20.2-linux-x64.tar.xzLinuxPPC LE 64 位node-v16.20.2-linux-ppc64le.tar.xzLinuxs390x 64 位node-v16.20.2-linux-s390x.tar.xzLinuxARMv7 32 位node-v16.20.2-linux-armv7l.tar.xzLinuxARMv8 64 位node-v16.20.2-linux-arm64.tar.xzAIX64 位node-v16.20.2-aix-ppc64.tar.gz源码源码包node-v16.20.2.tar.gz公告同时提供了dist/v16.20.2/目录其他发布文件与对应版本的 API 文档入口。从 downloadsTable.mjs 的实现可以看出平台产物与版本线之间的动态关系脚本通过semver.satisfies判断版本范围来决定产物集合例如版本低于 16.0.0 时不发布 macOS Apple Silicon 产物、低于 19.9.0 时不发布 Windows ARM 产物、高于等于 23.0.0 后取消 Windows 32 位产物。v16.20.2 符合 19.9.0条件因此产物清单中不包含Windows ARM 64 位安装包与二进制与公告实际列出的内容一致。五、SHASUMS 与完整性校验发布公告的末尾附带了完整的SHASUMS校验清单。该清单实际上来自官方发布的SHASUMS256.txt.asc文件使用 PGP 签名包裹保证校验值本身的可信性。公告原文中的完整内容如下-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 e3866679e6fbb13f5156c328bb77623b4d63493c8aaa448686a2bc53007005b8 node-v16.20.2-aix-ppc64.tar.gz 6a5c4108475871362d742b988566f3fe307f6a67ce14634eb3fbceb4f9eea88c node-v16.20.2-darwin-arm64.tar.gz fb87e01f0b2c8545afb8dd0769f7eb2439fb4fc8731efa956744fb0e0bc98105 node-v16.20.2-darwin-arm64.tar.xz d7a46eaf2b57ffddeda16ece0d887feb2e31a91ad33f8774da553da0249dc4a6 node-v16.20.2-darwin-x64.tar.gz 107ae8d56a9c0aa85c8952231ac44d5e6df7c1ea3e9a36e2ef022ae36c98ccec node-v16.20.2-darwin-x64.tar.xz d6feed11c7f02601de746da81138f2d74fafbedff0b3ea9076974ca81ca62894 node-v16.20.2-headers.tar.gz f46e93d3bb7981c7a19bbf3b7d377e0965d4a3fab3ba69cf77616e9da245b421 node-v16.20.2-headers.tar.xz b6945fcc9ad220386bb814bfae7137189fd17297f2959a744105e1bee006035a node-v16.20.2-linux-arm64.tar.gz e88d86154d1ce53dc52fd74d79d4bfdf0b05f58c0bb2639adfa36e9378b770c4 node-v16.20.2-linux-arm64.tar.xz 88ea2ddef7db491d2e93c150d27fbec422a4d06d7a63bf34d46e6d20d30eed43 node-v16.20.2-linux-armv7l.tar.gz 5f2a2a34d2f19931b8ef39416bde96933e6666f91a2d1a2b92af30627a8e8429 node-v16.20.2-linux-armv7l.tar.xz 731d9ecc82ff59449566bf73959b16cc368b1060212b51d03edf3ec5e9937ced node-v16.20.2-linux-ppc64le.tar.gz 17a85d996bd4810b45f66f121f923e707399def25c7a87c4be9eec661d368b59 node-v16.20.2-linux-ppc64le.tar.xz 49c7aa3e26a5569f5b399dfd6e86566fddefc9a62c40cc1d7a42daa7f4268b06 node-v16.20.2-linux-s390x.tar.gz dcccafa1559e2096b13ca0fb7c4df76512121b9f2414c7585c136d2b3c815a74 node-v16.20.2-linux-s390x.tar.xz c9193e6c414891694759febe846f4f023bf48410a6924a8b1520c46565859665 node-v16.20.2-linux-x64.tar.gz 874463523f26ed528634580247f403d200ba17a31adf2de98a7b124c6eb33d87 node-v16.20.2-linux-x64.tar.xz 697ee21f4693625cc9d060d25f2c29d12dffcb38d49e28dd446c6cb84eacfdf1 node-v16.20.2.pkg 33188eb11b977113adb65b2e09d71bddd63f12168ba73ceadae6c27938dc9e93 node-v16.20.2.tar.gz 576f1a03c455e491a8d132b587eb6b3b84651fc8974bb3638433dd44d22c8f49 node-v16.20.2.tar.xz ebb0c50b1e4943cfeb005e71f5b9c6733f0a9586df3138df199d855d6abac77c node-v16.20.2-win-x64.7z f8bb35f6c08dc7bf14ac753509c06ed1a7ebf5b390cd3fbdc8f8c1aedd020ec3 node-v16.20.2-win-x64.zip b0b2ef51565a01e34e4743ab5b26d76d34bb5403479c8b591f5ae434e0ab4adc node-v16.20.2-win-x86.7z c9c0b774328374973d5af5d72c4c6ce3932a1988c7efd32d84c35ba4771df41a node-v16.20.2-win-x86.zip 8f78f8cea29743f9bfd4544b9c01106929e62e5211f019dd1f0a4b02916683d2 node-v16.20.2-x64.msi 5cdabf8c2d117da96f5238930df6e06d18d30f2b21c1dd91f84fb1098422b74a node-v16.20.2-x86.msi 9f498591fd05b3aca332ce4ad966e77cd6e5c150751079ce8bad8ee499945b79 win-x64/node.exe e2c00776781232ec8d756a00d086da89f527775a02267f6f604a4320893463c7 win-x64/node.lib c61115bda7099df52d5fc44ad0cfb71c3e23813e4b4379adc72cdf5b467cdd72 win-x64/node_pdb.7z ac79e3a3bf490b0e32cdefa201abad0633a737c4f1741de4469631cd4335e177 win-x64/node_pdb.zip b6334209a452cc547fb9cadc28d26ef9e48f0015fcd8514724a6938aff3e0460 win-x86/node.exe 5890587b08eacbdab20239bf8ff350392794d9beb193096e941596b06ceeafbf win-x86/node.lib f3f0cdbbf416b3a1606f6670ecec16b33c763acd91ed1da841355a92bc554b15 win-x86/node_pdb.7z 7f6371282bea7b08863236cfea69c5f3ffaf6be6309e4872e5510d5fcd062693 win-x86/node_pdb.zip -----BEGIN PGP SIGNATURE----- iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbiq0389VXvQFAmTTwWoACgkQiq0389V XvT1iQwAl3P2WHhXJEERM0WAgcvKDM7DR9Q83dXpvhIWxDjOlvSrvumQ0t3PNXl qAgTUfJGy1qJ1TciSEEscD0ooyJ/nbheSgK60t7zsMrmzqvUQR3djOAydFTPwfh4 TIT2xxvaZ6mN9Wb2/UyxW80BqOxxaGMtqTTQrz95KuG02vtPVp4pnzbx/9UWj8gd k27igpG2EcfdsaS/gxX6rjUQb4Y4v0xY55oE9sDV9cFHg6n5nOmWjXDcRohcX/ 1sscjdd1/NJ4rVXsmc5jNIpX9eeRUBrBMZcIp77aAKMXPBEUK6N7oEOJM/6Sce3 cNstHPSBL1xlraB8PtlqBbphrviHP3zLN8Z2CUIqUIRn9PIXcgSWe6ft9X4JB1 EJS86K2A9oDAPnqtObNzjkUt0A8TYg1tuAXlIvHkrw5fby/srqauyNiBJpgcT/d FsSn7DKUOXYjapLf0qpYsMqxbhr7CsXjD71pFboXqJNHQDqlJZBGVyD4ppUwIqQL GK5kUbB0 Ju7G -----END PGP SIGNATURE-----校验建议分两步进行先用gpg验证 PGP 签名的有效性再用sha256sum -c按清单核对下载产物的哈希。例如在 Linux 上# 1. 校验下载的二进制哈希与公告清单一致 echo 874463523f26ed528634580247f403d200ba17a31adf2de98a7b124c6eb33d87 node-v16.20.2-linux-x64.tar.xz | sha256sum -c - # 2. 查看当前运行版本 node -v从清单可见v16.20.2 同时提供了.tar.gz、.tar.xz、.zip、.7z、.msi、.pkg以及node.exe/node.lib/node_pdb等多种格式覆盖源码包、预编译二进制与 Windows 调试符号供不同安装方式的用户选用。六、发布公告在官网仓库中的生成与呈现链路v16.20.2 的公告不是手写的零散笔记而是由仓库内置的发布工具链半自动化生成。理解这条链路有助于把公告内容与仓库源码对应起来。6.1 发布公告生成脚本release-post/index.mjs 是发布公告的生成器其执行流程fetchDocs → renderPost → formatPost → writeToFile为fetchChangelog从 Node.js 主仓库的 CHANGELOG 中按版本锚点a id16.20.2/a截取该版本的更新说明fetchAuthor从 changelog 头部解析author并获取作者信息fetchVersionPolicy用正则^## ?\d{4}-\d{2}-\d{2}, Version [^(].*\(([^)])\)提取版本策略如LTS、StablefetchShasums拉取官方SHASUMS256.txt.asc的 PGP 签名内容verifyDownloads基于 downloadsTable.mjs 生成各平台下载项并对每个 URL 发起HEAD请求验证产物已就绪未就绪则标记*Coming soon*最后用 template.hbsHandlebars 模板渲染整篇公告经 prettier 格式化后写入pages/en/blog/release/vX.md。也就是说### SHASUMS下方的整段 PGP 签名文本、下载清单、日期、作者、版本策略都是脚本自动拼装的结果——这也是所有版本公告格式高度统一的原因。6.2 博客数据的索引与分类生成后的公告文件会被 blog-data/generate.mjs 读取该脚本用gray-matter解析 frontmatter提取title、author、date、category等字段并为每篇文章生成[category, year-YYYY, all]三个分类。因此v16.20.2.md会被归类到release、year-2023和all三个维度下可在博客的 release 分类中检索到。前端呈现层中util/blog.ts 的mapBlogCategoryToPreviewType将release、vulnerability、announcements等分类映射为对应的预览类型而 releaseData.mjs 与 releaseVersions.mjs 则基于发布元数据生成各主版本的状态Current / LTS / EOL、版本号清单等数据供下载页等页面在构建期消费。七、升级建议与延伸阅读升级路径运行 16.x 发布线且启用了实验性 Policy 机制的用户应尽快升级到16.20.2以封堵三个 Policy 绕过漏洞18.x / 20.x 用户则应分别升级到同批发布的 18.17.1 与 20.5.1详见 august-2023-security-releases.md。验证版本升级后可通过node -v确认版本号。延伸阅读仓库内同目录下 release 分类收录了从 v0.10.x 至今的全部版本公告可与本公告对照阅读安全公告类内容集中在 vulnerability 分类下。总体而言Node.js 16.20.2 是一个小而关键的安全补丁版本修复面聚焦于实验性 Policy 机制的三个绕过路径同时完成 OpenSSL 1.1.1v 的捆绑升级。对于仍运行 16.x LTS 的生产环境而言这是必须及时跟进的一次更新。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考