fastifyにおいて、不完全なスキーマのケース正規化により、ヘッダー検証を回避される脆弱性が存在します。
### 影響
Fastifyは、スキーマをコンパイルする前に、ヘッダーのスキーマプロパティ名を小文字に変換します。これは、Node.jsがリクエストヘッダー名を小文字で保存するためです。しかし、この正規化処理が不完全でした。具体的には、トップレベルの`properties`キーとルートの`required`配列のみが小文字に変換され、JSON Schema Draft 7の`dependencies`キーワード(そのトリガーキーと依存プロパティ名)や、ネストされたサブスキーマ内の名前は小文字に変換されませんでした。その結果、`dependencies`を使用して、あるヘッダーが存在する場合に別のヘッダーを要求するヘッダースキーマ(例えば、`X-Admin`が存在する場合に`X-Admin-Token`を要求する)は、小文字に変換されたリクエストヘッダーと一致しないため、依存関係の検証が黙ってスキップされます。認証されていないリモートクライアントは、特権的なパスを有効にするヘッダーを送信しながら、依存関係が要求するヘッダーを省略することで、スキーマによって強制されるセキュリティ制御を回避できます。このヘッダースキーマは、標準的な有効なJSON Schema Draft 7であり、カスタムバリデータ、不正なリクエスト、または誤った設定は必要ありません。
### 修正
ヘッダースキーマの名前は、すべてのスキーマの位置(`properties`、`required`、`dependencies`、`dependentRequired`、`dependentSchemas`、およびネストされたサブスキーマ)で正規化されるようになりました。fastifyのバージョン`5.12.2`で修正されました。この修正は、バージョン`6.0.0`にも含まれています。外部共有の`$ref`(`addSchema`で登録されたもの)で参照されるヘッダースキーマは、この正規化の対象外であり、現在、起動時に`FSTSEC002`という警告メッセージが表示されます。ケースインセンシティブな検証を維持するには、ヘッダースキーマをインラインで記述してください。
### 対策
すぐにアップグレードできない場合は、ヘッダースキーマの名前を小文字で記述して、`dependencies`などのケースに依存する検証が、Node.jsが小文字で保存するリクエストヘッダーと一致するようにするか、スキーマではなく、`onRequest`または`preValidation`のフックで、ヘッダー間の関連付けを強制してください。
影響を受けるパッケージ:
- npm (JavaScript) fastify: 影響を受けるバージョンは5.12.2より前のもの、5.12.2で修正済み。