Fastifyにおいて、非同期バリデーションの結果の競合により、リクエストボディが置き換えられる脆弱性が存在します。

### 影響

Fastifyは、ルートのバリデータを実行し、`{ value, error }`という形式の結果を受け取ると、その内容を取り出します。`error`はバリデーションエラーとなり、`value`はリクエストの一部を置き換えます。この動作は、同期型のカスタムコンパイラ(例えばJoi)を想定したものです。しかし、JSON Schemaの`$async`バリデータは、検証されたデータ自体を結果として返すため、Fastifyはこれにも同じ処理を適用していました。`$async`スキーマによって検証されたリクエストの一部に`value`プロパティが含まれている場合、Fastifyはハンドラが実行される前に、そのネストされた`value`でリクエスト全体を置き換えていました。そのため、ペイロード内の`value`または`error`プロパティが攻撃者によって制御される可能性がありました。検証されたリクエストボディから操作を実行するアプリケーションは、ルートのスキーマを満たしていないデータに対して処理を行う可能性があり、これにより、不正な状態変更や情報漏洩が発生する可能性があります。この脆弱性が存在するパスに到達するには、ルートが`$async`リクエストスキーマを使用している必要があります。

### 修正

Fastifyは、非同期バリデーションの結果を`{ value, error }`のラッパーとして扱わなくなりました。非同期バリデータの解決結果は、合格または不合格を判断するためだけに利用され、リクエストの一部を置き換えることやエラーを注入することはできなくなりました。同期型のカスタムコンパイラの動作は変更されていません。`fastify 5.12.2`および`6.0.0`で修正されました。

### 対策

アップグレードがすぐにできない場合は、`$async`リクエストスキーマの使用を避けたり、セキュリティに関わるチェックをスキーマで検証されたリクエストの一部に依存するのではなく、`onRequest`または`preHandler`のフックで行うようにしてください。カスタムの非同期バリデータコンパイラは、エラーを返す代わりに、例外(拒否)を発生させるようにする必要があります。

影響を受けるパッケージ:
- npm (JavaScript) fastify: 5.12.2より前のバージョンが影響を受け、5.12.2で修正されました。