[速報] AxiosのHTTP/2アダプター脆弱性 (CVE-2026-101898) とSSRFリスクを解説
はじめに:Node.js版Axiosに潜むSSRFのリスク
日本のフロントエンドエンジニアの皆さん、こんにちは。最近、Node.js環境で広く利用されているHTTPクライアント「Axios」に、重要な脆弱性(CVE-2026-101898, GHSA-3pq3-5fj3-cg6v)が発見されました。この脆弱性は、特にサーバーサイド(BFFなど)でAxiosを使用し、HTTP/2通信を行っている場合に、サーバーサイド・リクエスト・フォージェリ(SSRF)のリスクをもたらす可能性があります。
脆弱性の概要:なぜDNS・プロキシ設定が無視されるのか?
本脆弱性は、AxiosのNode.js HTTP/2アダプターが、開発者が意図して設定したDNSルックアップ機能(`config.lookup`)やプロキシ制御(`config.proxy`)を正しく適用しないことに起因します。通常、これらの設定は、アプリケーションが外部リソースにアクセスする際のセキュリティポリシー(例えば、特定のIPアドレスへのアクセス禁止、内部ネットワークへの直接接続防止など)を強制するために利用されます。しかし、HTTP/2を利用するリクエストでは、これらの重要なセキュリティ制御がバイパスされ、Axiosが直接ターゲットのホストに接続してしまう問題が発生します。
技術的詳細:HTTP/1とHTTP/2アダプターの違い
AxiosのNode.jsアダプター(`lib/adapters/http.js`)では、HTTP/1リクエストの場合、`config.lookup`をラップし、リクエストオプションに設定し、`setProxy()`を通じてプロキシルーティングを適用します。これにより、開発者が設定したDNSポリシーやプロキシ設定が尊重されます。
しかし、HTTP/2リクエストの場合、処理は`http2Transport`に渡されます。このトランスポートは、`http2.connect()`を呼び出してHTTP/2セッションを確立しますが、この際に渡されるオプションは`options.http2Options`のみです。結果として、トップレベルの`lookup`関数やプロキシエージェントといった重要なセキュリティ関連の設定が`http2.connect()`に引き継がれず、システムデフォルトのDNS解決やプロキシを介さない直接接続が行われてしまいます。
具体的なコードの流れを見ると、`http2Sessions.getSession`が最終的に`http2.connect(authority, options)`を呼び出す際、`options`オブジェクトには`http2Options`しか含まれていません。このため、設定されたDNSルックアップやプロキシ設定が完全に無視されてしまうのです。
想定される影響とリスク
この脆弱性により、Node.jsベースのバックエンドアプリケーション(特にBFFやAPIゲートウェイなど)が、次のようなリスクにさらされる可能性があります。
<ul><li><b>SSRF (Server-Side Request Forgery)</b>: ユーザーからの入力に基づいてURLを構築し、Axiosで外部リソースにアクセスするようなアプリケーションの場合、攻撃者は意図的に内部ネットワークのアドレス(例: `127.0.0.1`やプライベートIPアドレス)をAxiosにアクセスさせることができます。これにより、クラウドプロバイダーのメタデータAPI(AWS EC2のIMDSなど)や、他の内部サービス、データベースなどにアクセスされる危険性があります。</li><li><b>ネットワークポリシーのバイパス</b>: 組織のセキュリティポリシーとして、特定のドメインへのアクセス禁止や、全ての外部通信をプロキシ経由で行うことが義務付けられている場合でも、本脆弱性によりそれらのポリシーが破られる可能性があります。</li></ul>
ただし、全てのAxios利用環境でSSRFが発生するわけではありません。この脆弱性は、以下の条件が揃った場合に影響を受けます。
<ul><li>Node.js環境でAxiosを使用している。</li><li>Axiosのリクエストに`httpVersion: 2`を設定している。</li><li>ユーザーからの入力によってリクエストの宛先URLが影響を受ける可能性がある。</li><li>SSRF対策として`config.lookup`や`config.proxy`に依存している。</li></ul>
影響を受けるバージョンと機能
以下の条件に該当する場合、影響を受ける可能性があります。
<ul><li>Node.js HTTPアダプターで`httpVersion: 2`を使用している場合。</li><li>`config.lookup`をDNSポリシーとして提供している場合。</li><li>明示的な`config.proxy`設定、または環境変数から派生したプロキシ設定をHTTPS HTTP/2リクエストに対して使用している場合。</li></ul>
以下の場合は影響を受けません。
<ul><li>ブラウザアダプターを使用している場合。</li><li>Node.js HTTP/1リクエスト(`lookup`はトランスポートに渡され、プロキシ処理も適用されます)。</li><li>Axiosを呼び出す前に、アプリケーション側で宛先ホストの検証を独自に行っている場合。</li></ul>
今すぐできる対策と回避策
この脆弱性に対する根本的な修正はAxiosの将来のバージョンアップで提供される予定ですが、現時点では以下の回避策を検討してください。
<ol><li><b>HTTP/1アダプターの使用</b>: `config.lookup`やプロキシ制御に依存するリクエストでは、明示的に`httpVersion: 1`(または設定しないことでデフォルトのHTTP/1)を使用してください。これにより、これらのセキュリティ制御が正しく適用されます。</li><li><b>アプリケーションレベルでのURL検証</b>: Axiosを呼び出す前に、リクエスト先のURLがアプリケーションのセキュリティポリシーに準拠しているかを厳密に検証してください。これは、常に推奨されるセキュリティプラクティスであり、本脆弱性だけでなく、将来的なSSRFリスク全般に対する強力な防御策となります。具体的には、許可されたドメインリスト(ホワイトリスト)に基づく検証や、予約済みIPアドレスへのアクセス制限などです。</li></ol>
まとめ
Node.js版AxiosのHTTP/2アダプターにおけるDNS/プロキシ設定バイパスの脆弱性は、BFFなどサーバーサイドを構築する日本のフロントエンドエンジニアにとって見過ごせない問題です。特にSSRFは、内部システムへの不正アクセスや情報漏洩に直結する深刻なリスクをはらんでいます。
重要なのは、Axiosの機能に全てを委ねるのではなく、アプリケーションのロジック層でセキュリティポリシーを強制することです。最新の脆弱性情報に常に注意を払い、安全な設計と実装を心がけましょう。