fastifyにおいて、ブール値の`false`をスキップしたスキーマによるリクエスト検証の回避の脆弱性が存在します。
### 影響
Fastifyは、JavaScriptの真偽値に基づいてリクエストの一部を検証するかどうかを決定していました。JSON Schema Draft 7では、`false`を有効なスキーマとして定義しており、これはすべてのインスタンスを拒否します。しかし、`false`は偽の値であるため、`body`、`querystring`、`params`、または`headers`を`false`に設定したルートでは、その部分がコンパイルされず、バリデータが適用されず、リクエストがハンドラに到達していました。したがって、`false`をすべてのリクエストを拒否するスキーマとして使用してルートへのアクセスを不可能にしようとしたアプリケーションは、完全に回避されてしまい、認証されていないリモートクライアントが任意の入力でハンドラにアクセスできるようになっていました。これは、ドキュメントに記載されている`querystring`のエイリアスである`query`にも当てはまります。これは、弱いスキーマの問題ではなく、完全な回避です。なぜなら、`false`は最も強力なJSON Schemaの制約であり、常に失敗するはずだからです。
### 修正
リクエスト部分のスキーマは、真偽値ではなく、明示的な存在チェックによって選択されるようになりました。これにより、ブール値の`false`(または`true`)のスキーマがコンパイルされ、適用されるようになり、`query`エイリアスも含まれます。fastifyのバージョン`5.12.2`で修正されました。この修正は、バージョン`6.0.0`にも含まれています。
### 対策
すぐにアップグレードできない場合は、常に失敗するオブジェクトスキーマを使用して、すべてのリクエストを拒否するスキーマを表現してください(例:`{ "not": {} }`)。または、`onRequest`フックでリクエストを拒否してください。
影響を受けるパッケージ:
- npm (JavaScript) fastify: 5.12.2より前のバージョンに影響があり、5.12.2で修正されています。