Modern Frontend CVEs

対象CVE: CVE-2026-101906

[解説] Axiosにおける深刻なReDoS脆弱性 (CVE-2026-101906) とその対策

Node.js環境で広く使われているHTTPクライアントライブラリAxiosにおいて、悪意のあるリダイレクトによってサービス停止を引き起こす可能性のあるReDoS(正規表現DoS)脆弱性(GHSA-mghh-pgcx-3jjj)が発見されました。日本のフロントエンドエンジニアが知っておくべき技術的な詳細と、今すぐできる対策について解説します。

はじめに:AxiosとReDoS脆弱性

皆さんのプロダクトでHTTPリクエストを扱う際、Axiosは非常に馴染み深いライブラリではないでしょうか。特にNode.js環境では、その使いやすさから多くのバックエンドAPI連携やサーバーサイドレンダリング(SSR)などで活用されています。

今回ご紹介する脆弱性「GHSA-mghh-pgcx-3jjj / CVE-2026-101906」は、そのAxiosのNode.jsアダプターに存在する、深刻度HighのReDoS(Regular Expression Denial of Service)に関するものです。悪意のあるサーバーからの巧妙なリダイレクトによって、皆さんのNode.jsアプリケーションが長時間ブロックされ、サービス停止に陥る可能性があります。フロントエンドエンジニアも、サーバーサイドとの連携やSSRなどでAxiosを使用している場合、無関係ではありません。この脆弱性の詳細と、適切な対策について理解を深めましょう。

脆弱性の概要:ReDoSによるサービス停止の危機

この脆弱性は、AxiosがNode.js環境でプロキシ設定を利用している際に発生します。具体的には、Axiosの内部でプロキシをバイパスするかどうかを判定する `shouldBypassProxy()` 関数におけるホスト名正規化処理に問題があります。

悪意のあるサーバーが、特定の形式で細工されたホスト名を含む `Location` ヘッダー(例: `http://..........a/` のように、多数のドットとそれに続く文字からなるホスト名)をリダイレクト応答として返した場合、Axiosがそのホスト名を処理する際に正規表現の非効率な処理が実行されます。これにより、Node.jsのイベントループが長時間ブロックされ、その間アプリケーションは他のリクエストを処理できなくなり、結果としてサービス拒否(DoS)の状態に陥ります。

この脆弱性は、リクエストデータの漏洩や改ざんには繋がりませんが、アプリケーションの可用性に対して深刻な影響を与える可能性があります。

技術的詳細:正規表現の「カタストロフィックバックトラッキング」

問題の根源は、`lib/helpers/shouldBypassProxy.js` ファイル内の以下のコードにあります。

`return unmapIPv4MappedIPv6(hostname.replace(/\.+$/, ''));`

ここで使われている正規表現 `/\.+$/` は、「文字列の末尾にある一つ以上のドット(.)にマッチする」という意味です。一見するとシンプルな正規表現ですが、`....a` のように、多数のドットの後にドット以外の文字が続くホスト名に対して適用された場合、正規表現エンジンが「カタストロフィックバックトラッキング」と呼ばれる現象を引き起こします。

具体的には、`$`(文字列の末尾)アンカーが存在するため、正規表現エンジンは「ドットの並びが文字列の末尾にマッチするか」を様々な位置から繰り返し試行します。しかし、末尾にドット以外の文字があるため、最終的にマッチは失敗します。この失敗に至るまでの試行回数が、ドットの数に対して二次関数的に(O(N^2))増加してしまうのです。

公式の検証では、6000個のドットを含むホスト名で約34.5ミリ秒、40000個のドットでは約2.5秒ものCPU時間を消費したと報告されています。Node.jsはシングルスレッドでイベントループを回しているため、このような同期処理が長時間実行されると、その間はイベントループが完全にブロックされ、他の全ての処理が停止してしまいます。これにより、Webサーバーであれば他のリクエストに応答できなくなり、サービス停止に至るわけです。

影響を受ける環境と条件

この脆弱性の影響を受けるのは、以下の全ての条件を満たす環境です。

<ul><li><b>Node.js環境でのAxios使用:</b> ブラウザ環境のAxiosアダプターは影響を受けません。</li><li><b>環境変数によるプロキシ設定:</b> <code>HTTP_PROXY</code> または <code>HTTPS_PROXY</code> 環境変数が設定されている必要があります。</li><li><b><code>NO_PROXY</code> が設定されている:</b> プロキシをバイパスするホストを指定するための <code>NO_PROXY</code> 環境変数が、空ではない値で設定されている必要があります。</li><li><b>リダイレクトを自動的に追跡する:</b> Axiosのデフォルト設定(<code>maxRedirects: 5</code> など)でリダイレクトが有効になっている必要があります。<code>maxRedirects: 0</code> の場合は影響を受けませんが、アプリケーションコードで手動でリダイレクトを追跡している場合は注意が必要です。</li></ul>

これらの条件が重なることで、悪意のあるリダイレクトが効果を発揮し、Node.jsプロセスの可用性が脅かされます。

今すぐできる対策

Axiosの公式パッチが提供され次第、<b>最新バージョンへのアップデートが最も推奨される根本的な対策</b>となります。しかし、それまでの間、あるいはすぐにアップデートが難しい場合のために、いくつかの軽減策を講じることができます。

<ul><li><b>自動リダイレクトの無効化:</b> 信頼できないサーバーへのリクエストを送信する際、Axiosの<code>maxRedirects</code>オプションを<code>0</code>に設定し、自動リダイレクトを無効にしてください。これにより、悪意のある<code>Location</code>ヘッダーを処理する機会を減らすことができます。<pre><code class="language-js">axios.get('https://untrusted-server.com/data', { maxRedirects: 0 });</code></pre></li><li><b><code>proxy: false</code> の利用:</b> 特定の(またはすべての)リクエストに対してプロキシを使用しない場合は、<code>proxy: false</code> オプションを設定することで、この脆弱性の経路を回避できます。<pre><code class="language-js">axios.get('https://example.com/api', { proxy: false });</code></pre></li><li><b><code>NO_PROXY</code> 環境設定の見直し:</b> 可能であれば、<code>NO_PROXY</code> 環境変数の使用を避けたり、その値を厳格に管理したりすることも検討してください。不要な設定は削除することで、攻撃対象を減らせます。</li><li><b>イベントループの監視:</b> Node.jsアプリケーションのイベントループが長時間ブロックされていないかを監視し、異常を検知できるようにしておくことも重要です。</li></ul>

これらの対策はあくまで一時的なものであり、脆弱性の根本的な解決には公式パッチの適用が不可欠であることを忘れないでください。

まとめ

AxiosにおけるReDoS脆弱性 (GHSA-mghh-pgcx-3jjj / CVE-2026-101906) は、Node.jsアプリケーションの可用性に直接影響を及ぼす、非常に深刻な問題です。特に、環境変数でプロキシと `NO_PROXY` を利用し、リダイレクトを許可している環境では、早急な対策が求められます。

フロントエンドエンジニアの皆さんにとって、普段意識しないNode.jsの内部的な挙動や正規表現のパフォーマンス問題が、アプリケーション全体に甚大な影響を与える可能性があることを理解し、日頃から利用ライブラリの脆弱性情報にアンテナを張っておくことの重要性を再認識する機会となるでしょう。常に最新の情報をキャッチアップし、安全なアプリケーション開発を心がけましょう。

← ブログ一覧に戻る