尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Node.js 12.21.0 (LTS) 安全更新详解:三个 CVE 的修复机制与发布清单解读

Node.js 12.21.0 (LTS) 安全更新详解:三个 CVE 的修复机制与发布清单解读 Node.js 12.21.0 (LTS) 安全更新详解三个 CVE 的修复机制与发布清单解读【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org导读Node.js 12.21.0 是 2021 年 2 月 23 日发布的一个 LTS长期支持版本其核心内容是为 Node.js 12 分支修复三个安全漏洞HTTP/2unknownProtocol导致的拒绝服务、--inspect调试器 DNS rebinding 防护绕过以及 OpenSSL 1.1.1j 引入的CipherUpdate整数溢出修复。本文以 apps/site/pages/en/blog/release/v12.21.0.md 发布公告为骨架结合 nodejs.org 官网仓库的源码实现讲解每个漏洞的成因、攻击路径、修复提交并给出完整的二进制/源码下载清单与 SHASUMS 校验方法帮助读者理解安全维护型 LTS 版本的发布机制与验证流程。版本概览一次以安全为主线的 LTS 补丁发布Node.js 12 系列发布于 2019 年按 Release Schedule 进入 LTS 维护期。12.21.0 属于该系列的补丁级patch发布不引入破坏性变更全部改动集中在依赖升级与安全修复上。从 nodejs.org 仓库的发布数据生成逻辑可以看出版本状态的判定方式在 releaseData.mjs 中getNodeReleaseStatus会先判断 EOL 日期若未到 EOL 且最新版本处于 LTS 阶段则标记为LTS否则为Current。12.21.0 在当时即处于 LTS 状态随后的 12.x 系列维护版本如 12.22.x继续遵循同样的判定逻辑。该状态值会进一步驱动官网的 Badge 展示见 next.constants.mjs 中的STATUS_KIND_MAPLTS对应info蓝色徽章。本次发布共包含 4 个提交Commits可划分为两个层次OpenSSL 依赖升级2 个提交PR #37413将内置 OpenSSL 源码升级到 1.1.1j并同步更新架构相关文件。Node.js 自身安全修复2 个提交位于 nodejs-private 私有仓库为 HTTP/2 添加unknownProtocol超时以及移除 inspector 的localhost6白名单主机。其中后两项分别对应 CVE-2021-22883 与 CVE-2021-22884前者是本次发布的核心新增修复CVE-2021-23840 则是通过 OpenSSL 升级顺带解决的上游漏洞。CVE-2021-22883HTTP/2unknownProtocol拒绝服务漏洞成因HTTP/2 服务器在收到客户端发送的unknownProtocol连接尝试时旧的实现会为每次尝试保留一个文件描述符file descriptor。当攻击者短时间内建立大量此类连接时若系统配置了文件描述符数量上限服务器将无法再接受新连接进程也会因为无法打开文件而受影响例如无法打开日志文件若系统未配置文件描述符上限则会导致内存使用过度增长最终使系统内存耗尽。本质上这是一个资源耗尽型resource exhaustion拒绝服务漏洞攻击者不需要任何权限仅通过发送大量畸形协议的 HTTP/2 连接即可拖垮目标服务。修复方式修复提交为http2: add unknownProtocol timeoutnodejs-private#246SEMVER-MINOR 级别其思路是为处于unknownProtocol状态的 HTTP/2 会话设置一个超时机制使服务器在等待协议确认期间不会无限期地持有文件描述符从而阻断资源泄漏路径。值得说明的是Node.js 的 HTTP/2 实现lib/http2/与http2模块是独立于该官网仓库的运行时代码本次发布公告只记录了修复提交的 SHA922ada7713。从仓库视角看nodejs.org 官网对这类安全信息的分发链路体现在两个层面发布博客即本篇文章所依据的 v12.21.0.md它随每个版本由发布团队人工生成并提交漏洞数据聚合vulnerabilities.mjs 从 Node.js Security Working Group 的vuln/core/index.jsonURL 定义于 next.constants.mjs拉取结构化漏洞数据按照vulnerable字段中的版本范围表达式如12.x、12.0.0、 12.21.0等将每个漏洞分组到对应的 major 版本下用于在下载页与 EOL 页面展示“该版本受哪些漏洞影响”的表格。也就是说读者可以在官网的 Releases 页面看到 12.21.0 的修复摘要同时通过漏洞聚合数据交叉核对每个历史版本的安全状态二者数据源不同但互为印证。CVE-2021-22884--inspect调试器的 DNS rebinding 绕过漏洞成因Node.js 的 inspector 调试器通过--inspect/--inspect-brk启动内置了 DNS rebinding 防护它维护一个允许连接的 host 白名单默认仅放行localhost相关的环回域名防止远程网页通过 DNS rebinding 技术劫持本机调试端口。漏洞出在白名单中包含localhost6。该域名的实际解析依赖系统/etc/hosts配置如果/etc/hosts中没有localhost6条目它就是一个普通的、需要经由 DNS 服务器在网络上解析的域名攻击者只要控制受害者的 DNS 服务器或能伪造 DNS 响应就可以让localhost6解析到攻击者指定的地址从而绕过 DNS rebinding 防护重新利用此前 CVE-2018-7160 中描述的针对调试端口的攻击手法。修复方式修复提交为src: drop localhost6 as allowed host for inspectornodejs-private#244提交 SHA1564752d55由 Matteo Collina 提交直接从 inspector 的允许主机列表中移除localhost6使调试器不再信任这个可能被 DNS 劫持的域名从而封堵绕过路径。修复后如果开发者确实需要通过 IPv6 环回地址连接调试器应显式使用--inspect::1IPv6 环回地址等方式绑定而不是依赖localhost6这一域名解析结果。运维提示生产环境不应开启--inspect调试端口默认只应绑定到本机如需远程调试应通过 SSH 隧道等受控通道访问并配合防火墙限制该漏洞影响所有使用--inspect且受影响的 Node.js 版本升级到 12.21.0或更新版本即可消除localhost6绕过面。CVE-2021-23840OpenSSLCipherUpdate整数溢出上游依赖修复漏洞成因CVE-2021-23840 是 OpenSSL 自身的一个漏洞位于EVP_CipherUpdate等加解密函数中当输入数据长度接近整数上限时内部计算可能发生整数溢出导致缓冲区处理异常。Node.js 通过捆绑vendoredOpenSSL 提供 TLS/crypto 能力因此也继承了该漏洞。修复方式Node.js 12.21.0 通过两个提交完成修复deps: upgrade openssl sources to 1.1.1j0633ae77e6deps: update archs files for OpenSSL-1.1.1je69177a088两者均属于 PR #37413Daniel Bevenius前者将 OpenSSL 源码升级到 1.1.1j后者同步更新随版本发布的架构相关文件archs files。OpenSSL 官方公告2021-02-16将 1.1.1j 标记为修复该整数溢出问题的安全版本。对使用者的影响使用 Node.js 内置crypto模块或 HTTPS/TLS 服务的应用升级到 12.21.0 即获得修复如果应用通过--openssl-config或系统 OpenSSL 动态链接则需同时确保系统侧 OpenSSL 也升级到修复版本1.1.1j 或更高该漏洞属于上游依赖问题Node.js 本身没有行为变更升级后无需修改应用代码。发布产物与校验下载清单、SHA-256 校验与签名验证完整下载清单发布公告列出了官方分发渠道nodejs.org/dist/v12.21.0/下的全部产物按平台归类如下平台/架构安装包/二进制Windows 32-bitnode-v12.21.0-x86.msi安装器、win-x86/node.exe二进制Windows 64-bitnode-v12.21.0-x64.msi安装器、win-x64/node.exe二进制macOS 64-bitnode-v12.21.0.pkg安装器、node-v12.21.0-darwin-x64.tar.gzLinux 64-bitnode-v12.21.0-linux-x64.tar.xzLinux PPC LE 64-bitnode-v12.21.0-linux-ppc64le.tar.xzLinux s390x 64-bitnode-v12.21.0-linux-s390x.tar.xzAIX 64-bitnode-v12.21.0-aix-ppc64.tar.gzSmartOS 64-bitnode-v12.21.0-sunos-x64.tar.xzARMv7 32-bitnode-v12.21.0-linux-armv7l.tar.xzARMv8 64-bitnode-v12.21.0-linux-arm64.tar.xz源码node-v12.21.0.tar.gz/node-v12.21.0.tar.xz同时发布的还有node-v12.21.0-headers.tar.gz/.tar.xz编译原生模块所需的头文件包、node-v12.21.0-win-x64.7z/.zip与win-x86.7z/.zipWindows 压缩包、win-x64/node.lib/win-x86/node.libWindows 导入库供链接使用、win-x64/node_pdb.*/win-x86/node_pdb.*调试符号包。API 文档位于nodejs.org/docs/v12.21.0/api/。官网如何生成下载链接nodejs.org 仓库中的下载按钮并不硬编码某个版本的 URL而是通过 util/url.ts 的getNodeDownloadUrl函数动态拼接其规则与上表一一对应kind source时返回node-${version}.tar.gz即源码包kind shasum时返回SHASUMS256.txt.asc即签名校验文件macOS安装器为.pkg二进制为darwin-${platform}.tar.gzWindows安装器为${platform}.msi如x64、arm64二进制为win-${platform}.zipLinuxlinux-${platform}.tar.xzARMv7 对应linux-armv7lARMv8 对应linux-arm64AIXaix-${platform}.tar.gz未识别平台时默认回退到源码包。下载页还会根据客户端上下文操作系统与架构自动推荐对应安装包见 DownloadButton/index.tsx 中通过getUserPlatform(architecture, bitness)解析平台、再由getNodeDownloadUrl生成链接的逻辑。DIST_URL默认指向https://nodejs.org/dist/可通过NEXT_PUBLIC_DIST_URL环境变量覆盖见 next.constants.mjs。使用包管理器安装对于多数开发者更推荐直接通过版本管理器安装到 12.21.0。官网下载页提供的安装片段见 snippets/en/download/nvm.bash给出了 nvm 方式# Download and install nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.6/install.sh | bash # in lieu of restarting the shell \. $HOME/.nvm/nvm.sh # Download and install Node.js (按需替换为具体版本): nvm install 12.21.0仓库同时为 fnm、brew、docker、choco、n、asdf 等安装方式准备了对应片段见 apps/site/snippets/en/download 目录安装后可用node -v确认版本号为v12.21.0。SHASUMS 校验与签名验证发布公告末尾附带了完整的SHASUMS256.txt内容PGP 签名消息包含全部 24 个产物的 SHA-256 校验和。下载任何产物后建议执行以下校验流程# 1. 下载校验文件与产物以 Linux x64 为例 curl -O https://nodejs.org/dist/v12.21.0/SHASUMS256.txt.asc curl -O https://nodejs.org/dist/v12.21.0/node-v12.21.0-linux-x64.tar.xz # 2. 校验 SHA-256macOS 使用 shasum -a 256 sha256sum -c SHASUMS256.txt.asc --ignore-missing # 3. 验证 PGP 签名需要 Node.js 发布团队的公开密钥 gpg --verify SHASUMS256.txt.asc校验输出应显示node-v12.21.0-linux-x64.tar.xz: OK。PGP 签名由 Node.js 发布团队私钥签署公钥可从官方渠道获取SHASUMS256.txt.asc中的 Hash 算法为 SHA256文件内含-----BEGIN PGP SIGNED MESSAGE-----与-----BEGIN PGP SIGNATURE-----两个区块任何篡改都会导致签名验证失败。博客发布页在官网中的渲染链路本篇文章所依据的发布公告在官网中通过以下链路渲染见 app/[locale]/blog/[...path]/page.tsx路由层通过getMarkdownContext按blog/{pathname}定位 Markdown 文件即本仓库中的apps/site/pages/{locale}/blog/release/*.md使用 frontmatter 中的layout字段本公告为blog-post选择布局路由声明dynamic force-static与revalidate 300即页面静态渲染并每 5 分钟增量再验证一次保证新发布公告及时上线BLOG_DYNAMIC_ROUTES见 next.dynamic.constants.mjs配合generateStaticParams在静态导出模式下预生成各语言版本的博客路径。发布公告中的 frontmatter 字段date、category: release、title、layout: blog-post、author会被解析为页面元数据作者信息与 apps/site/authors.json 中的条目对应。此外所有发布公告会汇总进 RSS Feed 路由见 app/[locale]/feed/[feed]/route.ts订阅者可第一时间收到版本更新通知。升级建议与验证清单受影响范围CVE-2021-22883影响所有受影响的 Node.js 12.x 及更早版本凡对外提供 HTTP/2 服务的应用均存在风险CVE-2021-22884影响使用--inspect/--inspect-brk调试且系统未配置localhost6条目的环境CVE-2021-23840影响所有内置 OpenSSL 1.1.1 系列低于 1.1.1j的 Node.js 版本。升级步骤使用包管理器或二进制包将 Node.js 升级至 12.21.0或直接迁移到仍在维护期内的更高 major 版本升级后重启 Node.js 进程执行node -v确认版本对暴露 HTTP/2 的服务进行连接压力回归测试确认unknownProtocol超时机制生效、文件描述符数量保持稳定可观察ulimit -n与实际 fd 占用如使用调试器确认--inspect的监听地址绑定符合预期并在生产环境移除调试开关验证crypto/ TLS 功能正常若使用系统 OpenSSL 请同步升级。验证要点通过官网 Previous Releases 页面可查看 12.x 系列的历史版本与状态通过漏洞聚合页面由 vulnerabilities.mjs 生成数据可确认 12.21.0 之后该 major 版本的漏洞修复状态对安全敏感场景务必先校验下载产物的 SHASUMS 与 PGP 签名再执行安装。总结Node.js 12.21.0 是一次典型的“安全维护型”LTS 发布通过 OpenSSL 1.1.1j 升级顺带修复上游整数溢出漏洞通过unknownProtocol超时机制封堵 HTTP/2 资源耗尽攻击路径通过移除localhost6白名单修复调试器 DNS rebinding 绕过。对运维与开发者而言理解这三个 CVE 的攻击面与修复提交配合发布公告中的完整下载清单、SHA-256/PGP 双重校验流程即可安全、可验证地完成版本升级。若需在 Node.js 12 LTS 分支继续停留12.21.0 及后续维护版本是唯一的安全选择若项目已具备迁移条件建议评估迁移至更新 major 版本的可行性以获得更长的安全维护窗口。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表