Modern Frontend CVEs

対象CVE: CVE-2026-101907

[解説] Axiosの脆弱性 (CVE-2026-101907): `maxRedirects: 0`がリダイレクトベースのSSRFを防げない問題

Axiosの`maxRedirects: 0`設定が`fetch`アダプター使用時に正しく機能せず、リダイレクトベースのSSRF (Server-Side Request Forgery) に繋がる可能性がある脆弱性について、日本のフロントエンドエンジニア向けに解説します。

はじめに:Axiosユーザーが知るべき重大な脆弱性

フロントエンド開発の現場で、API通信ライブラリとして広く使われているAxiosに、SSRF(Server-Side Request Forgery:サーバーサイドリクエストフォージェリ)につながる可能性のある重要な脆弱性が報告されました。この脆弱性 (GHSA-r4gj-5m52-g5wh / CVE-2026-101907) は、Axiosの`maxRedirects: 0`というリダイレクト制限設定が、特定の条件下で期待通りに機能しないことに起因します。特に、Deno、Bun、Cloudflare WorkersなどのモダンなJavaScriptランタイムや、Node.jsで明示的に`fetch`アダプターを使用している環境に影響があるため、対象となる日本のフロントエンドエンジニアの皆さんは、早急な確認と対策が求められます。

脆弱性の概要:`maxRedirects: 0`が効かない?!

Axiosでは、HTTPリクエストがリダイレクト(例: HTTP 302)を追跡する回数を制限するために`maxRedirects`オプションを提供しています。セキュリティ対策として、リダイレクトを一切許可しないことで、意図しない外部へのリクエスト発生を防ぐために`maxRedirects: 0`を設定することは一般的なプラクティスです。しかし、この脆弱性により、Axiosが内部的に`fetch`アダプターを使用している場合、この`maxRedirects: 0`の設定が完全に無視されてしまいます。

その結果、本来であればリダイレクトをブロックすべき場面で、Axiosはサイレントにリダイレクトを追跡してしまいます。これが、攻撃者が制御するリダイレクト先や、予期せぬ内部サービスへのアクセスを許してしまうSSRFの温床となる可能性があります。

技術的な詳細:なぜ`fetch`アダプターで問題が起きるのか?

問題の根源は、Axiosの`lib/adapters/fetch.js`にあります。このアダプターは、Axiosの設定オブジェクトから`maxRedirects`フィールドを読み取っていません。そのため、内部的に使用されるWeb標準の`fetch()` APIを呼び出す際に、`redirect`オプションが明示的に設定されません。

ご存知の通り、`fetch()` APIは`redirect`オプションが指定されない場合、デフォルトで`'follow'`(リダイレクトを追跡する)挙動を取ります。これにより、Axios側で`maxRedirects: 0`と設定されていても、基盤となる`fetch()` APIが勝手にリダイレクトを追跡してしまい、設定が無視されるという事態が発生します。

対照的に、AxiosのNode HTTPアダプターは、`follow-redirects`というライブラリを利用して`maxRedirects`を適切に強制するため、この問題は発生しません。このアダプター間の挙動の不一致が、開発者が意図しないセキュリティ上の落とし穴を生み出しているのです。

影響を受ける環境とアプリケーション

この脆弱性が影響を与えるのは、主にAxiosが`fetch`アダプターを使用する環境です。以下に該当する場合は注意が必要です。

<ul><li>**Deno, Bun, Cloudflare Workers**: これらのモダンなJavaScriptランタイムでは、Node.jsの`http`モジュールが利用できないため、Axiosはデフォルトで`fetch`アダプターを選択する傾向があります。</li><li>**Node.jsアプリケーション**: コード内で明示的に`axios.get(url, { adapter: 'fetch' })`のように`fetch`アダプターを指定している場合。</li><li>**カスタムアダプターリスト**: `axios.create({ adapter: ['fetch'] })`のように、カスタムのアダプターリストを設定しており、`fetch`が選択される場合。</li></ul>

