Modern Frontend CVEs

対象CVE: CVE-2026-101909

[緊急解説] AxiosのPrototype Pollution脆弱性 (CVE-2026-101909) とフロントエンドへの影響

Axiosにおけるフォームデータシリアライゼーション機能にPrototype Pollutionガジェットが存在し、既存のPrototype Pollutionが悪用された場合に、データ漏洩、サービス停止、データ破損のリスクがあることを日本のフロントエンドエンジニア向けに解説します。

はじめに

Axiosは、ReactやVue.jsといったJavaScriptフレームワークを利用したフロントエンド開発で広く利用されているHTTPクライアントです。そのAxiosにおいて、フォームデータシリアライゼーションに関するPrototype Pollutionの脆弱性 (GHSA-x97p-jq2g-jp4f / CVE-2026-101909) が公開されました。この脆弱性は、Axios自体がPrototype Pollutionの発生源となるわけではありませんが、既にアプリケーション内にPrototype Pollutionを引き起こす要因がある場合に、深刻な影響をもたらす可能性があります。

脆弱性の概要 (CVE-2026-101909)

この脆弱性は、Axiosのフォームデータシリアライゼーション機能(特に`axios.toFormData()`)において、既存のPrototype Pollutionが悪用される「読み取り側ガジェット」として機能します。Axios自体がPrototype Pollutionを直接引き起こすわけではありませんが、他のライブラリやアプリケーションコードで`Object.prototype`が汚染されている場合に、Axiosが意図しない挙動を引き起こす可能性があります。

影響を受けるのは、`axios.toFormData()`、`multipart/form-data`としてプレーンオブジェクトをシリアライズする`transformRequest`パス、およびURLエンコードされたフォームシリアライゼーションパスです。JSONリクエストボディや`toFormData()`を呼び出さないリクエストは影響を受けません。

Prototype Pollutionとは? (基礎知識のおさらい)

Prototype Pollutionは、JavaScriptのオブジェクトのプロトタイプチェーンを悪用して、`Object.prototype`に新しいプロパティを追加したり、既存のプロパティを変更したりできる脆弱性です。これにより、アプリケーション内の全てのオブジェクトが影響を受け、予期せぬ動作やセキュリティ上の問題を引き起こす可能性があります。フロントエンドでは、ユーザー入力の処理、データのディープマージ、一部のライブラリの内部動作などで意図せず発生するケースがあります。

具体的な影響

`Object.prototype.visitor`が汚染された場合、フォームデータとして送信されるあらゆる値(ユーザー名、パスワード、セッション情報、個人情報など)が、シリアライズ処理中に攻撃者が仕込んだ関数によって傍受され、外部に送信される可能性があります。この攻撃はリクエストの成功を妨げず、サーバー側にも異常が見られないため、非常に検知が困難です。

`Object.prototype.maxDepth`が汚染され、例えば`1`や`2`のような小さな値に設定された場合、ネストされたオブジェクトを含むフォームデータ(例: `profile[name]`, `address[city]`)を送信しようとすると、`ERR_FORM_DATA_DEPTH_EXCEEDED`エラーが発生し、リクエストが失敗します。これにより、該当する機能が利用できなくなり、サービスレベルでの可用性に影響を与える可能性があります。

`Object.prototype.dots`、`indexes`、`metaTokens`といったオプションが汚染されると、フォームフィールド名のシリアライゼーション形式が変更されます。例えば、`dots: true`に汚染されると、本来ブラケット表記(`user[name]`)で送られるべきフィールドがドット表記(`user.name`)で送られ、サーバー側で正しくデータがパースされず、意図しないデータ破損やロジックの誤動作につながる可能性があります。

技術的な詳細

問題は、`lib/helpers/toFormData.js`内でフォームシリアライゼーションのオプションが処理される際に発生します。`formSerializer`オプションが指定されない場合、内部でデフォルトのオプションオブジェクトが生成されますが、このオブジェクトは`Object.prototype`を継承しています。Axiosは、このオプションオブジェクトから`visitor`、`maxDepth`、`dots`などのプロパティを`hasOwnProperty`チェックなしで直接読み込んでしまうため、`Object.prototype`に汚染されたプロパティが存在すると、それが継承されてしまい、Axiosの動作を意図せず変更してしまうのです。

対策と緩和策

この脆弱性はAxiosが非常に広く使われているため、フロントエンド開発者にとって特に注意が必要です。執筆時点(CVE-2026-101909の公開時点)では、Axiosの修正バージョンはまだリリースされていません。以下の対策と緩和策を検討してください。

最も直接的な緩和策は、フォームデータを送信する際に`formSerializer`オプションを明示的に設定し、影響を受ける可能性のあるすべてのキーに安全な値を指定することです。これにより、`Object.prototype`から継承されることを防ぎます。

例:

```javascript import axios from 'axios'; const safeFormSerializer = { visitor: undefined, // デフォルトのvisitorを使う maxDepth: 5, // デフォルト値 (例: 5) dots: false, // デフォルト値 indexes: false, // デフォルト値 metaTokens: true, // デフォルト値 Blob: undefined // デフォルトのBlobを使う }; axios.post(url, data, { headers: { 'Content-Type': 'multipart/form-data' }, formSerializer: safeFormSerializer }); ```

Axiosの脆弱性は「読み取り側」であるため、根本的な対策としては、アプリケーションや依存ライブラリ内でPrototype Pollutionを引き起こしている原因を特定し、修正することが重要です。以下の点に注意してください。 - **依存ライブラリの更新**: 古い、または脆弱性を含む依存ライブラリがないか確認し、常に最新の安定版を使用してください。 - **ユーザー入力の検証とサニタイズ**: 信頼できないソースからのデータ(JSONパース、クエリパラメータなど)をオブジェクトのプロパティキーとして使用する際は、厳格な検証とサニタイズを徹底してください。 - **`Object.create(null)`の活用**: プロトタイプチェーンを持たないオブジェクトが必要な場合は、`{}`ではなく`Object.create(null)`を使用する習慣をつけましょう。

アプリケーションのエントリーポイントで`Object.freeze(Object.prototype)`を実行することで、`Object.prototype`へのプロパティ追加や変更を不可能にし、Prototype Pollution自体を根本的に防ぐことができます。ただし、これは一部の古いライブラリや特定のケースで互換性の問題を引き起こす可能性もあるため、十分なテストが必要です。

まとめ

AxiosのPrototype Pollution脆弱性 (CVE-2026-101909) は、既存のPrototype Pollutionが存在する環境下で、データ漏洩、サービス停止、データ破損といった深刻な影響を引き起こす可能性があります。Axios自体の修正バージョンがリリースされるまでの間、`formSerializer`オプションの明示的な設定、およびアプリケーション全体でのPrototype Pollution対策を徹底することが重要です。定期的なセキュリティスキャンと依存ライブラリのアップデートを怠らず、安全なフロントエンド開発を心がけましょう。

← ブログ一覧に戻る