[注意喚起] Node.js環境のAxiosにおけるプロキシ汚染の脆弱性 (GHSA-68jp-44vc-2x5h)
はじめに:AxiosのNode.js環境におけるプロキシ汚染の脆弱性
日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、Node.js環境で広く利用されているHTTPクライアントライブラリ「Axios」に存在する、プロキシ汚染の脆弱性(GHSA-68jp-44vc-2x5h)について解説します。このアドバイザリはGHSA-gcfj-64vw-6mp9の重複として扱われていますが、オリジナルの詳細情報に基づいて、その影響と対策を深く掘り下げていきます。この脆弱性は特にバックエンドでNode.jsを使用している方、あるいはNode.js製のツールなどでAxiosを利用している方に影響します。
脆弱性の概要:なぜリクエストが乗っ取られるのか?
この脆弱性は、AxiosがNode.js環境のHTTPアダプタを使用している場合に発生します。根本的な原因は、Axiosがリクエスト設定を保護するメカニズムと、リクエストインターセプターでの設定の取り扱い方にあります。
通常、Axiosはマージされたリクエスト設定を「null-prototypeオブジェクト」として生成し、意図しないプロトタイプチェーンからのプロパティ継承を防ぐことで、セキュリティを強化しています。しかし、問題となるのは、この強化された設定オブジェクトがリクエストインターセプターを通過する際に発生します。
技術的詳細:プロトタイプ汚染とその悪用
多くの開発者がインターセプター内で設定をコピーする際、以下のような一般的なパターンを使います。
```javascript // よくあるインターセプターでの設定クローン const newConfig = { ...config }; // または const newConfig = Object.assign({}, config); ```
これらの操作は、Axiosが生成した「null-prototypeオブジェクト」を、通常のJavaScriptオブジェクト(つまり `Object.prototype` を継承するオブジェクト)に戻してしまいます。Axiosはこの再変換されたオブジェクトを再強化することなくディスパッチします。
ここでプロトタイプ汚染の脅威が浮上します。もし攻撃者が何らかの方法で `Object.prototype.proxy` を汚染できた場合(例えば、他のライブラリの脆弱性やアプリケーションの入力処理の不備を通じて)、Node.js HTTPアダプタは、`config.proxy` プロパティが存在しないときにプロトタイプチェーンを辿り、汚染された `Object.prototype.proxy` の値を読み込んでしまいます。その結果、Axiosのリクエストは攻撃者によって制御されたプロキシサーバーを経由してルーティングされてしまうのです。
この脆弱性がもたらす影響
攻撃者制御のプロキシを経由した場合、深刻な情報漏洩や改ざんのリスクがあります。特に、プレーンテキストHTTPリクエストの場合、以下の情報が傍受される可能性があります。
<ul><li>Authorizationヘッダー</li><li>config.authによるBasic認証情報</li><li>HTTPメソッド</li><li>完全なURL (absolute URL)</li><li>Hostヘッダー</li><li>リクエストボディ</li></ul>
また、攻撃者は独自のレスポンスを返すことで、アプリケーションの動作を改ざんすることも可能です。
<strong>重要な注意点として、この脆弱性はブラウザ環境でのAxiosの利用には影響しません。</strong> また、HTTPSリクエストの場合、通常のTLS検証が行われていれば、ヘッダーやボディが直接開示されることはありませんが、通信相手が中間プロキシに変更されるリスクは依然として存在します。
影響を受けるバージョンと修正済みバージョン
この脆弱性の影響を受けるAxiosのバージョンは以下の通りです。
<ul><li>`0.31.1` 以降 (修正済みバージョンは `0.33.0`)</li><li>`1.15.2` 以降 (修正済みバージョンは `1.18.0`)</li></ul>
上記バージョンを使用している場合は、速やかなアップデートが必要です。
フロントエンドエンジニアが取るべき対策
Node.js環境でAxiosを使用している場合、以下の対策を直ちに実行してください。
最も効果的な対策は、修正済みのバージョン (`0.33.0` 以上、または `1.18.0` 以上) へとAxiosをアップデートすることです。これにより、このプロキシ汚染の脆弱性に対するAxios側の対策が適用されます。
もしバージョンアップがすぐに難しい場合、または今後の安全な開発のために、リクエストインターセプター内で設定オブジェクトをクローンする際には、安易な `Object.assign({}, config)` や `{...config}` を避けるか、Axiosが内部で生成するnull-prototypeオブジェクトの性質を破壊しないよう、より慎重に扱う必要があります。可能であれば、設定オブジェクト全体をコピーするのではなく、変更したい特定のプロパティのみを修正する方が安全です。
この脆弱性はプロトタイプ汚染というより一般的な脆弱性を悪用するものです。アプリケーション全体でユーザーからの入力を安全に処理し、オブジェクトのマージやクローンを行う際には、プロトタイプチェーンが意図せず汚染されないような対策を講じることが重要です。
まとめ
Axiosは広く使われている便利なライブラリですが、Node.js環境においては、リクエストインターセプターの特定のパターンとプロトタイプ汚染の組み合わせにより、リクエストが攻撃者制御のプロキシにルーティングされるという重大な脆弱性が存在しました。この脆弱性はブラウザ環境には影響しませんが、Node.jsベースのバックエンドやツールを開発しているフロントエンドエンジニアにとっては見過ごせない問題です。速やかにAxiosを最新の修正済みバージョンにアップデートし、安全なアプリケーション開発を心がけましょう。