@fastify/expressに認証をすり抜ける脆弱性、4.0.9で修正
Fastify上でExpressのミドルウェアを動かすプラグイン@fastify/expressに、パス単位で付けた認証やレート制限が素通りされる脆弱性が見つかりました。影響するのは4.0.5から4.0.8を使い、ignoreDuplicateSlashesを有効にしているアプリケーションです。4.0.9以上への更新と、設定の有無の確認を進めてください。
急ぎ度: 早めに
CVSS v3は9.1で認証なしにネットワーク越しで悪用できる一方、修正版4.0.9があり、悪用には既定では無効のignoreDuplicateSlashesが必要なため、該当する環境は早めの更新が妥当です。
関係があるか
FastifyでExpress向けのミドルウェアを使い、管理画面やAPIの認証・認可・レート制限をパス単位のミドルウェアで実装している組織が対象です。ただし、FastifyのignoreDuplicateSlashesオプションを有効にしている場合に限ります。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| @fastify/express | 4.0.5以上4.0.9未満(4.0.5から4.0.8) | 4.0.9 |
確かめ方
- 1プロジェクトのルートで
npm ls @fastify/expressを実行し、4.0.5から4.0.8が入っていないか確認します。モノレポや複数サービスでは、サービスごとに実行してください。 - 2Fastifyの生成コードで
ignoreDuplicateSlashesを検索し、trueにしていないか確認します。既定は無効なので、記載がなければこの条件には当てはまりません。 - 3
app.use('/admin', ...)のように、パスを指定して認証・認可・レート制限のミドルウェアを登録している箇所を洗い出します。該当すれば、素通りの影響を受けるルートの範囲が分かります。
何が起きたか
@fastify/expressの4.0.5から4.0.8に、パス単位で登録した認証・認可・レート制限のミドルウェアが飛ばされ、保護しているはずの管理用パスなどのハンドラーがそのまま実行される脆弱性があります。
このプラグインは、Fastifyのルーターと、Expressのミドルウェアを動かす層の2か所でURLを見ています。ignoreDuplicateSlashesを有効にすると、重複したスラッシュを1つにまとめる正規化が働きます。絶対形式の要求先では、この正規化がスキームの直後にある区切りまで巻き込みます。その結果、Fastifyのルーターは要求を保護対象のパスに振り分けるのに、Express側はそのパスへの要求と認識しません。パス単位のミドルウェアは動かず、ハンドラーだけが動きます。
CWE-436に分類される、2つの部品がURLを別々に解釈することで起きる脆弱性です。設定が当てはまる環境では、見送る理由は乏しいとみられます。
攻撃の流れ
-
1
前提となる構成
ignoreDuplicateSlashesを有効にしたFastifyで、パス単位のミドルウェアに認証などを任せている。
-
2
特殊な要求先
攻撃者が、絶対形式の要求先を使った要求をサーバーへ送る。
-
3
解釈の食い違い
正規化で区切りが潰れ、Fastifyは保護対象のパスと解決するが、Express層はそのパスと認識しない。
-
4
ミドルウェア回避
認証・認可・レート制限が実行されないまま、ハンドラーが動く。
どう悪用されるか
悪用に認証は要りません。ネットワーク越しに要求を送れる攻撃者であれば、利用者の操作も必要ありません。前提となるのは、ignoreDuplicateSlashesが有効になっていることだけです。
CVSSの評価では、機密性と完全性への影響が高く、可用性への影響はありません。管理用のパスが認証なしで呼ばれれば、本来は見えない情報の取得や、データや設定の書き換えにつながります。レート制限が飛ばされた場合は、回数制限をかけていた処理が無制限に呼ばれます。実際の被害の大きさは、素通りされたハンドラーが何をするかで決まります。
今すぐやること
-
1
影響を受けるか確認する
@fastify/expressの版と、ignoreDuplicateSlashesの設定を確認します。両方に当てはまるサービスを優先して更新します。
npm ls @fastify/express -
2
4.0.9以上に更新する
package.jsonの指定を見直し、ロックファイルも更新して、修正版に更新します。ビルドとテストを通したうえでデプロイします。
-
3
更新後の版を確認する
デプロイ後の環境で、実際に4.0.9以上が入っているかを確認します。コンテナーを使う場合は、古いイメージが残っていないかも見てください。
npm ls @fastify/express -
4
認証の置き場所を見直す
認証・認可をパス単位のミドルウェアだけに頼っている箇所は、Fastifyのフック側でも検証するよう検討します。ルーターとミドルウェア層で解釈が食い違っても、1か所が守る形になります。
すぐ更新できないとき
すぐに更新できない場合は、認証をFastifyのpreHandlerのように、ルーターが要求を解決したあとに動くフックで強制します。もう1つの方法は、ignoreDuplicateSlashesを既定の状態に戻すことです。ただし、重複スラッシュを含むURLの扱いが変わるため、既存のルートへの影響を確認してから切り替えてください。
背景
@fastify/expressは、Fastifyの上でExpress用のミドルウェアをそのまま動かすプラグインです。Expressで作った認証やセッション管理、レート制限の部品を残したままFastifyへ移行するときによく使われます。パスを指定して登録するミドルウェアは、とくに管理画面の保護を担うことが多く、素通りされたときの影響が大きい部品です。
今回の脆弱性は、Fastifyのルーターとプラグイン内のExpress層が、同じURLを別々に解釈することで起きます。ルーティングと認証が別の部品で動くため、片方だけがURLを加工すると、保護されているはずのパスが保護されません。URLの正規化は、重複スラッシュの整理のように便利な設定ほど、こうした食い違いの入口になりやすい部分です。
よくある質問
Q.ignoreDuplicateSlashesを使っていなければ、更新しなくてよいですか。
まだ分かっていないこと
- 実際の攻撃で悪用されているかどうかは、公表されていません。
- Fastify本体やExpress本体、ほかのプラグインに同種の影響があるかは、告知に書かれていません。最新の状況は、GitHubのセキュリティアドバイザリGHSA-6h42-57hq-9746で確認してください。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| @fastify/express | @fastify/express |
4.0.5 以上 4.0.9 未満 |
4.0.9 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
@fastify/express is a Fastify plugin that runs Express middleware inside Fastify. In versions 4.0.5 through 4.0.8, when Fastify runs with the non-default ignoreDuplicateSlashes option enabled, the plugin matches path-scoped Express middleware against a URL whose duplicate-slash normalization has also collapsed the separator after an absolute-form request target's scheme, so Fastify's router resolves the request to the scoped path and runs the handler while the Express layer no longer sees that path. As a result, a request using an absolute-form target can reach a handler on a scoped route such as an admin path while the middleware for authentication, authorization, or rate limiting is skipped. An unauthenticated attacker needs only the non-default ignoreDuplicateSlashes option to be enabled. The issue is fixed in @fastify/express 4.0.9, and users should upgrade to 4.0.9 or later. As a workaround, enforce authentication in a Fastify hook such as preHandler that runs after the router resolves the request, or leave ignoreDuplicateSlashes at its default.
出典: CVE.org (CVE Program・cvelistV5) NVD
参照URL
- web github.com
- web cna.openjsf.org