Node.js 11.10.1(Current)安全发布深度解析:CVE-2019-5737 Slowloris keep-alive DoS 修复与 HTTP 超时防御机制

发布时间:2026/9/18 1:25:21
Node.js 11.10.1(Current)安全发布深度解析:CVE-2019-5737 Slowloris keep-alive DoS 修复与 HTTP 超时防御机制 Node.js 11.10.1Current安全发布深度解析CVE-2019-5737 Slowloris keep-alive DoS 修复与 HTTP 超时防御机制【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org本篇文章基于 Node.js 官网仓库中 v11.10.1 发布说明 展开完整剖析这次「安全发布」的来龙去脉Slowloris慢速连接拒绝服务攻击的 keep-alive 变体如何绕过旧有防护、server.headersTimeout修复的底层逻辑以及配套的下载校验与发布说明生成机制。读完本文你将理解 CVE-2019-5737 的攻击原理、Node.js HTTP 服务端三个关键超时参数headersTimeout、keepAliveTimeout、setTimeout的正确配置方式并掌握用 SHASUMS PGP 验证官方二进制完整性的完整流程。发布概览一次聚焦 HTTP 安全的 Current 版本v11.10.1 发布于 2019 年 2 月 28 日属于当时仍处于快速迭代期的 Node.js 11Current发布线。从发布说明的 YAML frontmatter 可以完整还原这条记录的元数据date: 2019-02-28T12:47:37.738Z category: release title: Node.js 11.10.1 (Current) layout: blog-post author: Rod Vagg其中category: release与layout: blog-post决定了它在官网博客体系中的归类与渲染方式——所有版本发布说明均以 Markdown 文件存放在 release 目录按category归档、按 frontmatter 中的date排序展示。发布说明开篇即明确声明This is a security release. All Node.js users should consult the security release summary at /blog/vulnerability/february-2019-security-releases/ for details on patched vulnerabilities.也就是说这并非常规功能版本而是一次围绕已知安全漏洞的紧急修复发布。完整的安全汇总位于仓库内的 february-2019-security-releases.md。本次发布仅包含一个 CVE 修复Node.js: Slowloris HTTP Denial of Service with keep-alive (CVE-2019-5737)CVE-2019-5737 漏洞剖析Slowloris 攻击的 keep-alive 变体Slowloris 攻击的基本原理Slowloris 是一类经典的「慢速连接」拒绝服务攻击攻击者不一次性把 HTTP 请求发送完而是以极慢的速度、分多次向服务器推送请求头headers。服务器为了等待完整的请求头必须一直持有该连接及其关联的资源socket、内存、事件循环上的定时器不放。当攻击者同时维持成百上千个这样的半开连接时服务器的连接池与内存会被逐步耗尽导致正常用户无法建立新的连接——形成拒绝服务。根据仓库中的 november-2018-security-releases.mdCVE-2018-12122 公告记载该漏洞被归类为Uncontrolled Resource Consumption / Denial of ServiceCWE-400严重级别为 LOW。攻击的实际危害可被负载均衡器或代理层缓解。keep-alive 变体为何能绕过已有防护v11.10.1 修复的 CVE-2019-5737 是CVE-2018-12122 的延伸。2018 年 11 月的修复引入了「40 秒接收超时」服务器在接收 HTTP 请求头时如果 40 秒内未收完整则在收到下一个数据块时销毁该 socket该超时可通过server.headersTimeout调整。但 2019 年 2 月公告明确指出这个 40 秒超时并未被一致性应用于 keep-alive 模式下的连接An attacker can cause a Denial of Service (DoS) by establishing an HTTP or HTTPS connection in keep-alive mode and by sending headers very slowly thereby keeping the connection and associated resources alive for a long period of time.换句话说攻击者可以建立一个 keep-alive 连接然后仍然用极慢的速度发送请求头——由于 keep-alive 连接的「存活」特性旧的超时机制没有覆盖到这种场景连接与资源可以被长期占用从而继续实施 Slowloris 型 DoS。影响范围根据 february-2019-security-releases.md 的 Impact 清单当时所有活跃发布线均受影响所有 Node.js 6LTS Boron版本受影响所有 Node.js 8LTS Carbon版本受影响所有 Node.js 10LTS Dubnium版本受影响所有 Node.js 11Current版本受影响漏洞最初由 Jan Maybach 报告CVE-2018-12122keep-alive 变体由 Voxnest 的 Marco Pracucci 报告修复由 Matteo Collina 完成。修复内容把headersTimeout一致性应用到 keep-alive 连接发布说明的Notable Changes一节完整记录了本次修复的核心http: Further prevention of Slowloris attacks on HTTP and HTTPS connections by consistently applying the receive timeout set byserver.headersTimeoutto connections in keep-alive mode. Reported by Marco Pracucci (Voxnest). (CVE-2019-5737 / Matteo Collina)关键词是consistently applying一致性应用将server.headersTimeout设置的接收超时同样作用到处于 keep-alive 模式的连接上从而堵住此前 40 秒超时被 keep-alive 场景绕过的缺口。对应的提交记录Commits一节为http: prevent slowloris with keepalive connectionsMatteo Collina修复走的是 Node.js 安全响应流程先进入私有仓库 nodejs-private/node-private 的 PR #158随安全发布一并公开符合 Node.js 项目对安全漏洞「先修复、后披露」的惯例。需要注意的是本次修复与 CVE-2018-12122 采用的是同一套参数模型——40 秒默认超时 server.headersTimeout可调只是把覆盖面补齐到 keep-alive 连接。因此生产环境中对这两个参数的调优经验可以直接沿用。2019 年 2 月安全发布全景v11.10.1 并非孤例。同一天2019-02-28Node.js 项目为所有活跃发布线发布了安全修复版本均可在仓库的 release 目录 中找到版本发布线对应发布说明Node.js 11.10.1Currentv11.10.1.mdNode.js 10.15.2LTS Dubniumv10.15.2.mdNode.js 8.15.1LTS Carbonv8.15.1.mdNode.js 6.17.0LTS Boronv6.17.0.md同批发布共涉及三个漏洞其中两个与 HTTP keep-alive 连接直接相关CVE-2019-5737 — Slowloris HTTP Denial of Service with keep-aliveCWE-400LOW本文主题影响全部四个发布线由 v11.10.1 等四个版本共同修复。CVE-2019-5739 — Denial of Service with keep-alive HTTP connectionsCWE-400仅影响 Node.js 6.16.0 及更早版本。Node.js 8.0.0 起引入了server.keepAliveTimeout默认 5 秒而 6.x 在此之前 keep-alive 连接可空转长达 2 分钟。v6.17.0 为此向 6.x 移植了server.keepAliveTimeout及 5 秒默认值。原始修复由 Timur Shemsedinov 提交nodejs/node#2534Matteo Collina 负责 backport。CVE-2019-1559 — OpenSSL 0-byte record padding oracleMODERATEOpenSSL 1.0.2r 的修复仅包含在 Node.js 6 和 8 的发布中Node.js 10 和 11 使用不含该缺陷的新版 OpenSSL不受影响。此外公告还提到原计划随本次发布修复的 Misinterpretation of InputCWE-115缺陷因修复方案尚不完善而被暂时搁置体现了 Node.js 安全团队「不发布未稳定修复」的谨慎态度。HTTP 服务端超时参数配置指南从 CVE-2018-12122 到 CVE-2019-5737Node.js 围绕「慢速请求」构建了一套由多个超时参数组成的纵深防御体系。以下是基于两份安全公告整理出的关键参数及其行为参数默认值作用相关公告server.headersTimeout40 秒自 CVE-2018-12122 修复引入接收 HTTP 请求头的最长时间超时后在下一次收到数据块时销毁 socketCVE-2018-12122、CVE-2019-5737server.keepAliveTimeout5 秒自 Node.js 8.0.0 引入keep-alive 连接在两次请求之间的最大空闲时间CVE-2019-5739server.setTimeout(msecs)/server.timeout默认 120 秒2 分钟socket 整体空闲超时配合 headers 超时共同防止资源被长期占用CVE-2018-12122 公告推荐组合使用公告中特别强调server.headersTimeout需与server.setTimeout()配合使用才能有效抵御「长时间占住连接」类的资源耗尽攻击。一个兼顾正常客户端与安全性的典型配置示例const http require(http); const server http.createServer((req, res) { res.end(ok); }); // 接收请求头超时40 秒默认值可按业务调整 server.headersTimeout 40000; // keep-alive 空闲超时5 秒默认值 server.keepAliveTimeout 5000; // socket 整体空闲超时 server.setTimeout(120000); server.listen(8080);对于面向公网的服务更激进的收紧如headersTimeout调低到 1020 秒通常能在不损害正常用户体验的前提下进一步压缩 Slowloris 的攻击窗口若前置了负载均衡器或代理层攻击面会进一步收窄——这也是两份公告都提到的缓解因素。下载与完整性校验官方二进制清单v11.10.1 发布说明完整列出了各平台的分发产物位于官方 dist 目录https://nodejs.org/dist/v11.10.1/平台产物Windows 32-bit Installernode-v11.10.1-x86.msiWindows 64-bit Installernode-v11.10.1-x64.msiWindows 32-bit Binarywin-x86/node.exeWindows 64-bit Binarywin-x64/node.exemacOS 64-bit Installernode-v11.10.1.pkgmacOS 64-bit Binarynode-v11.10.1-darwin-x64.tar.gzLinux 64-bit Binarynode-v11.10.1-linux-x64.tar.xzLinux PPC LE 64-bit Binarynode-v11.10.1-linux-ppc64le.tar.xzLinux s390x 64-bit Binarynode-v11.10.1-linux-s390x.tar.xzAIX 64-bit Binarynode-v11.10.1-aix-ppc64.tar.gzSmartOS 64-bit Binarynode-v11.10.1-sunos-x64.tar.xzARMv6 32-bit Binarynode-v11.10.1-linux-armv6l.tar.xzARMv7 32-bit Binarynode-v11.10.1-linux-armv7l.tar.xzARMv8 64-bit Binarynode-v11.10.1-linux-arm64.tar.xzSource Codenode-v11.10.1.tar.gz其他发布文件完整列表见dist目录文档node-v11.10.1/api随版本固定的 API 文档从发布说明的生成机制看见下文这份清单并非手写而是由仓库脚本依据 semver 版本号与平台矩阵自动生成的这也解释了为何同一批安全版本如 v10.15.2.md的下载清单结构与 v11.10.1 完全一致。SHASUMS 与 PGP 签名校验发布说明以 PGP 签名的 SHASUMS 消息形式给出了所有产物的 SHA-256 哈希即官方SHASUMS256.txt.asc的内容涵盖所有.tar.gz、.tar.xz、.7z、.zip、.msi、.pkg以及 Windows 的node.exe/node.lib/node_pdb等文件-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 b52526c4d271c221e9bd4b36888be9a1b5f8b5381f22665ec46910dde0c06b45 node-v11.10.1-aix-ppc64.tar.gz dea52b86f6875efae26fbb6d0269d9769da7ca69408b74b6ab724d4b64004b07 node-v11.10.1-darwin-x64.tar.gz 181b24e195758b37ece29e1070c9a8469815978fb6a41f7acfedef5e47f4290a node-v11.10.1-darwin-x64.tar.xz 33caa6d7ebbdf9f0dc771f95bb4bd203561c0cd66337b8112dee8db0056ccfe6 node-v11.10.1-headers.tar.gz 46400dbd3c399d511395ca02b468ac5040fbf6e102d0735bbbc7b702c4f0fe37 node-v11.10.1-headers.tar.xz 3438c8f94af3e53b83ceca1162ac3841718207a75d3c8e4d79bbb2c0653a690e node-v11.10.1-linux-arm64.tar.gz b116e57906ed73c970d64e7518b08c6de236575c5cd8bf09f4c1bd668524a014 node-v11.10.1-linux-arm64.tar.xz 5dac4182b2695bab096c56129d2b1ada7286facf00d919d2ab27dd1198880e57 node-v11.10.1-linux-armv6l.tar.gz 3b5f897cf3650f8577bdff28f4d5fe021a9febecfebed79ba8f1b7d444ca3419 node-v11.10.1-linux-armv6l.tar.xz 9f28ea3d16801c5f38f9ff1ebc7526aa72ad88c4a531285c4c063b22d67be301 node-v11.10.1-linux-armv7l.tar.gz ea3c22113d660320ceadb611fa46c945eb4725e06f91d3e1371291f3ffe98d82 node-v11.10.1-linux-armv7l.tar.xz f55da90c4f1aa78cab272f46c6541a60b22dcb6f5ef35fef8c57aea3e95fadbc node-v11.10.1-linux-ppc64le.tar.gz 3579d4a7aca9ad91d94609fd78b7f9a9f72ff2c00a2f46492a960ecb2cec7b10 node-v11.10.1-linux-ppc64le.tar.xz f685c971a9ce396dd632cda7830eb311ed2741fef2f1caba54d2ed233a289734 node-v11.10.1-linux-s390x.tar.gz dcfcc18d5fbe2cbc737df0c21db093c17f737a8db854963dbf3c2e8c9e4d86f8 node-v11.10.1-linux-s390x.tar.xz c84fe17ceb999ecd5d0a1ad5b70b502779a22e433f96e0b6a0ddf6d99f954975 node-v11.10.1-linux-x64.tar.gz 414216a7e47dbfb77141dce7a4452901ae2cdb4cd0deef3ab3ab49e0b2111f82 node-v11.10.1-linux-x64.tar.xz 658678fd109e77c38f46fe663d709fbd7c0608c6ddf98a0d06a1337f21d0342e node-v11.10.1.pkg 209c97642239ab4e097d51f4e5a4998f10c3be705c85f6fc702887d0e8b5e67c node-v11.10.1-sunos-x64.tar.gz a9c6253b5a629b76f57b0c4182b0e2f140fee83b393f000fea89897690a7db0c node-v11.10.1-sunos-x64.tar.xz 1652c919cb56e264fb7e0b00c4d038766af943ed3db94865cbeb01360175777b node-v11.10.1.tar.gz c9ed8de288a76b7a2c7f89ec52b10a6c741ed88d16499033ab5ec88351836006 node-v11.10.1.tar.xz a6889a20f43c78ac5e250f218ed9ba655c83c730196b343ea707dbf7aa41dbb0 node-v11.10.1-win-x64.7z 80cf14abacbc6b636bc192f4eee49421f082f21cdaa9c1ea5995c38f8c1375e5 node-v11.10.1-win-x64.zip d85ea0bc5c7f30fda24ee03b911d5bbdcb0adecdf6bdb7d96c1d63c4bf018e32 node-v11.10.1-win-x86.7z fd40443d18f12386a06d6fdfe0c9befc32d1e72cb5c108a5a7fb7ddc15ac9e54 node-v11.10.1-win-x86.zip 12d4e313dd2944b262b20ad914a78e8beaa910e0985e501426db7bc376a3095a node-v11.10.1-x64.msi 1a7cbe6ebc41181970b0855e82df6a203710f1467f92ae058aaffaa6170c3c17 node-v11.10.1-x86.msi 7871bf1e1d81038731f8d3e381c415b37a550e4effd048a6ae69edd80b393a6f win-x64/node.exe 36a01d94f5c136fd0198f92ad345acff844aee0316c96ba20a98ecfb456fa895 win-x64/node.lib 1aec597a712fdfc3de40c825ca2ac8a8b18a79f3013f3b552cab286ca117b2cb win-x64/node_pdb.7z 752412002a5ddd0c9b163547a740f974b66e9c52d760c3a79121a9d51cfb18b1 win-x64/node_pdb.zip ba18eec8fa86517e92f3796a91ce6346ad5189ffc543cdbff708a53b62af21b0 win-x86/node.exe a75ad641b7187792b5e3dcb3997fc80a6b9a309d3c5f9cd87e1e9eb48fe49374 win-x86/node.lib 651781ab139ad91e2b2ed82f2bacc2f51d2da17f18f4a0787f1293ad80415345 win-x86/node_pdb.7z fdaf24bdfecf9ea93c47ec79fa05fb8014e333c2f386643ace4b50e4dfc03685 win-x86/node_pdb.zip -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE3Y8jOLrnUB491ax4wnN5L32DVF0FAlx316AACgkQwnN5L32D VF3xFQf/RXDQH3bQGeO0QX3XpINOwZqufotd85imcTgXJuDy0HFghSWr/TCw3nwP YtQ0p2fGyCdeRisLG6ywztqLkkiulp9HDosrgEID/ACMUOlAGf6hH4m9NqgRB2 30gaIGkutq26bQkXiV2g2dTDLnypGYHK4MEwua0E96DWsJXnLaK1BZBcKfe1JYe hpHWXSUCa/pwSkFsiyeKvflq4MRmaxRkPHRk7ulv5fufsFsdgfpJ9rhebMTDmz dMOldqziWzSGPzv2vgACFnXPZpvWQA/wi35YUQ6THxFpCHuLLYH2xV84nPlEr FZC7E5DLnhDMITqZFvOSIFvV3tDPQ Z25N -----END PGP SIGNATURE-----为什么在安全发布中校验尤其重要安全版本专门用于堵住漏洞一旦攻击者能够篡改分发渠道如 DNS 劫持或镜像污染用户装上的可能就是带后门的「修复版」。因此官方对每个产物同时提供 SHA-256 哈希与 PGP 签名签名密钥指纹可从 Node.js 官方渠道获取。下载后的推荐校验流程为# 1. 校验 SHA-256 哈希 shasum -a 256 node-v11.10.1-linux-x64.tar.xz # 2. 校验 PGP 签名需先导入官方签名密钥 gpg --verify SHASUMS256.txt.asc SHASUMS256.txt将第一步的输出与发布说明中对应的哈希值逐字符比对并确认第二步输出 Good signature即可认定产物未被篡改。发布说明是如何生成的release-post 工具链v11.10.1 这类发布说明的规范格式并非手工拼凑而是由仓库内置脚本 scripts/release-post/index.mjs 自动生成的。该脚本的工作流清晰可循确定版本接收命令行参数指定版本号缺省时从nodejs.org/dist/index.json拉取最新版本findLatestVersion拉取 changelog从官方 changelog 中按a idv11.10.1/a锚点截取对应版本的发布段落并把列表符号统一为 Markdown 形式fetchChangelog/fetchChangelogBody解析作者与版本策略通过正则从 changelog 标题如## 2019-02-28, Version 11.10.1 (Current), rvagg提取发布作者和策略Current/LTS再用 GitHub API 获取作者全名fetchAuthor/fetchVersionPolicy拉取 SHASUMS获取官方SHASUMS256.txt.asc签名消息失败时以占位符[INSERT SHASUMS HERE]待人工补充fetchShasums校验下载链接对下载清单中的每个 URL 发起 HEAD 请求存活则输出完整 URL否则标记为*Coming soon*verifyDownloadsurlOrComingSoon渲染与落盘使用 template.hbs 模板渲染经 Prettier 格式化后写入 release 目录 下的v{version}.mdrenderPost/formatPost/writeToFile。其中下载清单由 downloadsTable.mjs 依据平台矩阵生成并通过 semver 规则做平台裁剪——例如 v11.10.1 16.0.0不会生成 macOS Apple Silicon 产物 19.9.0 不生成 Windows ARM 产物。因此 v11.10.1 的下载清单里包含 SmartOS、ARMv6 等今日已较少见的平台正是该版本时代产物矩阵的真实写照。日常使用时只需在仓库内执行node index.mjs 11.10.1即可生成一份结构完整的发布说明草稿若文件已存在需加--force覆盖再由发布负责人补充安全公告链接等手工内容——v11.10.1.md 中开篇的安全发布提示与 CVE 列表即为这类人工补充的典型。延伸阅读v11.10.1 发布说明原文2019 年 2 月安全发布汇总公告CVE-2019-5737 / 5739 / 1559 完整影响矩阵2018 年 11 月安全发布汇总公告CVE-2018-1212240 秒headersTimeout的引入同批发布v10.15.2LTS发布说明发布说明生成工具index.mjs、template.hbs、downloadsTable.mjs【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考