[緊急解説] Axiosの深刻なプロトタイプ汚染脆弱性 (CVE-2026-42033) とその対策
はじめに:Axiosユーザー必見の深刻な脆弱性
日常的にAxiosを利用している日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、皆さんが開発するWebアプリケーションに大きな影響を与える可能性のある、Axiosの深刻な脆弱性について解説します。
GHSA-pf86-5x62-jrwfとして識別され、CVE-2026-42033が割り当てられたこの脆弱性は、Axios自体がプロトタイプ汚染を引き起こすわけではないものの、他のライブラリによってプロトタイプ汚染が発生している環境下で悪用されることで、情報漏洩や不正操作につながる危険性があります。特にNode.js環境での利用が危険視されています。
脆弱性の概要:Axiosが「悪用の舞台」となるメカニズム
この脆弱性は、Axiosが設定プロパティを読み込む際に、`hasOwnProperty`チェックを適切に行わないことに起因します。もしアプリケーション内でLodash (特にバージョン4.17.21未満) など、`Object.prototype`を汚染する既知の脆弱性を持つライブラリが使用されている場合、攻撃者はその汚染されたプロパティをAxiosに読み込ませることが可能になります。
具体的には、Axiosの各リクエストは`mergeConfig`関数を通じて設定オブジェクトを構築します。この際、空の`{}`オブジェクトが作成され、これは`Object.prototype`を継承します。`mergeConfig`はデフォルト設定とリクエストごとの設定をマージする際に、`Object.keys()`で自身のプロパティのみを反復処理しますが、後で特定のプロパティが読み込まれる際、それが「自身のプロパティ」として存在しない場合、プロトタイプチェーンを辿って`Object.prototype`上の汚染された値が利用されてしまうのです。
プロトタイプ汚染とは?基本的な考え方
プロトタイプ汚染(Prototype Pollution)とは、JavaScriptオブジェクトのプロトタイプチェーン、特に`Object.prototype`に意図しないプロパティを追加または変更できてしまう脆弱性です。これにより、アプリケーション内のほとんど全てのオブジェクトにその汚染されたプロパティが継承され、予期せぬ動作やセキュリティ上の問題を引き起こす可能性があります。
例えば、攻撃者が巧妙なペイロードを使って`Object.prototype.isAdmin = true`をセットした場合、`isAdmin`プロパティを持たない全てのオブジェクトが「管理者」であるかのように振る舞い、権限昇格などの問題を引き起こす可能性があります。
実際の攻撃シナリオ:データ窃取からHTTPリクエスト乗っ取りまで
この脆弱性を悪用することで、攻撃者は主に以下の2つの強力な「ガジェット」(攻撃を可能にする特定のコードパス)を通じて、アプリケーションを操作できます。
AxiosはデフォルトでJSONレスポンスを`JSON.parse(data, this.parseReviver)`でパースします。`parseReviver`は通常、Axiosの設定には存在しないため、プロトタイプチェーン上の`Object.prototype.parseReviver`が参照されます。
攻撃者が事前に`Object.prototype.parseReviver`を不正な関数で汚染した場合、全てのJSONレスポンスがその関数を介して処理されます。これにより、攻撃者はレスポンス内の機密情報(ユーザー名、トークン、残高など)を密かに窃取したり、ロール(例: `user`を`admin`に)や数値(例: 残高を999999に)などを不正に改ざんしたりすることが可能になります。アプリケーション側は改ざんに気づかず、正常なレスポンスとして処理してしまいます。
Node.js環境のHTTPアダプターでは、`config.transport`プロパティが存在する場合、その値がHTTPリクエストの送信に使用されます。`transport`もAxiosのデフォルト設定には存在しないため、プロトタイプチェーン上の`Object.prototype.transport`が参照されます。
攻撃者が`Object.prototype.transport`を不正なトランスポートオブジェクトで汚染した場合、アプリケーションからの全てのHTTPリクエストが、攻撃者が制御するプロキシなどを経由して送信されるようになります。これにより、リクエストのターゲットURL、認証情報(`username:password`形式)、HTTPヘッダー、リクエストボディなどの機密情報が完全に傍受・記録され、リクエスト自体も改ざんされる危険性があります。アプリケーションからはリクエストが正常に完了したように見えるため、攻撃の検知が非常に困難です。
`transformRequest`や`transformResponse`も、同様にプロトタイプ汚染の対象となりえます。これらはリクエスト/レスポンスボディの変換に関わるため、データ窃取や改ざんに利用される可能性があります。ただし、一部の検証ロジックを回避するための追加の細工が必要となります。
既存の修正は不十分:本脆弱性の特殊性
Axios v1.13.5で修正されたCVE-2026-25639は、`{"__proto__": {"x": 1}}`のように`__proto__`キーが直接設定された場合のクラッシュを防ぐためのものでした。しかし、今回の脆弱性は、明示的な`__proto__`設定ではなく、プロトタイプチェーンを介して間接的に汚染されたプロパティが読み込まれてしまう点にあります。そのため、既存の修正ではこの問題には対処できていません。
緊急の対応策:開発者が取るべきアクション
この脆弱性の影響は非常に広範囲に及び、特にNode.js環境でAxiosを使用している場合は、機密情報漏洩のリスクが高まります。以下の対応を速やかに検討してください。
最も確実な対策は、この脆弱性が修正されたAxiosの最新バージョン(本記事執筆時点ではまだ修正版がリリースされていない可能性がありますが、今後リリースされ次第)にアップデートすることです。Axiosのリポジトリやセキュリティ情報を定期的に確認し、最新版への追従を強く推奨します。
Axios自体がプロトタイプ汚染の原因ではないため、Lodash (v4.17.21未満) など、アプリケーション内でプロトタイプ汚染の既知の脆弱性を持つ他のライブラリを使用している場合は、それらのライブラリも最新の修正済みバージョンにアップデートしてください。`npm audit`などのツールを活用し、依存関係の脆弱性を定期的にスキャンする習慣をつけましょう。
もし直ちにAxiosや関連ライブラリのバージョンアップが難しい場合、応急処置として、Axiosの設定値を読み込む際に明示的な`hasOwnProperty`チェックを追加するなどの対策が推奨されています。例えば、`Object.prototype.hasOwnProperty.call(config, 'property') ? config.property : undefined` のようにプロパティの存在を確認する形で実装を変更することで、プロトタイプチェーンからの読み込みを防ぐことができます。ただし、これはAxiosの内部実装に手を加えることになるため、あくまで一時的な対策として慎重な検討と十分なテストが必要です。
また、アプリケーションの起動時に`Object.freeze(Object.prototype)`を実行することで、`Object.prototype`への新たなプロパティ追加や変更を不可能にする対策も考えられます。ただし、これは既存のアプリケーションの他の部分に予期せぬ副作用をもたらす可能性があるため、慎重な検討と広範なテストが不可欠です。
今後も同様のプロトタイプ汚染関連の脆弱性が発見される可能性があります。アプリケーション全体で、信頼できない入力からオブジェクトキーを生成する際や、オブジェクトプロパティを動的に参照する際には、常にプロトタイプ汚染のリスクを意識し、`Object.create(null)`でプレーンなオブジェクトを作成したり、`Object.prototype.hasOwnProperty.call()`でチェックしたりする習慣をつけましょう。
まとめ
Axiosのプロトタイプ汚染脆弱性 (CVE-2026-42033) は、他のライブラリによるプロトタイプ汚染が存在する場合に深刻な情報漏洩やリクエスト乗っ取りのリスクをもたらします。特にNode.js環境でのAxios利用者には緊急の対応が求められます。
最新バージョンへのアップデート、関連ライブラリの確認、そしてプロトタイプ汚染に対するセキュリティ意識の向上が、皆さんのアプリケーションを保護するための鍵となります。今すぐチームと協力し、対策を検討してください。