[緊急速報] Axiosのfetchアダプターに「サービス停止」を招く高深刻度脆弱性 (GHSA-777c-7fjr-54vf)
はじめに:Axiosの高深刻度脆弱性について
日本のフロントエンドエンジニアの皆さん、こんにちは!今回は、皆さんも日頃から利用されているであろうHTTPクライアントライブラリ「Axios」に報告された高深刻度脆弱性(GHSA-777c-7fjr-54vf / CVE-2026-44488)について解説します。この脆弱性は、Axiosが提供する`fetch`アダプターの利用時に、設定されたリクエスト・レスポンスのサイズ制限が正しく機能しないというものです。特にNode.js環境で使用している場合、サーバーのメモリ枯渇などによってサービスが利用できなくなる重大なリスクを抱えています。
脆弱性の概要と、なぜフロントエンドエンジニアも知るべきか?
この脆弱性は、Axiosのバージョン1.7.0から1.15.xにおいて、`fetch`アダプターを使用する際に`maxContentLength`や`maxBodyLength`といったサイズ制限が無視されてしまうという問題です。開発者が明示的にサイズ制限を設定していても、意図したよりもはるかに大きなデータが送受信されてしまい、これがサービスの可用性に影響を与えます。
「フロントエンドがブラウザでAxiosを使っているだけなら関係ないのでは?」と感じるかもしれません。確かに、ブラウザ環境では通常、ブラウザ自身のプロセスやメモリ管理によって影響が限定的です。しかし、次のようなケースでは、フロントエンドエンジニアもこの脆弱性について深く理解しておく必要があります。
1. **Node.js環境でのBFF (Backend For Frontend) やSSR (Server-Side Rendering) を担当している場合**: 皆さんがNode.jsを使ってBFFやSSRのレイヤーを構築しており、そこでAxiosを利用している場合は、直接この脆弱性の影響を受けます。サーバーサイドでAxiosを使って外部APIと通信している場合、大量のレスポンスを受信するとメモリが枯渇し、アプリケーションがクラッシュする可能性があります。
2. **バックエンドチームとの連携**: フロントエンドとバックエンドが密接に連携する現代の開発において、セキュリティに関する知識はチーム全体の生産性と信頼性を高めます。バックエンドチームがAxiosを利用している場合に、この脆弱性について適切な議論ができ、セキュリティリスクを早期に発見・軽減できることは、フロントエンドエンジニアにとっても重要なスキルです。
3. **今後のプロジェクトでの選択**: Axiosのバージョン選定やアダプター設定を行う際に、この脆弱性の知識が適切な判断材料となります。
具体的な脆弱性の内容と発生条件
この脆弱性は以下の条件が揃った場合に発生します。
1. **影響バージョン**: Axios 1.7.0 から 1.15.x を使用している場合。
2. **`fetch`アダプターの利用**: Axiosの設定で`adapter: 'fetch'`を明示的に指定しているか、複数のアダプターを指定していて`fetch`が選択される場合、またはXHRやHTTPアダプターが利用できない環境でAxiosが`fetch`にフォールバックする場合。
3. **サイズ制限の設定**: `maxContentLength`や`maxBodyLength`をデフォルトの無制限(`-1`)以外に設定している場合。
特にNode.js環境でこれらの条件が満たされると、悪意のある、あるいは単に誤った大量データのリクエスト/レスポンスによって、サーバーのCPUやメモリリソースが枯渇し、最終的にサービスダウンにつながる可能性があります。
技術的な詳細:何が修正されたのか?
脆弱なバージョンでは、Axiosの`lib/adapters/fetch.js`内のコードが、リクエスト設定から`maxContentLength`や`maxBodyLength`を正しく取得・利用していませんでした。そのため、`fetch()`がこれらのサイズ制限をチェックせずにリクエストを送信し、レスポンスの処理(`text()`, `arrayBuffer()`, `blob()`など)も制限を無視して行われていました。
修正コミット`e5540dc`では、この問題に対処するため、`lib/adapters/fetch.js`に以下のロジックが追加されました。
- `data:` URLのデコードサイズチェック
- 送信ボディサイズチェック
- `Content-Length`ヘッダーによるレスポンスの事前チェック
- ストリーミングレスポンスに対する強制的なサイズ制限の適用
これにより、開発者が設定したサイズ制限が正しく適用され、想定外の大量データ送受信を防ぐことができるようになりました。
推奨される対策
皆さんのプロジェクトでAxiosを使用している場合、以下の対策を検討してください。
1. **Axiosのアップデート**: 最も推奨される対策は、この脆弱性が修正された最新のAxiosバージョンにアップデートすることです。セキュリティ修正だけでなく、パフォーマンス改善や新機能も含まれている可能性が高いため、定期的なアップデートは常に検討すべきです。
2. **アダプターの切り替え(サーバーサイド)**: サーバーサイド(Node.js)でAxiosを使用しており、サイズ制限がセキュリティ上極めて重要である場合は、明示的にNode.jsの`http`アダプターを使用するように設定してください。これは、`fetch`アダプターの問題であるため、ネイティブの`http`アダプターを使用することでリスクを回避できます。
```javascript
import axios from 'axios';
// Node.js環境の場合
const instance = axios.create({
adapter: require('axios/lib/adapters/http')
});
```
3. **入力値の厳格な検証**: ユーザーや外部から制御されるリクエストボディは、Axiosに渡す前にアプリケーション側でサイズを検証し、制限を超える場合は拒否するようにしてください。これは多層防御の観点からも非常に重要です。
4. **URLスキームの制限**: 攻撃者によって制御されうるURLスキーム、特に`data:`URLについては、厳格な許可リスト方式で検証するか、受け入れを拒否することを検討してください。これは、リクエスト元やデータ形式を制限することで、潜在的な攻撃経路を塞ぐことにつながります。
まとめ
このAxiosの脆弱性は、特にNode.js環境におけるサーバーの可用性に深刻な影響を与える可能性があります。フロントエンドエンジニアの皆さんも、自身が関わるNode.js環境(BFFやSSRなど)でのAxiosの利用状況を確認し、推奨される対策を講じることを強くお勧めします。常に使用しているライブラリのセキュリティ情報をチェックし、迅速に対応できる体制を整えることが、安全なアプリケーション開発には不可欠です。