fast-uriにおいて、シリアライズ処理において検証されていないポート情報により、不正な情報が挿入される脆弱性が存在します。
### 影響
`fast-uri`は、URIの`port`コンポーネントを検証せずにシリアライズします。権限情報を再構成する際、`fast-uri`はユーザー情報とホストコンポーネントをエスケープしますが、ポートコンポーネントをそのまま連結します。そのため、数字以外の文字を含む`port`の値が、権限の区切り文字として挿入される可能性があります。例えば、`port`が`@127.0.0.1:8124`であるコンポーネントをシリアライズすると、`http://trusted.example:@127.0.0.1:8124/app`という文字列が生成され、本来のホストがユーザー情報として扱われ、権限が攻撃者が制御するホストを指すようになります。`fast-uri`とNode.jsの`URL`は、この結果をエラーなしで攻撃者のホストとして解釈するため、構築されたURIを再検証してもこの問題は検出されません。
これは、URIを複数の部分から構築し、`port`コンポーネントに信頼できないデータを割り当てるアプリケーションに影響を与えます(例えば、設定ファイルから取得した固定ホストと、ユーザー入力またはサービスレコードから取得したポートなど)。同様の問題は、オブジェクト形式の`serialize()`、`normalize()`、および`equal()`関数でも発生する可能性があります。`parse()`関数から取得した`port`の値は常に数字であり、この問題の影響を受けません。
### 修正
この脆弱性は、fast-uriのバージョン`4.1.4`、`3.1.7`、および`2.4.6`で修正されています。`recomposeAuthority`関数は、RFC 3986に従い、数字以外の文字を含むポート情報を拒否するようになりました。すべてのユーザーは、バージョンアップを推奨します。
### 対策
バージョンアップがすぐにできない場合は、コンポーネントを`serialize()`、`normalize()`、または`equal()`関数に渡す前に、`port`の値をRFC 3986の文法(数字のみ)に対して検証し、それ以外の値は拒否してください。例えば、`if (!/^\d*$/.test(String(port))) throw new Error('invalid port')`というコードを使用できます。
影響を受けるパッケージ:
- npm (JavaScript) fast-uri: 影響を受けるバージョンは2.4.6未満、修正されたバージョンは2.4.6
- npm (JavaScript) fast-uri: 影響を受けるバージョンは3.0.0以上、3.1.7未満、修正されたバージョンは3.1.7
- npm (JavaScript) fast-uri: 影響を受けるバージョンは4.0.0以上、4.1.4未満、修正されたバージョンは4.1.4