[緊急警告] @fastify/expressにおける認証バイパス脆弱性 (CVE-2026-33808) と対策
脆弱性の概要と、なぜフロントエンドエンジニアが知るべきなのか
今回報告された脆弱性 GHSA-6hw5-45gm-fj88 (CVE-2026-33808) は、Fastify上でExpressミドルウェアを利用するためのライブラリ `@fastify/express` に存在する、非常に深刻度が高い(Critical)認証バイパスの問題です。この脆弱性を悪用されると、本来認証や認可によって保護されているはずの管理画面やAPIエンドポイントに、未認証のユーザーがアクセスできてしまう可能性があります。
「これはバックエンドの問題だから関係ない」と思われるかもしれませんが、フロントエンドエンジニアの皆さんも無関係ではありません。APIの設計や利用、そしてセキュリティ要件の理解は、セキュアなアプリケーション開発において不可欠です。バックエンドの認証・認可機構にこのような脆弱性がある場合、たとえフロントエンドで厳重なUI制御を行っていても、攻撃者は直接APIを叩くことで簡単にシステムに侵入できてしまいます。自身の開発するアプリケーションのセキュリティを守るためにも、この脆弱性のメカニズムと対策をしっかり理解しておきましょう。
FastifyとExpressのURL正規化の不整合が原因
この脆弱性の核心は、FastifyのルーターとExpressミドルウェアの間で、URLの正規化処理に不整合がある点にあります。Fastifyは特定のURL形式を「正規化」してルートをマッチさせる一方で、Expressミドルウェアには「正規化されていない元のURL」が渡されてしまうのです。このギャップにより、Expressの認証ミドルウェアが意図したパスと一致せず、スキップされてしまいます。
具体的な攻撃手法と影響条件
この脆弱性は、Fastifyの設定で以下のいずれかのオプションが有効な場合に発生します。これらのオプションは、開発者が意図せず有効にしている可能性があるため注意が必要です。
Fastifyの設定で `ignoreDuplicateSlashes: true` が有効な場合、Fastifyは `//admin/dashboard` のような重複スラッシュを含むURLを `/admin/dashboard` と見なし、正しいルートにマッチさせます。しかし、Expressミドルウェアには元の `//admin/dashboard` が渡されます。
例えば、`app.use('/admin', authMiddleware)` のようにExpressミドルウェアを設定している場合、Expressは `/admin` というプレフィックスを期待しますが、渡されたURLは `//admin` で始まるため一致しません。結果として `authMiddleware` は実行されず、認証をバイパスして `/admin/dashboard` にアクセスできてしまいます。
Fastifyの設定で `useSemicolonDelimiter: true` が有効な場合(主にJavaアプリサーバーとの互換性のために使用されることがあります)、Fastifyは `/admin;bypass` のようなURLのセミコロン以降を無視して `/admin` と見なします。これにより、Fastifyは `/admin` ルートにマッチします。
しかし、Expressミドルウェアには元の `/admin;bypass` が渡されます。Expressのパス認識ロジックではセミコロンが特別な意味を持たないため、パスが一致せず、認証ミドルウェアがスキップされてしまいます。攻撃者は `/api/v1/users;anything` のようにURLを細工するだけで、本来アクセスが制限されているAPIにアクセスできる可能性があります。
影響を受ける環境と確認方法
この脆弱性は、`@fastify/express` の `v4.0.4`(現時点での最新版)を含む、Fastify `v5.x` との組み合わせで発生します。自身のプロジェクトで以下の条件に合致するか確認してください。
Fastifyインスタンスの生成時に、以下のいずれかのオプションが設定されているか確認してください。
`const fastify = Fastify({ ignoreDuplicateSlashes: true });`
`const fastify = Fastify({ routerOptions: { useSemicolonDelimiter: true } });`
今すぐ取るべき対策
この脆弱性は非常に深刻なため、直ちに対策を講じる必要があります。推奨される対策は以下の通りです。
もし可能であれば、Fastifyのインスタンス設定で `ignoreDuplicateSlashes: true` および `routerOptions: { useSemicolonDelimiter: true }` の使用を一時的に無効にしてください。これにより、この脆弱性によるバイパスを防ぐことができます。ただし、これらのオプションを無効にすることで、アプリケーションの既存のルーティング動作に影響がないか十分にテストしてください。
Expressミドルウェアに認証ロジックを依存する代わりに、Fastifyが提供する認証フック(例: `preHandler`)を使用して認証ロジックを実装することを強く検討してください。Fastifyのフックは、Fastifyのルーターによって正規化された後のURLで動作するため、この脆弱性の影響を受けません。よりFastifyネイティブな方法で認証を実装することで、同様の問題の再発も防ぐことができます。
例:
```javascript fastify.addHook('preHandler', (request, reply, done) => { // ここで認証ロジックを実装 // request.url は Fastifyによって正規化されたURL if (!request.headers.authorization) { reply.code(401).send({ message: 'Unauthorized' }); return; } done(); }); ```
`@fastify/express` の開発チームがこの脆弱性に対応した修正版をリリースする予定です。修正版がリリースされ次第、速やかにライブラリを最新バージョンにアップデートしてください。同様の問題が `@fastify/middie` で既に修正されていることから、`@fastify/express` でも同様の対応が期待されます。GitHubのリポジトリや公式アナウンスを定期的に確認し、最新情報を入手するようにしましょう。
まとめ
今回の `@fastify/express` の認証バイパス脆弱性 (CVE-2026-33808) は、アプリケーションのセキュリティに甚大な影響を及ぼす可能性があります。FastifyとExpressを組み合わせているプロジェクトでは、すぐに設定を確認し、推奨される対策を講じてください。特に、`ignoreDuplicateSlashes` や `useSemicolonDelimiter` といった設定が意図せず有効になっていないか、注意深くチェックすることが重要です。
フロントエンドエンジニアの皆さんも、バックエンドのセキュリティ脆弱性がアプリケーション全体に与える影響を理解し、セキュアなシステム開発への意識を高めていきましょう。