Node.js 2018年6月安全更新深度解析五个 DoS 漏洞CVE-2018-7161/7162/7164/7167/1000168的成因、影响面与修复对照【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org2018 年 6 月 12 日Node.js 官方发布了覆盖全部活跃发布线release line的安全更新一次性修复了五个可被远程利用的拒绝服务Denial of Service, DoS漏洞。本文以 nodejs.org 仓库中的官方安全公告 june-2018-security-releases.md 为主体逐一拆解每个 CVE 的攻击原理、受影响版本矩阵、官方修复方式并结合仓库内对应的四个版本发布帖v10.4.1、v9.11.2、v8.11.3、v6.14.3给出精确的修复对照表。读完本文你将掌握这批漏洞的完整攻击面评估方法、各发布线的升级路径以及如何在 nodejs.org 仓库中溯源验证安全公告与修复提交。说明本文涉及的所有 Node.js 版本6.x–10.x如今均已超出生命周期EOL。本文内容定位为历史安全公告的深度解读与漏洞分析范式参考同时其公告—修复版本—回归测试的协作方式至今仍是 Node.js 安全响应的标准流程。公告背景从预告到更新的完整时间线官方公告文档结构本身就体现了 Node.js 安全披露的两阶段流程初始预告Initial announcementNode.js 团队预告将于 2018 年 6 月 12 日UTC前后为所有受支持的发布线发布新版本其中包含多项安全修复并提前给出各发布线的漏洞数量与最高严重级别预估方便用户评估影响。更新公告Update在 6 月 12 日实际发布版本后公告顶部追加更新说明披露每个 CVE 的完整细节公告原文中以_(Update 12-June-2018)_标注原预告内容完整保留在文档末尾的**_Original post is included below_**部分并同步给出四个具体修复版本。这种先预告、后披露的机制与公告文档末尾所描述的一致发布的同时披露漏洞细节以便用户进行完整的影响评估impact assessment。修复版本总览四条发布线同日更新本次更新覆盖当时全部活跃发布线官方强烈建议所有用户尽快升级发布线修复版本发布线状态Node.js 10.x10.4.1CurrentNode.js 9.x9.11.2非 LTS 过渡版本Node.js 8.x8.11.3LTS CarbonNode.js 6.x6.14.3LTS Boron从仓库源码结构看LTS / Current / EOL 这些状态并非公告中的静态描述而是由 releaseData.mjs 依据发布计划schedule动态计算getNodeReleaseStatus会先判断是否已过 EOL 日期再依据最新版本是否标记为 LTS 来区分状态releaseData.mjs。这也意味着站在今天回看上述四条发布线都已按该逻辑被判定为 EOL。五个漏洞逐一拆解CVE-2018-7161HTTP/2 清理阶段的 Use-After-Free 导致进程崩溃严重级别HIGH攻击方式攻击者通过与 Node.js http2 服务进行特定交互触发原生代码native code中一个对象在不再可用之后仍被使用的清理缺陷use-after-free使服务进程崩溃实现拒绝服务。影响范围Node.js 8.xLTS Carbon、9.x、10.xCurrent全部版本均受影响6.xLTS Boron不受影响。修复方式更新 http2 实现。从 v8.11.3 发布帖的提交记录可以印证修复涉及http2: fixup http2stream cleanup and other nits——即修正 http2 stream 的清理逻辑避免在清理阶段访问已释放的对象。致谢该问题由 F5 Networks 的 Jordan Zebor 报告。CVE-2018-1000168nghttp2 依赖缺陷畸形 ALTSVC 帧触发未初始化读取严重级别HIGH攻击方式在特定条件下恶意客户端发送畸形的 ALTSVC 帧可触发一次未初始化读取uninitialized read进而导致段错误segfault使进程崩溃。影响范围Node.js 8.4.x 及以上LTS Carbon、全部 9.x、全部 10.xCurrent均受影响6.x 不受影响。修复方式升级底层 HTTP/2 库 nghttp2。四个受影响版本中v10.4.1、v9.11.2、v8.11.3 的发布帖均记录了deps: update to nghttp2 1.32.0提交即通过将 nghttp2 升级到 1.32.0 完成修复同时各版本均补加了对应的回归测试test: add regression test for nghttp2 CVE-2018-1000168。CVE-2018-7162TLS 握手期间的重复/意外消息导致进程崩溃严重级别HIGH攻击方式攻击者在 TLS 握手handshake过程中发送重复或意外的消息可导致提供 TLS 支持的 http 服务进程崩溃构成拒绝服务。影响范围全部 9.x、全部 10.xCurrent均受影响6.x 与 8.x 不受影响——这是五个漏洞中影响面最窄的一个。修复方式更新 TLS 实现。发布帖中的对应提交为tls: fix SSL write error handling修复 SSL 写入错误处理并配套test: add tls write error regression test回归测试。致谢同样由 F5 Networks 的 Jordan Zebor 报告并协助 Node.js 团队调查。CVE-2018-71649.7.0 引入的回归导致内存耗尽 DoS严重级别MEDIUM攻击方式该缺陷由 9.7.0 版本引入。当应用直接以流stream方式通过net.Socket对象从网络读取数据到 JavaScript 时内存消耗异常增大攻击者通过短时间连续发送微小数据块tiny chunks即可耗尽内存造成拒绝服务。影响范围Node.js 9.7.0 及以上、全部 10.xCurrent受影响6.x、8.x 不受影响。修复方式回退revert到先前的行为。发布帖中的对应提交为src: re-add \Realloc() shrink after reading stream data——即恢复读取流数据后对缓冲区执行Realloc()收缩shrink的逻辑并附带了对应测试test: add Realloc() shrink after reading stream data test。注意 9.11.2 与 10.4.1 均包含此修复而 8.11.3 也带有该项测试用于防止类似问题回归。CVE-2018-7167Buffer.fill() / Buffer.alloc() 参数不当导致挂起所有发布线级别分布最特殊攻击方式以特定参数调用Buffer.fill()或Buffer.alloc()会导致进程挂起hang从而可能被利用造成拒绝服务。公告给出了会触发挂起的完整用例Buffer.alloc(100).fill(Buffer.alloc(0)); Buffer.alloc(100).fill(Buffer.from()); Buffer.alloc(100).fill(new Uint8Array([])); Buffer.alloc(100, Buffer.alloc(0)); Buffer.alloc(100, new Uint8Array([])); new Buffer(10).fill(new Buffer());共同点是向填充/分配逻辑传入了一个零长度empty的缓冲区或 TypedArray旧实现会因此陷入等待而非正常完成。影响范围这是唯一一个 10.x 不受影响、而 6.x / 8.x / 9.x 全部受影响的漏洞。修复方式更新Buffer.alloc()与Buffer.fill()的实现在遇到上述无效输入时改为零填充zero fill而不是挂起。发布帖中的对应提交为src: avoid hanging on Buffer#fill 0-length input避免在 0 长度输入时挂起并同步更新了文档说明doc: buffer.fill() can zero-fill on invalid input。值得注意的是v6.14.3 是本次唯一只修复该漏洞的版本。各发布线修复内容精确对照综合公告与四个发布帖的 Notable Changes可以得到精确到每个版本的修复矩阵CVE漏洞模块6.14.3 (Boron)8.11.3 (Carbon)9.11.210.4.1 (Current)CVE-2018-7161HTTP/2 清理 use-after-free不适用✅✅✅CVE-2018-1000168nghttp2 ALTSVC 未初始化读取不适用✅✅✅CVE-2018-7162TLS 握手 DoS不适用不适用✅✅CVE-2018-7164net.Socket 流内存耗尽不适用不适用✅✅CVE-2018-7167Buffer.fill()/alloc() 挂起✅✅✅不适用该对照表与原始预告中的影响评估完全吻合6.x 修复 1 个漏洞严重级别 LOW、8.x 修复 3 个公告原文修正说明应为 3 个最高 HIGH、9.x 修复 5 个最高 HIGH、10.x 修复 4 个最高 HIGH。此外v10.4.1 发布帖还附带了两项非安全修复n-api 的napi_delete_async_workuse-after-free 预防、以及若干 V8 补丁。升级验证与实操建议升级路径根据上表确定自己所在发布线升级到对应的修复版本10.4.1 / 9.11.2 / 8.11.3 / 6.14.3。所有版本均提供 WindowsMSI 安装包与二进制、macOSpkg 安装包与二进制、Linux 多架构x64、x86、ppc64le、s390x、armv6l、armv7l、arm64、AIX、SmartOS 等平台的安装包与源码包并附带 PGP 签名的 SHASUMS 校验文件见各发布帖末尾。确认当前版本升级后通过node -v检查运行版本是否已命中修复版本号。优先级判断如果你的服务对外暴露了http2 或 TLS端口CVE-2018-7161 / 1000168 / 7162 属于可被远程触发的 HIGH 级风险应优先升级9.7.0 及以上用户需额外关注 CVE-2018-7164。事后验证可以在自己的环境里复现 CVE-2018-7167 的六段示例代码——在 6.x/8.x/9.x 旧版本上它们会挂起而在修复版本上会正常零填充返回这是最直观的升级前后行为差异。在本仓库中溯源这批公告nodejs.org 仓库将安全公告与版本发布信息分目录组织便于检索与交叉验证本公告原文位于 apps/site/pages/en/blog/vulnerability/该目录还收录了 2016–2026 年间全部安全公告如 june-2016-security-releases.md、december-2017-security-releases.md 等可以横向对比不同年份的安全响应节奏。四个修复版本发布帖位于 apps/site/pages/en/blog/release/ 目录其中 Notable Changes 与 Commits 是本文修复对照表的直接证据来源。公告文档的 frontmattercategory: vulnerability、layout: blog-post、author、date会被站点的博客数据生成逻辑见 apps/site/scripts/blog-data/generate.mjs消费最终渲染为博客列表与单篇文章页面。附原始公告核心要点回顾影响评估预告版6.x 存在 1 个 LOW 级 DoS8.x 存在 2 个 DoS后续修正为 3 个最高 HIGH9.x 存在 5 个 DoS最高 HIGH10.x 存在 4 个 DoS最高 HIGH。发布时机2018 年 6 月 12 日UTC前后发布修复版本并同步披露漏洞细节以支持完整影响评估。后续信息渠道官方安全政策、漏洞报告邮箱securitynodejs.org与低流量公告邮件列表 nodejs-sec 是当时获取后续安全动态的官方途径如今安全公告的归档与检索均可通过本仓库的 vulnerability 目录完成。对于正在评估历史 Node.js 版本风险、或希望理解 Node.js 安全发布机制的开发者而言这批公告的价值不仅在于 2018 年的那次修复本身更在于它展示了预告影响面 → 同日发布修复 → 公告与发布帖互相印证的完整披露范式——这一范式至今仍是 Node.js 安全生态的运作基础。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考