[緊急] fast-uriに高深刻度オーソリティインジェクション脆弱性(CVE-2026-84292)が判明 - フロントエンドへの影響と対策
はじめに:`fast-uri`とは?
`fast-uri`は、URI(Uniform Resource Identifier)の解析、構築、正規化、比較などを高速に行うためのJavaScriptライブラリです。Node.js環境やブラウザ環境で広く利用されており、URI操作が必要な多くのプロジェクトで間接的または直接的に利用されている可能性があります。
脆弱性の概要 (CVE-2026-84292 / GHSA-qw65-cvwx-89v3)
今回報告された脆弱性は、`fast-uri`がURIをシリアライズ(文字列化)する際に、`port`コンポーネントの入力を適切に検証しないことに起因します。これにより、攻撃者が意図しないホストへリクエストを誘導したり、本来のホストを偽装したりする「オーソリティインジェクション」が可能となります。この脆弱性の深刻度は「高 (High)」と評価されています。
具体的な脆弱性のメカニズム
URIは一般的に「スキーム://[ユーザー情報@]ホスト[:ポート]/パス?クエリ#フラグメント」という構造を持っています。このうち「ユーザー情報@ホスト:ポート」の部分が「オーソリティ」と呼ばれます。
`fast-uri`の`serialize()`関数や関連するメソッドは、URIの各コンポーネントを連結して文字列化する際に、`userinfo`や`host`は適切にエスケープする一方、`port`の値をそのまま連結していました。ここで、もし`port`として数字以外の、例えば `@attacker.com:8080` のような悪意のある文字列が渡された場合、以下のようなURIが生成されてしまいます。
例: `fast-uri`に`host: 'trusted.example'` と `port: '@attacker.com:8080'` を渡してシリアライズした場合、生成されるURIは `http://trusted.example:@attacker.com:8080/path` となります。
この結果、URIのパーサーは `trusted.example` をユーザー情報とみなし、`attacker.com` を新たなホストとして認識してしまいます。Node.jsの組み込み`URL` APIでさえ、これをエラーなく解釈してしまうため、アプリケーション側でURIを再検証してもこの不正な状態を検出することは極めて困難です。
これにより、ユーザーは意図しない悪意のあるサーバーへ誘導され、フィッシングサイトへのアクセス、認証情報の窃取、セッションハイジャックなどの被害に繋がる可能性があります。
フロントエンド開発への影響
フロントエンド開発において、直接`fast-uri`を意識して使っていない場合でも、依存しているパッケージが内部的に利用している可能性があります。特に以下のようなケースでは注意が必要です。
- ユーザー入力、APIからのレスポンス、設定ファイルなど、信頼できないソースから取得したデータを元にURIの一部(特にポート番号)を構築している場合。 - サービスディスカバリなどで動的に取得したポート値を使用して、マイクロサービス間の通信URLを生成している場合。 - バックエンドから受け取ったURLを、フロントエンドでさらに加工して他のAPIリクエストやリダイレクトに使用するケース。 - Server-Side Rendering (SSR) 環境で、Node.js上で動作するアプリケーションが`fast-uri`を利用している場合。
開発者は、自身が開発しているアプリケーションがURIを構築する際に、`fast-uri`を使っているかどうか、またその`port`コンポーネントに信頼できないデータを割り当てていないかを確認する必要があります。
対策と推奨事項
**最優先:`fast-uri`のアップグレード**
この脆弱性は、`fast-uri`の以下のバージョンで修正されています。速やかにアップグレードを実施してください。
- `fast-uri` `4.1.4` - `fast-uri` `3.1.7` - `fast-uri` `2.4.6`
プロジェクトの`package.json`で`fast-uri`が直接指定されているか確認し、指定されていればバージョンを更新して`npm install`または`yarn install`を実行します。また、間接的な依存関係の場合は、`npm update`や`yarn upgrade`コマンドで依存パッケージ全体を更新し、`package-lock.json`や`yarn.lock`で`fast-uri`のバージョンが上記修正済みバージョンになっていることを確認してください。
**ワークアラウンド(一時的な対応)**
もし直ちにアップグレードが難しい場合、以下のワークアラウンドを適用することで、一時的にリスクを軽減できます。
`fast-uri`の`serialize()`, `normalize()`, `equal()`などのメソッドに`port`コンポーネントを渡す前に、ポート値がRFC 3986で定義されている通り「数字のみ」の文字列であることを検証してください。数字以外の文字が含まれる場合は、エラーとして処理を中断します。
例:`if (!/^\d*$/.test(String(port))) { throw new Error('Invalid port value: Port must contain only digits.'); }`
まとめ
今回の`fast-uri`におけるオーソリティインジェクション脆弱性は、アプリケーションが意図しないホストへ誘導される可能性のある、危険度の高い問題です。特に、ユーザー入力や外部からのデータに基づいてURIを動的に構築するアプリケーションでは、深刻な影響を受ける可能性があります。
フロントエンドエンジニアの皆様は、ご自身のプロジェクトにおける`fast-uri`の利用状況を確認し、速やかに修正済みバージョンへのアップグレード、またはワークアラウンドの適用を強く推奨いたします。サプライチェーン攻撃のリスクが高まる現代において、利用しているライブラリの脆弱性情報には常に注意を払い、迅速な対応を心がけましょう。