Node.jsの通信部品undiciに6件の修正、他人の応答が返るおそれ

Node.js の
脆弱性の概要
- 対象
- Node.js部品
- 悪用
- 確認されていない
- 影響
- 別の利用者の応答や認証情報が漏れる
- 修正版
- 修正版あり
- 公表元
- Node.js(undici)
| 製品 | 対象のバージョン | 修正版 |
|---|---|---|
| undici 8系 | 8.0.0〜8.12.3(欠陥ごとに始まりが違う) | 8.12.4 |
| undici 7系 | 7.0.0〜7.30.1(欠陥ごとに始まりが違う) | 7.30.2 |
製品の履歴:Node.jsの脆弱性一覧公表されたらすぐ通知を受け取る
やること
undici は Node.js から Web サーバーへ通信するための部品です。Node.js 18 以降に組み込まれている fetch() も、この部品で動いています。自社のアプリが undici を使っている場合は、次の順で進めてください。
- 7系は 7.30.2、8系は 8.12.4 に上げてください
- 7.30.1、8.12.2、8.12.3 を使っている場合は、深刻度が High の欠陥が当てはまるので、先に上げてください
- 直接入れていなくても、ほかの部品を通じて入っていることがあります。
npm ls undiciで依存の中のバージョンを確かめてください
Node.js に組み込まれた undici のバージョンは process.versions.undici で確かめられます。
何が危ないのか
undici の開発チームは11月5日に 7.30.2 と 8.12.4 を公開し、6件の欠陥を直しました。npm の集計では11月2日から8日までの1週間に約3億2,670万回ダウンロードされています。
6件のうち5件は undici に後から足す処理(インターセプター)に関わります。転送先を自動でたどる redirect() と、応答を保存して使い回す cache() を、compose(redirect(), cache()) の順で組み合わせた場合が中心です。複数の利用者で共有するキャッシュを使っていると、ある利用者向けの応答が別の利用者に返るおそれがあります。
- CVE-2026-116592(CVSS 7.4、High):転送の途中で信頼できない別のサイトを経由しても、最初の URL の応答として保存されます。攻撃者は保存された内容を差し替えたり、利用者ごとの応答をほかの人に返させたりできます。10月に直した CVE-2026-109829 の修正をすり抜けるもので、対象は 7.30.1、8.12.2、8.12.3 です。
SqliteCacheStoreに保存した場合は、再起動しても差し替えた内容が残ります - CVE-2026-120474(CVSS 6.5):同じサイトの中で転送されたとき、ログイン情報付きの要求への応答が元の URL のまま保存され、別の利用者やログインしていない人に返るおそれがあります
- CVE-2026-116630(CVSS 5.9):保存した応答を使ってよいかを確かめる要求が別のサイトへ転送されたとき、そのサイトの
304 Not Modifiedを受け入れてしまいます。認証が要る応答が、後から来た利用者に返るおそれがあります - CVE-2026-120415(CVSS 5.9):要求のヘッダーを
[名前, 値]の組の配列で渡すと、別のサイトへ転送するときにAuthorizationやCookieが取り除かれず、転送先に渡るおそれがあります - CVE-2026-120222(CVSS 5.9):保存した応答を返す途中のエラーを受け止められず、Node.js のプロセスが止まるおそれがあります。悪意のある Web サーバーが狙えます
残りの1件の CVE-2026-120423(CVSS 5.9)は fetch() の欠陥です。受け取った中身が改ざんされていないかをハッシュ値で確かめる仕組み(Subresource Integrity)で、ハッシュ値の前にタブなどの空白があると確認を飛ばし、中身を受け入れます。7.15.0 で入った不具合で、7.14.0 以前は当てはまりません。
どの欠陥も攻撃にログインは要りませんが、CVSS の評価では攻撃の条件が厳しいとされています。告知とリリースノートに、悪用の記載はありません。
対象
GitHub の告知では、7系は 7.0.0 から 7.30.1、8系は 8.0.0 から 8.12.3 が対象です。影響が始まるバージョンは欠陥ごとに違います。6系は今回の告知の対象に入っていません。
インターセプターに関わる5件は、アプリが自分でその組み合わせを設定したときだけ当てはまると、告知に書かれています。送り先が1つに決まった Client や Pool を使う場合と、compose(cache(), redirect()) の順で組み合わせた場合は、当てはまらないものがあります。
README によると、Node.js 24系には undici の7系、26系には8系が組み込まれています。組み込みのバージョンが 7.15.0 以降なら、SRI の欠陥が当てはまります。Node.js の開発チームは11月11日以降に修正版を出すと予告していますが、内容は明かしていません(Node.js、11月11日に高深刻度の修正を予告、3系統が対象)。
回避策
すぐに上げられない場合について、告知には次の回避策が書かれています。
- インターセプターを
compose(cache(), redirect())の順で組み合わせる。送り先ごとに別のキャッシュを使う。転送が起きる要求では共有のキャッシュを使わない - ヘッダーは普通のオブジェクトか、
[名前, 値, 名前, 値]の平らな配列で渡す - SRI のハッシュ値の前後に空白を入れない
dumpのようにエラーを投げる処理とcache()を組み合わせない
利用者ごとに違う応答にはサーバーの側で Vary、private、no-store を付けることも勧められています。
中小企業が確かめること
委託して作った Web システムや社内ツールが Node.js で動いている場合は、undici のバージョンと、キャッシュの機能を使っているかを委託先に聞いてください。
修正版に上げると、それより前のバージョンが SqliteCacheStore に保存した内容は使われなくなります。差し替えられた内容が残っていても、更新したあとは使われません。
自社で確かめること
- undici のバージョンを調べる`npm ls undici` で依存しているバージョンを調べ、7系は 7.30.2、8系は 8.12.4 より前でないかを確かめてください。
- キャッシュの使い方を聞く転送とキャッシュの機能を組み合わせ、複数の利用者でキャッシュを共有していないかを開発の担当者に確かめてください。
- 委託先に聞く委託して作ったシステムが Node.js で動いている場合は、undici のバージョンと更新の予定を委託先に聞いてください。
出典
- GitHub「undici vulnerable to cache poisoning and cross-user disclosure via intermediate redirect hops」
- GitHub「undici vulnerable to cross-user cache disclosure via same-origin redirect」
- GitHub「undici vulnerable to cross-user information disclosure via cross-origin redirect revalidation」
- GitHub「undici vulnerable to cross-origin credential disclosure via array-of-tuples headers bypassing redirect stripping」
- GitHub「undici vulnerable to Denial of Service via unhandled exception in cache-interceptor response replay」
- GitHub「undici vulnerable to Subresource Integrity bypass via whitespace in integrity metadata」
- GitHub「Release v8.12.4 · nodejs/undici」
- GitHub「Release v7.30.2 · nodejs/undici」
- GitHub「nodejs/undici」(README)
- npm のダウンロード数の集計「undici」(2026年11月2日〜8日)



コメント 0
まだコメントはありません。