[緊急警報] Next.jsのi18nとMiddleware併用時の認証バイパス脆弱性 (CVE-2026-44573) を徹底解説
はじめに:Next.jsを使っているあなたへ
Next.jsは、現代のWebフロントエンド開発において非常に強力なフレームワークであり、多くの開発者に愛用されています。特にPages Routerは、シンプルながらもSSR(サーバーサイドレンダリング)やSSG(静的サイト生成)などの高度な機能を提供し、大規模なアプリケーションから小規模なサイトまで幅広く活用されています。
しかし、この度Next.jsのPages Routerにおいて、特定の条件下で認証メカニズムがバイパスされてしまう深刻な脆弱性(CVE-2026-44573 / GHSA-36qx-fr4f-26g5)が報告されました。この脆弱性は、適切に保護されているはずの機密データが、認証されていないユーザーにも露出してしまうリスクを孕んでいます。日本のNext.js開発者の皆さんは、必ず本記事を読み、ご自身のプロジェクトが影響を受けるか確認し、速やかな対応を取ることを強く推奨します。
脆弱性の概要:なぜ認証がすり抜けられるのか?
この脆弱性は、「Pages Router」「i18n(国際化機能)」「Middlewareまたはプロキシによる認証」という3つの要素が組み合わさったときに発生します。
通常、Next.jsアプリケーションで保護されたページへのアクセスには、Middlewareやプロキシを用いて認証・認可のチェックを行います。例えば、ユーザーがログインしているかを確認し、未認証であればログインページへリダイレクトするといった処理です。これは、`_middleware.ts`ファイルに記述したり、リバースプロキシで設定したりすることで実現します。
問題は、Next.jsがPages Routerでi18nを設定している場合に、特定のデータ取得リクエストがMiddlewareの処理から
通常のナビゲーション(例: `/ja/dashboard`)ではMiddlewareが正しく動作しますが、Next.jsのSSRやSSGで生成されたデータは、`/_next/data/<buildId>/<page>.json`のような形式で取得されます。i18nが有効な場合、通常このデータリクエストもロケール情報を含んでおり(例: `/_next/data/<buildId>/ja/dashboard.json`)、Middlewareの対象となります。しかし、脆弱性のあるバージョンでは、ロケール情報を含まない形式(例: `/_next/data/<buildId>/dashboard.json`)でデータをリクエストした場合、Next.jsのルーティングロジックがこれをi18nルートとして認識せず、Middlewareをスキップしてしまうのです。
結果として、認証されていないユーザーでも、本来Middlewareによって保護されるべきページのJSONデータ(つまり、SSRによってサーバー側でレンダリングされた結果のデータ)を直接取得できてしまい、機密情報が漏洩する可能性があります。これは、認証済みユーザーしか見ることのできない、ユーザー固有の情報や管理情報などが含まれる場合、非常に深刻な問題となります。
影響を受けるアプリケーションの条件
以下の条件をすべて満たすNext.jsアプリケーションがこの脆弱性の影響を受けます。
1. **Next.jsのPages Routerを使用していること**:App Routerを使用している場合は影響を受けません。
2. **`next.config.js`で`i18n`が設定されていること**:国際化機能を利用しているアプリケーションが対象です。
3. **Middlewareまたはプロキシによって認証・認可を実装し、それが唯一の認証手段となっていること**:特に`_middleware.ts`などでアクセス制御を行っている場合に該当します。
これらを確認し、一つでも当てはまる場合は、あなたのアプリケーションが危険にさらされている可能性があります。
速やかに取るべき対策
この脆弱性に対する最も推奨される対策は、Next.jsの修正版へのアップグレードです。バージョンによって修正が含まれるバージョンが異なりますので、公式のアナウンスやGitHubのGHSA情報(GHSA-36qx-fr4f-26g5)で確認し、速やかに最新の安定版へアップグレードしてください。修正版では、ルーティングの照合ロジックが更新され、i18nデータルートに対してもMiddlewareが正しく実行されるようになっています。
**【すぐにアップグレードできない場合のワークアラウンド】**
緊急でアップグレードが困難な場合でも、以下のワークアラウンドを適用することでリスクを軽減できます。
Middlewareだけに認証を依存させるのではなく、**各ページのサーバーサイドデータ取得処理(例: `getServerSideProps`関数内など)でも別途認証チェックを実装**し、そこで認可されていないアクセスを拒否する対策が有効です。これにより、Middlewareがバイパスされたとしても、`getServerSideProps`が意図しないデータ漏洩を防ぐ最後の砦となります。
```javascript
// pages/protected-page.tsx (例)
export async function getServerSideProps(context) {
const user = await authenticateUser(context.req);
if (!user) {
// 認証されていない場合はログインページへリダイレクト、または403エラーを返す
return {
redirect: {
destination: '/login',
permanent: false,
},
};
}
// 認証済みの場合のみデータを取得
const data = await fetchProtectedData(user);
return {
props: { data },
};
}
```
まとめと今後の注意
Next.jsのPages Routerでi18nとMiddlewareを併用している環境は、認証バイパスの脆弱性により、保護されたデータが漏洩する危険性があります。これはアプリケーションのセキュリティにとって非常に深刻な問題であり、ユーザーのプライバシーや企業の機密情報に関わる可能性があります。
速やかなNext.jsのバージョンアップが最善の解決策ですが、それが難しい場合は`getServerSideProps`などでの追加の認証チェックを必ず実装してください。
今回の件を教訓に、Next.jsに限らず、使用しているライブラリやフレームワークのセキュリティ情報を常にチェックし、迅速な対応を心がけることが、フロントエンドエンジニアとしての責任であり、安全なWebアプリケーションを提供する上で不可欠です。ご自身のプロジェクトの状況を今一度確認し、適切な対策を講じてください。