Node.js 24.4.1 (Current) 安全发布深度解析:修复 V8 RapidHash HashDoS 与 Windows 路径遍历绕过
【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org
本文围绕 nodejs.org 仓库收录的 Node.js 24.4.1 (Current) 官方安全发布公告展开,逐项拆解该版本修复的两个安全漏洞(CVE-2025-27209 与 CVE-2025-27210)的成因与修复方式,完整给出各平台二进制下载地址与基于 SHASUMS256.txt.asc 的 PGP 校验方法,并结合仓库源码说明官网发布博客的自动化生成机制与版本状态判定逻辑。读完本文,你将掌握如何正确理解 Node.js 安全补丁公告、如何校验下载产物完整性,以及发布数据在 nodejs.org 中的流转链路。
发布概览:一次针对 Current 线的安全补丁
本公告对应的文档位于 apps/site/pages/en/blog/release/v24.4.1.md,其 Frontmatter 记录了发布元数据:
- 发布日期:2025-07-15
- 版本号:24.4.1,属于 24.x 主版本线
- 版本策略:Current(非 LTS、未 EOL 的活跃版本)
- 发布人:Rafael Gonzaga(@RafaelGSS)
- 发布类型:安全发布(This is a security release),即专门为修复安全漏洞而发布的补丁版本
在 nodejs.org 网站中,“Current / LTS / EOL”三种版本状态并非手工标记,而是由 apps/site/next-data/generators/releaseData.mjs 在构建期动态计算:若该主版本已到达 EOL 日期则判定为EOL;否则若最新版本处于 LTS 阶段则判定为LTS;两者皆不满足时即为Current。v24.4.1 发布于 2025 年 7 月,此时 24.x 线尚未进入 LTS 阶段,因此状态为 Current。这一判定逻辑同样驱动着官网下载页、EOL 表格等组件的展示(statusOrder为["Current", "LTS", "EOL"],见 apps/site/util/download/constants.json)。
Notable Changes:本版本修复的两个安全漏洞
CVE-2025-27209:V8 新 RapidHash 算法的 HashDoS
RapidHash 是 V8 引擎引入的新哈希算法,用于提升哈希表操作的性能。然而在新算法落地过程中引入了可被利用的缺陷:攻击者可以构造大量产生相同哈希桶碰撞的键,使哈希表在插入/查找时退化为线性复杂度,从而造成 CPU 资源被恶意消耗,形成拒绝服务(Hash DoS)。
修复方式是直接回退(revert)V8 中的 rapidhash 相关提交,恢复到此前的安全实现。该修复位于deps(依赖)层,由 Michaël Zasso 完成,对应提交哈希为c33223f1a5。这类“性能优化引入安全回归、再回退”的案例,也再次印证了安全发布中“稳定性优先于性能”的取舍原则。
CVE-2025-27210:Windows 保留设备名绕过 path.normalize() 路径遍历防护
Windows 系统保留了一批特殊的设备名(Device Names),如CON、PRN、AUX、NUL、COM1–COM9、LPT1–LPT9等。Node.js 的path.normalize()原本承担路径规范化与遍历防护的职责,但此前版本未能完整覆盖所有这些保留名,攻击者可以利用CON、PRN、AUX等名称绕过路径遍历保护,将输出重定向到设备文件或引发非预期行为。
修复方式是让lib(标准库)层完整处理所有 Windows 保留驱动名(reserved driver names),由 RafaelGSS 本人提交,对应提交哈希为56f9db2aaa。该问题同时提醒开发者:涉及 Windows 路径处理时,单纯依赖规范化函数并不足够,还须考虑平台特有的保留名与命名空间(如\\?\前缀)语义。
修复提交一览
| 提交哈希 | 修复目标 | 涉及模块 | 提交者 |
|---|---|---|---|
c33223f1a5 | CVE-2025-27209 | deps(V8:回退 rapidhash 提交) | Michaël Zasso |
56f9db2aaa | CVE-2025-27210 | lib(处理全部 Windows 保留驱动名) | RafaelGSS |
升级与下载:各平台官方产物
安全发布的核心动作是立即升级到补丁版本。以下是 v24.4.1 官方提供的全部下载产物(与公告原文一致):
| 平台 | 产物 | 下载地址 |
|---|---|---|
| Windows 64-bit | Installer (.msi) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-x64.msi |
| Windows ARM 64-bit | Installer (.msi) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-arm64.msi |
| Windows 64-bit | Binary (node.exe) | https://nodejs.org/dist/v24.4.1/win-x64/node.exe |
| Windows ARM 64-bit | Binary (node.exe) | https://nodejs.org/dist/v24.4.1/win-arm64/node.exe |
| macOS 64-bit | Installer (.pkg) | https://nodejs.org/dist/v24.4.1/node-v24.4.1.pkg |
| macOS Apple Silicon 64-bit | Binary (.tar.gz) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-darwin-arm64.tar.gz |
| macOS Intel 64-bit | Binary (.tar.gz) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-darwin-x64.tar.gz |
| Linux 64-bit | Binary (.tar.xz) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-linux-x64.tar.xz |
| Linux PPC LE 64-bit | Binary (.tar.xz) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-linux-ppc64le.tar.xz |
| Linux s390x 64-bit | Binary (.tar.xz) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-linux-s390x.tar.xz |
| AIX 64-bit | Binary (.tar.gz) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-aix-ppc64.tar.gz |
| ARMv8 64-bit | Binary (.tar.xz) | https://nodejs.org/dist/v24.4.1/node-v24.4.1-linux-arm64.tar.xz |
| Source Code | 源码包 (.tar.gz) | https://nodejs.org/dist/v24.4.1/node-v24.4.1.tar.gz |
| 其他发布文件 | 目录索引 | https://nodejs.org/dist/v24.4.1/ |
| API 文档 | 在线文档 | https://nodejs.org/docs/v24.4.1/api/ |
为什么这份清单长这样:下载清单的版本过滤逻辑
这些链接并非随手罗列,而是由仓库脚本按版本号规则化生成的。在 apps/site/scripts/release-post/downloadsTable.mjs 中,定义了 16 类候选产物模板(通过%version%占位符替换),再根据 semver 规则做裁剪:
- 版本
< 16.0.0:移除 macOS Apple Silicon 二进制; - 版本
< 19.9.0:移除 Windows ARM 64-bit 安装器与二进制; - 版本
>= 23.0.0:移除 Windows 32-bit 安装器与二进制(v24.4.1 命中此规则,因此清单中没有 x86 的 Windows 产物); - 版本
>= 24.0.0:移除 ARMv7 32-bit 二进制(v24.4.1 命中此规则,因此 Linux 只有 ARMv8/arm64 产物)。
这正是 v24.4.1 清单中没有 “Windows 32-bit” 与 “Linux ARMv7” 项的原因。该版本兼容性矩阵同样体现在 apps/site/util/download/constants.json 中:例如 Windows 平台x86的 semver 约束为< 23.0.0、ARM64为>= 19.9.0,LinuxARMv7为>= 4.0.0且< 24.0.0。网站下载页会根据这套规则自动禁用不兼容选项(parseCompat逻辑见 apps/site/util/download/index.tsx)。
下载 URL 的生成规则
如果你希望在自己的脚本或工具中构造下载链接,可以参照 apps/site/util/url.ts 中getNodeDownloadUrl的实现,其核心规则为:
source类型:${DIST_URL}${version}/node-${version}.tar.gz;shasum类型:${DIST_URL}${version}/SHASUMS256.txt.asc;- macOS 安装器:
node-${version}.pkg,二进制:node-${version}-darwin-${platform}.tar.gz; - Windows 安装器:
node-${version}-${platform}.msi(ARM64 为arm64),二进制:node-${version}-win-${platform}.zip; - Linux:
node-${version}-linux-${platform}.tar.xz; - AIX:
node-${version}-aix-ppc64.tar.gz。
其中DIST_URL即https://nodejs.org/dist。当操作系统为 “LOADING”(用户代理尚未识别)时,默认回退到源码包链接,保证下载按钮始终可用。
完整性校验:SHASUMS256.txt.asc 与 PGP 签名
安全补丁的下载必须校验完整性,防止传输损坏或中间人篡改。公告尾部附带了官方签发的SHASUMS256.txt.asc内容,包含两类信息:SHA-256 校验和列表与PGP 签名。
SHA-256 校验和(v24.4.1 全量)
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 d2b3496c3795515844bd8d2d45404d0e8ddbc714855ce68e895a644a6059feb3 node-v24.4.1-aix-ppc64.tar.gz 7a3cdd9f5d8f0cb4dce7b21f509b5379bb51fd18e5dfa6a9662cafcd8ae63c60 node-v24.4.1-arm64.msi 55a772a600b7bdafb4b35945b3935090e27aff9934b4c11b281220fcd99139d7 node-v24.4.1-darwin-arm64.tar.gz 7ea25548b120ebaeaffadd37878b83c3d917cbb1eb3e9dbab7cb861bd8763a56 node-v24.4.1-darwin-arm64.tar.xz 59fbad953a0705e78d220079fb6d10d341d0a61afd3aeb4db2a87207fddd8944 node-v24.4.1-darwin-x64.tar.gz e391194c578cf91e2af35acb30dc6c23fe8893fb3409a2c9a4e25b51f87a6cb0 node-v24.4.1-darwin-x64.tar.xz f2071f773135460a56c6cdc368a58e98f5f3d14e3a0bf1010a4323d294482740 node-v24.4.1-headers.tar.gz 5cc534bca66b184c837923ce5d9cc25ae7f3b3f6d8455ded509da0db041c16d7 node-v24.4.1-headers.tar.xz fde5421e2652e51199bc678e1e6c4d80bbb4c55337ec0a82206568517e9792ef node-v24.4.1-linux-arm64.tar.gz 555659c36fc72d0617e278b5d26ffcaebc3760a3de354926b1e5f1b0bfd66083 node-v24.4.1-linux-arm64.tar.xz b4ee745e4d8a2c3f3a793a50695d769322b81c79f2b7b79c2a359bca892a0f36 node-v24.4.1-linux-ppc64le.tar.gz 2d549d5c63d282012192bf8594ea105b9876e9198d3af8401c61efe15c3d8cb1 node-v24.4.1-linux-ppc64le.tar.xz 8c9a680c3ae7c8b4a02f55faa055d960ab639a67b257efe7a466d49934746630 node-v24.4.1-linux-s390x.tar.gz 70316824c88fa396b12363fb9695b8f9a88f671377056bd86761dc96962240f8 node-v24.4.1-linux-s390x.tar.xz 063f2eb299ba60e3fc9b424d8e87d0e2f6be84b39bdeadc421ee2865914c498b node-v24.4.1-linux-x64.tar.gz 7e067b13cd0dc7ee8b239f4ebe1ae54f3bba3a6e904553fcb5f581530eb8306d node-v24.4.1-linux-x64.tar.xz a9e19728d981b03fd0ef075d6df0dc28c9d543f4b2ea6cad5cb1e3dff5c01e11 node-v24.4.1-win-arm64.7z 8cb993d89d13119f582c77a4c734be5bdfeee5557e6cfe850ea1a2f23fa94686 node-v24.4.1-win-arm64.zip daa849d978dfd6ae623e2c70cab5602b385e2c1e6bb3b5012de6609be78ddcdc node-v24.4.1-win-x64.7z 0428a6ca7544df310de4ed12c10e84c0bc7c9022945dc16de22f7c0dc4893dd2 node-v24.4.1-win-x64.zip 521032573be257d214589043d4aa57d1e32a0a4ff8e30c3275e6617de4c55ee4 node-v24.4.1-x64.msi 3473b9ebee25cc0681f543b93586988a2379836bf2be5a47c159a5920289e032 node-v24.4.1.pkg f5d4525390f67bd2ba91efe2ad94722f570a9a4fd18756ab420cb5885d0f6c10 node-v24.4.1.tar.gz adb79ca0987486ed66136213da19ff17ef6724dcb340c320e010c9442101652f node-v24.4.1.tar.xz da416aa539b6b84d20c58b2bbd1fc5fc74b2d95dad213ef49110f697cbb2bb33 win-arm64/node.exe 6809fc156673d10cca7dff0e54f28309bb111d235c54493a4a0ca401c2113be7 win-arm64/node.lib de892d4574417946a45e95720cb3a802eaa51209219ddd8a4fd36f8e6de6b7ef win-arm64/node_pdb.7z 62a4b97ca6aaa558fc2d7dba98a16faac64ec60776d5b4a519d515e2a7340c53 win-arm64/node_pdb.zip 1b41336fc188453644a3986ddc508627e2c7288df74e7c86abfc46106bc603e3 win-x64/node.exe 34882ca2bb450431047f2dd3bae1c3b8c1cd2b4cffd5c1a0bf079948846d2b83 win-x64/node.lib 759fbb25d32aaed69069b48b32844a161264d01aec457a91c3ca735b95131d2d win-x64/node_pdb.7z 57e04e1121f8e5b29739697e54ab07f51f70dab0376c94f9a9f159b412d32ba0 win-x64/node_pdb.zip -----BEGIN PGP SIGNATURE-----如何验证
- 下载校验和文件:
https://nodejs.org/dist/v24.4.1/SHASUMS256.txt.asc(该 URL 同样由getNodeDownloadUrl的shasum类型生成); - 校验文件哈希:对下载到的二进制文件计算 SHA-256,与清单中对应条目比对,例如:
# Linux/macOS echo "7e067b13cd0dc7ee8b239f4ebe1ae54f3bba3a6e904553fcb5f581530eb8306d node-v24.4.1-linux-x64.tar.xz" | sha256sum -c -- 校验 PGP 签名:由于文件是
-----BEGIN PGP SIGNED MESSAGE-----格式的签名消息,可导入 Node.js 官方发布密钥后用gpg --verify SHASUMS256.txt.asc验证签名指纹,确认校验和文件本身未被篡改(公告中的签名由 Node.js 发布密钥签发,密钥指纹为EE 08 9B F6 ...系列发布专用密钥之一,具体以官方安全与发布密钥列表为准)。
asc后缀表示这是 ASCII 装甲(armored)的 PGP 签名文件,Hash: SHA256头声明了签名所用的哈希算法。先验证签名、再比对 SHA-256,是处理官方发布产物的标准双重校验流程。
深入幕后:官网如何自动化生成这篇发布博客
你看到的这份公告并非人工誊写,而是由 nodejs.org 仓库的发布脚本自动拼装。核心实现在 apps/site/scripts/release-post/index.mjs,其流水线如下:
- 确定版本:运行
node index.mjs 24.4.1指定版本;若省略参数,则从https://nodejs.org/dist/index.json自动取最新版本号; - 抓取 changelog 段落:
fetchChangelog从 Node.js 主仓库的CHANGELOG_V24.md中,用正则<a id="24.4.1"></a>精确截取该版本对应的发布段落,并将其中的*无序列表转为-; - 解析作者与版本策略:
findAuthorLogin用正则/^## .*? \([^)]+\)[,.] @(\S+)/从 changelog 标题中提取发布人 GitHub 用户名(本版本即@RafaelGSS),再调用 GitHub API 获取其显示名;fetchVersionPolicy用/^## ?\d{4}-\d{2}-\d{2}, Version [^(].*\(([^)]+)\)/提取版本策略,本版本解析结果为Current; - 拉取校验和:
fetchShasums直接抓取https://nodejs.org/dist/v24.4.1/SHASUMS256.txt.asc全文(抓取失败时回退为占位符[INSERT SHASUMS HERE]); - 验证下载产物存在性:
verifyDownloads对downloadsTable.mjs生成的全部 URL 发起 HEAD 请求,响应失败的在博客中标注为*Coming soon*; - 渲染与落盘:以上数据注入 apps/site/scripts/release-post/template.hbs(Handlebars 模板),再经 Prettier 格式化后写入
apps/site/pages/en/blog/release/v24.4.1.md——即本文关联的这份文档;若文件已存在,脚本默认拒绝覆盖,需加-f强制参数。
模板中versionPolicy直接决定了 Frontmatter 的title: Node.js {{version}} ({{versionPolicy}}),因此本站发布博客的标题、日期、分类(category: release)、布局(layout: blog-post)与作者均由同一数据源驱动,保证与官方 changelog 的一致性。
发布数据在网站中的进一步流转
除博客本身外,v24.4.1 的发布数据还会进入网站其他功能模块:
- 版本列表:
generateAllVersionsData(见 apps/site/next-data/generators/releaseVersions.mjs)将 24.x 线全部小版本(含 24.4.1)聚合为v24.4.1形式的版本下拉选项,供下载页版本切换使用; - 发布状态:
generateReleaseData计算 24.x 线的Current状态并携带v8、npm、modules等依赖版本信息,渲染在发布总览与各版本对比表中; - 安装引导:下载页的 ReleaseCodeBox 会根据当前选中的操作系统、安装方式与包管理器,组合渲染
nvm、fnm、brew、docker等安装脚本片段(片段模板见 apps/site/snippets/en/download/)。例如 nvm 场景下会执行nvm install 24并回显校验node -v是否输出v24.4.1。
结语
Node.js 24.4.1 是一次典型的“小而关键”的安全发布:两处提交分别回退 V8 哈希算法缺陷、补齐 Windows 保留设备名防护,却足以阻断两类可被远程/本地利用的攻击路径。对使用者而言,正确动作是:确认自己的版本线 → 下载对应平台的 v24.4.1 产物 → 用 SHASUMS256.txt.asc 完成 SHA-256 与 PGP 双重校验 → 部署并回归验证。而对关注开源生态的读者,nodejs.org 仓库中从release-post脚本到releaseData/releaseVersions生成器再到下载页组件的完整链路,也展示了大型项目如何将“发布公告”这一高频、高一致性的流程,从手工劳动转变为可复现、可审计的工程化流水线。
【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考