HD-2024-1408

情報露出
影響
Node.js
16.20.2 LTS
Node.js
Node.js NES
感嘆符アイコン
パッチあり
この脆弱性はHeroDevsが提供するNever-Ending Support (NES)バージョンで修正されました。

概要

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 を使っているユーザはすぐにアップグレードしてください。 

その他のリソース

脆弱性の詳細
身分証明書
HD-2024-1408
影響を受けるプロジェクト
Node.js
影響を受けるバージョン
16.20.2 LTS
発行日
2024年10月15日
≈ 確定日
2023年10月11日
で修正
重大性
低い
カテゴリー
情報露出