概览
Undici 是专为 Node.js 编写的高性能 HTTP/1.1 客户端,可用于替代本地库。Fetch 标准的部分内容指出,在重定向时,禁止的请求头(如 Cookie)不应传递给目标网站。5.26.2 之前的 undici 版本未能做到这一点。(请注意,对于 Node 16 而言,只有在使用 --experimental-fetch 标志时才会出现这种情况)。
该漏洞可与开放重定向漏洞结合使用,在开放重定向漏洞中,攻击者可让服务器重定向到他们控制的网站。如果 cookie 中包含敏感数据(如授权令牌),目标网站(可能由攻击者控制)就会收到敏感数据。
此问题会影响低于 5.26.2 的 undici 版本。
详细信息
模块信息
受影响的软件包:unidici
受影响的版本:>5.26.2
资源库 :https://github.com/nodejs/undici
已发布软件包:unici
软件包管理器: npm
漏洞信息
在 5.26.2 以下版本的 undici 中发现了这个低严重性漏洞。
undici 可以单独导入,也作为 Node.js 发行版的一部分。一般来说,最好将 Node.js 升级到包含固定版本库的版本,而不是只升级 undici 库。
复制步骤
- 导入有漏洞的 undici 版本,或设置包含有漏洞的 undici 版本的 Node.js 实例。
- 请使用下面的代码,该代码摘自针对该漏洞的测试,并包含在修复程序中:
'use strict'
const { test } = require('tap')
const { createServer } = require('http')
const { once } = require('events')
const { fetch } = require('../..')
test('Cross-origin redirects clear forbidden headers', async (t) => {
t.plan(5)
const server1 = createServer((req, res) => {
t.equal(req.headers.cookie, undefined)
t.equal(req.headers.authorization, undefined)
res.end('redirected')
}).listen(0)
const server2 = createServer((req, res) => {
t.equal(req.headers.authorization, 'test')
t.equal(req.headers.cookie, 'ddd=dddd')
res.writeHead(302, {
...req.headers,
Location: `http://localhost:${server1.address().port}`
})
res.end()
}).listen(0)
t.teardown(() => {
server1.close()
server2.close()
})
await Promise.all([
once(server1, 'listening'),
once(server2, 'listening')
])
const res = await fetch(`http://localhost:${server2.address().port}`, {
headers: {
Authorization: 'test',
Cookie: 'ddd=dddd'
}
})
const text = await res.text()
t.equal(text, 'redirected')
})
- 请注意,下面几行断言特定标头未定义:
t.equal(req.headers.cookie、 未定义)
t.equal(req.headers.authorization、 未定义)
- 在有漏洞的系统上,这些断言会失败,因为服务器 1 会收到授权和 Cookie 标头。
没有变通办法。
缓解
undici 是 Node 16(除原生 HTTP 库外)新增的一个流行库。所有使用实验性 fetch 的用户都应立即升级。
其他资源
- NIST 条目
https://nvd.nist.gov/vuln/detail/CVE-2023-45143 - https://github.com/advisories/GHSA-wqq4-5wpv-mx2g
漏洞详情
身份证
HD-2024-1408
受影响的项目
Node.js
受影响的版本
16.20.2 LTS
出版日期
2024 年 10 月 15 日
≈ 固定日期
2023 年 10 月 11 日
固定在
严重性
低
类别
信息披露
注册提醒
每当我们支持的开源软件修复了新的漏洞,我们就会发出警报。