[解説] Next.jsのrewrites/redirectsにおけるSSRF/Open Redirect脆弱性 (CVE-2026-64645)
はじめに - Next.jsのrewrites/redirectsにおける重大な脆弱性
日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、Next.jsのアプリケーションに影響を及ぼす可能性のある、深刻度「High」の脆弱性(GHSA-p9j2-gv94-2wf4 / CVE-2026-64645)について解説します。この脆弱性は、Next.jsの`rewrites`および`redirects`機能の設定方法によっては、あなたのNext.jsサーバーが悪意のある通信の中継点となったり、ユーザーを危険なサイトへ誘導したりするリスクを抱えています。特に、URLの宛先がユーザー入力に基づいて動的に構築されている場合に影響を受けます。
脆弱性の概要とリスク
この脆弱性は、Next.jsの`rewrites()`や`redirects()`機能で、外部の宛先URL(`destination`)のホスト名部分がユーザーからの入力(例えば、URLのパスやクエリパラメータなど)に基づいて動的に生成される場合に発生します。
攻撃者は、ユーザー入力を巧みに操作することで、本来意図しない任意のホスト名(外部の悪意あるサーバーや、通常は外部からアクセスできない社内ネットワーク内のサーバーなど)を宛先として指定できてしまいます。
この脆弱性が悪用された場合、主に以下の2つの重大なリスクが生じます。
`rewrites()`が影響を受ける場合、Next.jsサーバーが攻撃者の指定した任意のサーバーにリクエストを「代理」で送信し、その応答をあたかも自身のアプリケーションの応答であるかのようにクライアントに返してしまいます。これにより、攻撃者はNext.jsサーバーからしかアクセスできない内部システム(社内API、データベース、管理コンソールなど)にアクセスしたり、機密情報を取得したり、不正な操作を行ったりする可能性があります。これは、社内ネットワークへの侵入経路を提供することになりかねません。
`redirects()`が影響を受ける場合、ユーザーは攻撃者の指定した任意のURLにリダイレクトされてしまいます。これは、フィッシング詐欺(偽のログインページに誘導)やマルウェアの配布サイトへの誘導など、他の攻撃と組み合わせて悪用される可能性があり、ユーザーのセキュリティを大きく損ないます。
具体的にどのような設定が影響を受けるのか
この脆弱性の影響を受けるのは、`next.config.js`内で以下のような設定をしているケースです。特に、`destination`のホスト名部分に、`source`で取得した動的なセグメント(例: `:tenant`や`:region`)を直接埋め込んでいる場合に注意が必要です。
```javascript
// next.config.js の例
// source: '/:tenant' から :tenant を取得し、動的にホスト名を構築している場合
async rewrites() {
return [
{
source: '/tenant/:tenant_id',
destination: 'https://:tenant_id.api.example.com/data',
},
];
},
// クエリパラメータの 'region' から :region を取得し、動的にホスト名を構築している場合
async redirects() {
return [
{
source: '/go/:region',
destination: 'https://:region.external-site.com/home',
permanent: false,
},
];
}
```
上記の例では、`destination`のホスト名部分が`:`に続くプレースホルダーによってユーザー入力に依存しています。攻撃者は、このプレースホルダーに予期しない文字列(例: `evil.com` や `192.168.1.1` など)を挿入することで、任意のサーバーへ通信を誘導できてしまいます。
今すぐできる対策
この脆弱性への対策は、Next.jsのバージョンアップが最も推奨されますが、すぐにアップグレードできない場合でも以下の対策を適用してください。
最も根本的な対策は、`rewrites()`や`redirects()`の`destination`における外部宛先URLのホスト名部分を、ユーザーが制御する入力から構築しないように設定を変更することです。固定のホスト名を使用するか、ホワイトリスト形式で許可されたホスト名のみを許可するようにします。
もし、動的なサブドメインがどうしても必要な場合は、ユーザー入力として受け付ける値を厳密に検証し、ホスト名として安全な文字(例: 小文字の英数字とハイフンのみ)に正規表現で制限してください。
Next.jsのルーティングでは、正規表現を使ってパラメータの値を制限できます。以下のように`value`オプションで正規表現を指定することで、攻撃者が任意のホスト名を挿入するのを防げます。
```javascript
// next.config.js の例(安全な設定)
async rewrites() {
return [
{
// :tenant_id の値を小文字英数字とハイフンのみに制限
source: '/tenant/(?<tenant_id>[a-z0-9-]+)',
destination: 'https://:tenant_id.api.example.com/data',
},
];
}
```
このように、`(?<param_name>[a-z0-9-]+)` のように厳密な正規表現を適用することで、ユーザーからの入力が想定外のホスト名を形成するのを防ぐことができます。
まとめ
Next.jsの`rewrites`および`redirects`機能は非常に強力ですが、その設定方法によってはSSRFやOpen Redirectといった重大なセキュリティリスクを招く可能性があります。特にユーザー入力に基づいて外部URLのホスト名を動的に構築している場合は、直ちに設定を見直し、上記の対策を適用してください。安全なアプリケーション開発のために、常に最新のセキュリティ情報をチェックし、適切な対策を講じることが重要です。