概览
多个 Node.js 版本的 http 模块中的 llhttp 解析器没有严格使用 CRLF 序列来分隔 HTTP 请求,这可能导致 HTTP 请求走私 (HRS)。
HTTP 请求走私干扰了 HTTP 服务器对请求的正常执行。该漏洞可能造成的后果包括允许未经授权访问系统、允许攻击者修改数据(数据库、用户账户和其他记录)、会话劫持、信息泄露、缓存中毒和拒绝服务。
此问题会影响以下版本的 Node.js:16.0.0 至(但不包括)16.20.1、18.0.0 至(但不包括)18.16.1 和 20.0.0 至(但不包括)20.3.1
详细信息
模块信息
受影响软件包: llhttp
受影响的 Node.js 版本: 14 LTS
存储库: https://github.com/nodejs/node
已发布软件包:节点
软件包管理器:npm
漏洞信息
在许多版本的 llhttp 库中都发现了这个高严重性漏洞。尽管 RFC7230 第 3 节指出,每个报头字段只能用 CRLF 序列定界,但该库的易受攻击版本只允许用 CR 字符(不含 LF)来定界 HTTP 报头字段。
由于该库与 Node.js 捆绑在一起,因此 v16、v18 和 v20 分支中的许多 Node.js 版本都会受到影响。
没有解决方法。
复制步骤
- 在服务器上安装有漏洞的 Node 版本。
- 制作一个 HTTP 请求,它不使用 \r\n (CRLF),而只使用 \r (CR) 来结束头部字段。在下面的示例中,第一个请求仅以 \r 结尾,这可能会导致第二个请求被走私(隐藏到网络服务器的某些层,或被某些层误解)。第二个请求是正确形成的,因为它正确地以 \r\n 结尾。
POST / HTTP/1.1
主机:example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11\r
Cookie: session=abc123\r
\r
data=payload1
POST /secret HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
\r\n
data=payload2
没有变通办法。
缓解
所有用户都应升级到无此漏洞的 Node 版本。
其他资源
- NIST 入口
https://nvd.nist.gov/vuln/detail/CVE-2023-30589 - https://github.com/advisories/GHSA-cggh-pq45-6h9x
漏洞详情
身份证
HD-2024-1407
受影响的项目
Node.js
受影响的版本
4.21.3 LTS
出版日期
2024 年 10 月 16 日
≈ 固定日期
2024 年 6 月 30 日
固定在
严重性
高
类别
HTTP 请求走私
注册提醒
每当我们支持的开源软件修复了新的漏洞,我们就会发出警报。