Modern Frontend CVEs

対象CVE: CVE-2026-84961

[高深刻度] undiciのTLS証明書検証バイパス脆弱性 (GHSA-w293-vg96-wgc3) を解説!

Node.jsのHTTPクライアントライブラリ`undici`の`BalancedPool`に、TLS証明書検証がバイパスされる高深刻度な脆弱性(GHSA-w293-vg96-wgc3 / CVE-2026-84961)が発見されました。カスタムTLS検証を利用している開発者は、速やかに対応が必要です。

はじめに:Node.js環境におけるセキュリティの重要性

近年のWeb開発において、Node.jsはバックエンド (BFF: Backend For Frontend) や様々な開発ツール、ビルドシステムで広く利用されています。フロントエンドエンジニアであっても、Node.jsのランタイムやそのエコシステムを深く理解し、セキュリティに配慮することは不可欠です。今回解説する`undici`の脆弱性も、一見するとバックエンド寄りの話に見えますが、Node.jsアプリケーション全体に影響を及ぼす可能性があります。

本記事では、Node.jsの高性能HTTPクライアントライブラリ`undici`の`BalancedPool`に存在する、TLS証明書検証バイパスの脆弱性 (GHSA-w293-vg96-wgc3 / CVE-2026-84961) について、その詳細、影響、そして対策を日本のフロントエンドエンジニア向けに分かりやすく解説します。

`undici` とは? なぜフロントエンドエンジニアも知るべきか

`undici`は、Node.js向けに開発された高性能なHTTP/1.1およびHTTP/2クライアントです。Node.js標準の`http`モジュールよりも高いパフォーマンスと柔軟性を提供し、`fetch` API互換のインターフェースも提供しているため、多くの開発者に利用されています。

フロントエンドエンジニアが直接`undici`をアプリケーションコードで利用する機会は少ないかもしれません。しかし、例えばNext.jsやNuxt.jsのようなフレームワークのサーバーサイドレンダリング (SSR) やAPIルート内で、あるいは、CI/CDツール、ローカル開発サーバーなど、間接的に`undici`が利用されている可能性は十分にあります。そのため、Node.jsエコシステム全体の健全性を保つ上で、このような基盤ライブラリのセキュリティ情報は非常に重要です。

脆弱性の詳細:`BalancedPool`におけるTLS証明書検証バイパス (GHSA-w293-vg96-wgc3)

今回報告された脆弱性 (GHSA-w293-vg96-wgc3 / CVE-2026-84961) は、深刻度が「High」と評価されています。この脆弱性は、`undici`の特定のコンポーネントである`BalancedPool`クラスに限定して発生します。

脆弱性の核心は、`BalancedPool`がそのコンストラクタオプションを、内部で`JSON.parse(JSON.stringify(...))`という方法でディープクローンしている点にあります。このJSONベースのクローンは、関数を適切に表現できないという特性を持っています。そのため、`connect`オプションや`tls`オプションを通じて渡されたカスタムの`checkServerIdentity`コールバック関数(またはカスタムコネクタ関数)が、このクローン処理の過程でサイレントに破棄されてしまうのです。

結果として、本来アプリケーション開発者が意図して設定したカスタムのTLS証明書検証ロジックがTLSレイヤーに到達せず、Node.jsのデフォルトのホスト名と証明書チェーンのチェックのみが行われることになります。これにより、カスタム検証では拒否されるべきだった証明書を持つサーバーとの接続が、意図せず確立されてしまう可能性があります。

**注意点:** `Client`、`Pool`、`Agent`、`RoundRobinPool`といった他のクラスでは、`connect`/`tls`オプションがJSONクローン処理の前に分解されるため、この脆弱性の影響を受けません。

具体的な影響と脅威:何が危険なのか?

この脆弱性が悪用された場合、最も懸念されるのは「中間者攻撃 (Man-in-the-Middle Attack)」のリスクです。攻撃者は偽のTLS証明書を提示することで、本来接続すべきではない不正なサーバーへの接続を確立させることができます。これにより、以下のような深刻な脅威が発生する可能性があります。

特に、社内システム間での通信や、機密性の高い情報をやり取りする外部APIとの連携において、カスタムのTLS検証を設定していた場合、そのセキュリティが意図せず無効化されていたことになり、重大なリスクとなります。

あなたのアプリケーションは影響を受ける?チェックポイント

以下の条件をすべて満たす場合、あなたのアプリケーションはこの脆弱性の影響を受ける可能性があります。

もし`undici`は使っているが、`BalancedPool`ではなく`Client`、`Pool`、`Agent`、`RoundRobinPool`を使用している場合、またはカスタムのTLS検証ロジックを設定していない場合は、この脆弱性の直接的な影響は受けません。しかし、後述の対策は推奨されます。

対策:速やかなバージョンアップと回避策

最も確実な対策は、脆弱性が修正された`undici`のバージョンにアップグレードすることです。

これらのバージョンでは、`BalancedPool`が`connect`および`tls`オプションをJSONクローン処理の対象外とすることで、カスタムTLS検証コールバックが正しく転送されるように修正されています。

もし何らかの理由で直ちにバージョンアップが難しい場合は、以下の回避策を検討してください。

カスタムTLS検証(`checkServerIdentity`やカスタムコネクタ)に依存する接続においては、`BalancedPool`の使用を避け、代わりに`Client`、`Pool`、または`Agent`を使用してください。これらのクラスは本脆弱性の影響を受けません。

まとめ:セキュリティは開発者の責任

今回の`undici`の脆弱性は、基盤となるライブラリの内部実装の特性が、意図しないセキュリティ上の問題を引き起こす典型的な例です。特にTLS/SSL関連の脆弱性は、通信の機密性、完全性、可用性に直結するため、非常に深刻な影響をもたらす可能性があります。

フロントエンドエンジニアの皆さんも、自身の開発環境やプロジェクトの依存関係を定期的にチェックし、利用しているライブラリのセキュリティ情報を常にキャッチアップする習慣をつけましょう。`npm audit`やGitHubのDependabotなどのツールを活用し、最新のセキュリティ情報を素早く把握し、適切な対策を講じることが、安全なアプリケーション開発には不可欠です。

Node.jsを扱う開発者として、バックエンド寄りの脆弱性にもアンテナを張り、セキュリティ意識を高く保っていきましょう。

← ブログ一覧に戻る