@fastify/middie に認証回避の欠陥、9.3.6 で修正済み
Fastify 向けのミドルウェア機能を提供する @fastify/middie 9.0.0 から 9.3.5 に、パス指定のミドルウェアが飛ばされる欠陥があります。認証や認可、レート制限をこの仕組みで実装している Web アプリケーションでは、認証なしの 1 回のリクエストで保護を迂回される恐れがあるため、9.3.6 以降への更新をお勧めします。実際の攻撃での悪用は、現時点で公表されていません。
急ぎ度: 早めに
CVSS 9.1で認証なしにネットワーク越しで突かれる弱点ですが、実際の悪用の確認(KEV)は公表されておらず、影響は特定の設定の組み合わせに限られるためです。
関係があるか
Node.jsのFastifyで @fastify/middieを使い、特定のパスにだけ認証・認可・レート制限などのミドルウェアを掛けているアプリケーションが対象です。とくにプラグインのスコープ接頭辞(prefix)が / で終わる構成は、最も当てはまりやすいとされています。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| @fastify/middie | 9.0.0以上9.3.6未満(9.0.0から9.3.5) | 9.3.6 |
確かめ方
- 1プロジェクトのディレクトリで
npm ls @fastify/middieを実行し、導入されている版を確認します。間接的な依存として入っている場合もあるため、ロックファイルも見てください。 - 2コード内で
use()に第1引数としてパスを渡している箇所を探します。パスを指定しないミドルウェアは、今回の説明では対象として挙げられていません。 - 3そのプラグインを登録している
prefixが/で終わっていないか、use()のパスが配列になっていないか、先頭の/が抜けていないかを確認します。 - 4認証や認可、レート制限をパス指定の
use()に頼っているルートがあれば、更新の優先度を上げてください。
何が起きたか
@fastify/middieは、Node.jsのWebフレームワークFastifyで、Express風のミドルウェア(リクエストの前に挟む共通処理)を使えるようにするプラグインです。今回見つかった欠陥では、特定のパスにだけ掛けたはずのミドルウェアが、リクエストによっては実行されないまま、本来の処理(ルートハンドラ)だけが動いてしまいます。認証や認可の確認が丸ごと飛ばされるため、認証していない利用者が1回のリクエストで保護されたはずの機能に届く可能性があります。
原因は、use() が、ミドルウェアのパスとプラグインのスコープ接頭辞をつなぎ合わせる処理にあります。つなぎ方がFastifyのルーターが実際に処理するパスとずれる場合があり、ずれるとミドルウェアは一致しないと判断されて、エラーも出さずに飛ばされます。ずれが起きやすいのは、スコープ接頭辞がスラッシュで終わる場合です。そのほか、パスを配列で渡した場合と、先頭のスラッシュを書かずにパスを指定した場合にも起こります。
分類はCWE-436(各コンポーネントの解釈の食い違い)で、CVSS v3.1は9.1(Critical)です。評価では、ネットワークから、特別な条件や権限なしに、機密性と完全性に大きな影響があるとされています。可用性への影響は想定されていません。9.3.6で修正されています。
攻撃の流れ
-
1
構成が該当
9.0.0から9.3.5を使い、パス指定のミドルウェアで保護している構成です。
-
2
パスがずれる
スコープ接頭辞との結合結果が、ルーターが処理するパスと食い違います。
-
3
ミドルウェア不実行
一致しないと判断され、認証などの処理がエラーなしで飛ばされます。
-
4
ハンドラが動く
ルートハンドラは通常どおり実行され、保護されたはずの処理に届きます。
どう悪用されるか
悪用に認証は要らず、利用者の操作も必要ありません。ネットワークから到達できるアプリケーションに、認証なしのリクエストを1回送るだけで成り立つとされています。ただし、前提として、パス指定のミドルウェアで保護する構成であり、かつ上記のパスのずれが生じる設定であることが必要です。
悪用された場合、認証や認可の確認、レート制限などが効かなくなります。評価上は、情報の閲覧と、データの書き換えなどの操作が大きな影響として想定されています。実際にどの程度の被害になるかは、飛ばされたミドルウェアが何を守っていたかで変わります。実際の攻撃での悪用や、攻撃コードの公開については、現時点で公表されていません。
今すぐやること
-
1
@fastify/middieを9.3.6以降に更新する
依存関係を更新し、ロックファイルも反映したうえで再デプロイします。テストでは、保護対象のパスに認証なしでアクセスして、拒否されることを確かめてください。
npm ls @fastify/middie -
2
対象の構成かどうかを洗い出す
use()にパスを渡している箇所と、プラグイン登録時のprefixの末尾のスラッシュ、配列指定、先頭スラッシュの有無を確認します。該当があれば更新を優先してください。 -
3
保護が効いているかを実際に確かめる
認証が必要なはずのルートに、認証情報なしでアクセスし、拒否されることを確認します。更新前の環境が公開されている場合は、アクセスログで認証を通らずに成功した記録がないかも見ておくと安心です。
-
4
認可をルーター解決後の処理にも置く
更新までの間、また更新後の多重防御として、
preHandlerなどのフックで認可を確認する構成を検討してください。
すぐ更新できないとき
すぐに更新できない場合は、認可の確認を preHandler のような、ルーターがリクエストのパスを確定した後に動くフックで行ってください。ルートに紐づいた処理として動くため、パスのずれの影響を受けにくくなります。対象のルートを洗い出し、認証・認可の確認が確実に実行される形に置き換えるのが基本です。
背景
ミドルウェアは、Webアプリケーションで、受け付けたリクエストを本来の処理に渡す前に、ログイン状態の確認、権限の確認、アクセス回数の制限といった共通の関門を設ける仕組みです。社内では、入口の受付で入館証を確認する役割にあたります。ここが飛ばされると、中の処理は守られないまま動きます。
Webの世界では、認証の仕組み自体に問題がなくても、URLの解釈が部品ごとに食い違うことで、保護が掛からなくなる問題がこれまでも繰り返し報告されてきました。末尾のスラッシュや大文字小文字、パスの正規化の違いなどが典型です。今回も、ミドルウェア側とルーター側でパスの解釈がずれたことが背景にあります。
よくある質問
Q.Fastifyを使っていれば必ず影響を受けますか。
Q.更新できるまで、どう守ればよいですか。
preHandler のように、ルーターがリクエストを解決した後に動くフックで認可を確認してください。パスのずれの影響を受けにくくなります。Q.すでに攻撃されていないかは分かりますか。
まだ分かっていないこと
- 実際の攻撃での悪用や、攻撃コードの公開の有無は、公表されていません。
- 9.0.0より前の版が影響を受けるかどうかは、公表されている範囲では示されていません。詳細はGitHubの告知(GHSA-5p92-8765-9fv8)で確認してください。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| @fastify/middie | @fastify/middie |
9.0.0 以上 9.3.6 未満 |
9.3.6 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
@fastify/middie is the Express-style middleware engine for Fastify. In versions from 9.0.0 through 9.3.5, the use() function joined a path-scoped middleware's mount path to the plugin scope prefix in a way that could diverge from the path Fastify's router serves, most often when the scope prefix ended in a slash, and also for array mount paths and for mount paths written without a leading slash. When the two paths disagreed, the middleware was silently skipped while the route handler still ran, so path-scoped middleware such as authentication, authorization, or rate limiting could be bypassed by a single unauthenticated request. The issue is fixed in @fastify/middie 9.3.6, and users should upgrade to 9.3.6 or later. As a workaround, enforce authorization in a Fastify hook such as preHandler that runs after the router has resolved the request.
出典: NIST National Vulnerability Database NVD GitHub Advisory
参照URL
- advisory cna.openjsf.org
- advisory github.com
- advisory github.com
- advisory nvd.nist.gov