概要
UndiciはNode.jsのために書かれた高性能なHTTP/1.1クライアントで、ネイティブライブラリの代わりに使うことができる。Fetch Standardの一部では、クッキーのような禁止されているリクエストヘッダは、リダイレクト時にターゲットサイトに渡してはいけないとされています。5.26.2より前のバージョンのundiciは、これを実行できませんでした。(Node16では、これは--experimental-fetchフラグが使われたときだけの懸念であることに注意してください)。
この脆弱性は、攻撃者がサーバを自分の制御するサイトにリダイレクトさせる Open Redirect 攻撃と組み合わされる可能性があります。認証トークンのような機密データがクッキーに含まれている場合、(攻撃者が制御しているかもしれない)宛先サイトは機密データを受け取ります。
この問題はundiciの5.26.2未満のバージョンに影響します。
詳細
モジュール情報
影響を受けるパッケージ:unidici
影響を受けるバージョン:>5.26.2
リポジトリ : https://github.com/nodejs/undici
公開パッケージ:unici
パッケージマネージャ: npm
脆弱性情報
この深刻度の低い脆弱性は、5.26.2より低いバージョンのundiciで発見されている。
undici は単独でインポートすることもできますし、Node.js のディストリビューションの一部として含まれています。一般的に、undici ライブラリだけをアップグレードするよりも、固定バージョンのライブラリを含むバージョンに Node.js をアップグレードするのがベストです。
再現の手順
- 脆弱なバージョンの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、 未定義)
- 脆弱なシステムでは、Server1 が Authorization ヘッダと Cookie ヘッダを受け取るので、これらのアサーションは失敗する。
回避策はない。
緩和
undici は Node 16 で追加された人気のあるライブラリです(ネイティブ HTTP ライブラリに加えて)。実験的な fetch を使っているユーザはすぐにアップグレードしてください。
その他のリソース
- NISTエントリー
https://nvd.nist.gov/vuln/detail/CVE-2023-45143 - https://github.com/advisories/GHSA-wqq4-5wpv-mx2g
弊社がサポートするオープンソースソフトウェアに新たな脆弱性が修正された場合、いつでもアラートを受け取ることができます。