概要
Expressは最小限の柔軟なNode.jsウェブ・アプリケーション・フレームワークであり、ウェブおよびモバイル・アプリケーションのための堅牢な機能セットを提供する。
Express 3 レスポンスオブジェクトにオープンリダイレクトの脆弱性(CVE-2024-9266)が確認されました。
OWASPによると、URLリダイレクトとも呼ばれるオープン・リダイレクトは、アプリケーションが悪意のある外部URLにつながるリンクを指定するユーザー制御入力を受け入れる場合に存在する入力検証の欠陥である。この種の脆弱性は、フィッシング攻撃や被害者を感染ページにリダイレクトするために利用される可能性があります。
この問題は、Expressのバージョンが3.4.5以上4.0.0未満の場合に発生します。
詳細
モジュール情報
- 製品エクスプレス
- 影響を受けるコンポーネント:エクスプレス
- Affected versions: >=3.4.5 <4.0.0
- Githubリポジトリ: https://github.com/expressjs/express
- 公開されたパッケージ https://www.npmjs.com/package/express
- パッケージマネージャ:npm
脆弱性情報
このMedium-severityの脆弱性は、Expressパッケージのresponse.jsに存在する。
Expressのレスポンスオブジェクトのlocation()メソッドは、オープンリダイレクトの影響を受けやすい:
- リクエストパスはダブルスラッシュ(//) で始まる
AND - リダイレクトのための相対パスは./で始まり、ユーザー制御の入力から提供される
AND - Locationヘッダは、ユーザーが制御する入力で設定されます。
location()メソッドは// というパスを抽出し、それを resolve()メソッドを使用して相対 URL の先頭に追加します。この resolve()メソッドは./を評価し、それを / として返します。これはほとんどのブラウザで `//example.com` と等価と評価され、有効なscheme-relative-special-urlとしてヘッダに 'Location:これは有効なscheme-relative-special-urlであり、ヘッダーに'Location: ///example.com'として送られ、ユーザーを攻撃者のサイトにリダイレクトすることができます。
再現の手順
- Expressアプリケーションのコードで、URLクエリパラメータで指定された場所にユーザーをリダイレクトするパスを作成します。
app.get(['/'], function (req, res) {
const pageId = req.query.pageId;
if (pageId && pageId[0] == '.') {
res.status(301).location(pageId);
}
res.send('OK');
});
- ブラウザで、以下のようなクエリを使ってExpressアプリケーション・ルートにアクセスする:
http://localhost:3000//?pageId=./example.com
- ブラウザはhttps://example.com にリダイレクトするはずです。この結果は、Chrome DevToolsでブラウザのヘッダー詳細を検査することでも確認できます。
概念実証
Express 3.xのオープン・リダイレクトを再現しています。
クレジット
- マトヴェイ・マセンコ(ファインダー)
緩和
エクスプレス3はサポートが終了しており、この問題を解決するためのアップデートは行われません。
影響を受けるコンポーネントのユーザーは、以下のいずれかの緩和策を適用してください:
- Expressの新しいバージョンへの移行
- 独自のパッチを適用する
- EOL後のセキュリティ・サポートには、HeroDevsのような商用サポート・パートナーを活用する。
弊社がサポートするオープンソースソフトウェアに新たな脆弱性が修正された場合、いつでもアラートを受け取ることができます。