特に、SSRF攻撃への防御策として`maxRedirects: 0`を設定しているアプリケーションは、その防御機能が機能していない可能性があるため、確認が必要です。

具体的な攻撃シナリオ(SSRFの可能性)

この脆弱性を悪用した攻撃は、以下のようなシナリオで発生する可能性があります。

<ol><li>**攻撃者が制御するリダイレクト元**: 攻撃者は、外部からアクセス可能なURL(例: 攻撃者が制御するサーバー、またはオープンリダイレクトの脆弱性を持つウェブサイト)を、脆弱なAxiosリクエストのターゲットとして指定します。</li><li>**内部サービスへのリダイレクト**: この外部URLは、アプリケーションが稼働しているサーバー環境からのみアクセス可能な内部URL(例: クラウドプロバイダのメタデータサービス、未認証の内部API、Redisなどのローカルサービスなど)へのリダイレクトを返します。</li><li>**サイレントなリダイレクト追跡**: 脆弱なAxiosリクエストは、`maxRedirects: 0`が設定されていても、`fetch`アダプターの挙動によりこのリダイレクトをサイレントに追跡してしまいます。</li><li>**SSRFの成功**: 結果として、アプリケーションは意図せず内部サービスにリクエストを送信し、その応答を攻撃者に渡してしまう、あるいは内部サービスの状態を変更してしまう可能性があります。これにより、機密情報の漏洩や、システムへの不正な操作につながります。</li></ol>

報告されているPoC (Proof of Concept) では、内部の秘密情報へのアクセスや、管理者設定を書き換えるような内部APIへのアクセスが成功することが実証されています。

緊急対策と推奨事項

この脆弱性に対する緊急の対策と、今後の開発における推奨事項は以下の通りです。

公式の修正バージョンがリリースされるまでは、以下のワークアラウンドを適用してください。

<ul><li>**`fetchOptions: { redirect: 'manual' }` の設定**: `fetch`アダプターを使用するAxiosリクエストで、`fetchOptions`プロパティを明示的に設定し、`redirect: 'manual'`を指定します。これにより、基盤となる`fetch()` APIがリダイレクトを自動追跡しなくなります。</li></ul>

```javascript await axios.get(targetUrl, { adapter: 'fetch', maxRedirects: 0, // これだけでは不十分 fetchOptions: { redirect: 'manual' } // これを追加! }); ```

<ul><li>**Node HTTPアダプターの使用を検討**: 環境が許すのであれば、リダイレクト制限が必要なAxiosリクエストでは、明示的にNode HTTPアダプターを使用することも有効です。`adapter: 'http'`を設定してください。</li></ul>

<ul><li>**Axiosのバージョンアップ**: 公式の修正バージョンがリリースされ次第、速やかにAxiosのライブラリを最新版にアップデートしてください。</li><li>**多層防御の導入**: `maxRedirects`設定だけに頼らず、アプリケーションレベルでの入力値検証、リクエスト先の厳格なホワイトリスト化、ファイアウォールによるネットワークアクセス制限など、複数の防御策を組み合わせる「多層防御」の考え方を取り入れましょう。</li><li>**SSRFリスクの再評価**: サーバーサイドでAxiosを使用し、外部からの入力値に基づいてリクエストを生成している場合、常に潜在的なSSRFリスクを考慮し、コードレビューやセキュリティテストを強化してください。</li></ul>

まとめ

このAxiosの脆弱性は、フロントエンド、特にサーバーサイドレンダリング(SSR)を行うNode.js環境や、Edge環境でAxiosを使用している日本のエンジニアにとって見過ごせない問題です。自身のプロジェクトで`fetch`アダプターが使用されていないか、そして`maxRedirects: 0`をSSRF対策として利用していないかを速やかに確認し、必要に応じて上記ワークアラウンドを適用してください。そして、常に最新のセキュリティ情報にアンテナを張り、公式の修正がリリースされ次第、速やかにアップデートを行うことを強く推奨します。

← ブログ一覧に戻る