undiciにおいて、クロスオリジンリダイレクトを介したキャッシュ汚染や、ユーザー間の情報漏洩の脆弱性が存在します。

### 影響

オリジン情報を持たない`Agent`が、リダイレクトとキャッシュのインターセプターを`compose(redirect(), cache())`という形で、共有キャッシュ(`type: 'shared'`)と共に使用する場合、キャッシュはリダイレクトハンドラがオリジンを変更する前に、元のリクエストURLからキーを生成します。 その結果、リダイレクトによって異なるオリジンに遷移した場合でも、レスポンスは元のキーで保存されます。

攻撃者が、信頼されたURLからのリダイレクト先を制御できる場合、攻撃者のレスポンスがその信頼されたURLでキャッシュされる可能性があります。 その後、信頼されたURLをリクエストするクライアントは、オリジンサーバーに問い合わせることなく、共有キャッシュから攻撃者のレスポンスを受け取ることができ、これにより、キャッシュ汚染が永続的に発生する可能性があります。 同様のキーの混同により、機密データが漏洩する可能性もあります。認証されたリクエストが、ユーザー固有のリソースへの`private, no-store`リダイレクトを返す場合、最終的なレスポンスは元のURLで保存され、後続の未認証クライアントに提供される可能性があります。

キャッシュインターセプターは、undici 7.0.0で導入され、修正版がリリースされる前のすべての7.xおよび8.xのバージョンに影響があります。 アプリケーションが影響を受けるのは、オリジン情報を持たない`Agent`、共有の`MemoryCacheStore`または`SqliteCacheStore`、そして`compose(redirect(), cache())`の組み合わせがすべて使用されている場合に限られます。 オリジンにバインドされた`Client`および`Pool`ディスパッチャ、および逆の組み合わせである`compose(cache(), redirect())`は影響を受けません。

### 修正

`7.30.1`または`8.12.2`にアップグレードしてください。 undiciは、レスポンスを保存する前に、そのレスポンスを生成したオリジンがキャッシュキーと一致するかどうかを確認するようになり、また、各リダイレクトホップのキャッシュ制御ポリシーを保持するため、クロスオリジンリダイレクトのレスポンスや、`no-store`または`private`ホップの背後にあるレスポンスは、もはや元のキーでキャッシュされなくなります。

### 対策

インターセプターを`compose(cache(), redirect())`という形で組み合わせるか、オリジンごとのディスパッチャとキャッシュストアを使用するか、または、リダイレクトに対応するリクエストに対して共有キャッシュを無効にしてください。

影響を受けるパッケージ:
- npm (JavaScript) undici: 影響を受けるバージョンは 7.0.0 以上 7.30.1 未満。7.30.1 で修正済み。
- npm (JavaScript) undici: 影響を受けるバージョンは 8.0.0 以上 8.12.2 未満。8.12.2 で修正済み。