[重要] Astro SSRアプリのSSRF脆弱性 (CVE-2026-54299) と対策
はじめに
Astroを使用している日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、AstroのSSR(Server-Side Rendering)アプリケーションに発見された深刻なSSRF(Server-Side Request Forgery)脆弱性(CVE-2026-54299)について解説します。この脆弱性は高い深刻度と評価されており、本番環境で使用している場合は早急な対策が必要です。皆さんのアプリケーションを安全に保つため、この情報を最後までお読みください。
脆弱性の概要と仕組み
この脆弱性は、AstroのSSRアプリケーションで「事前レンダリングされたエラーページ」(例: `/404`や`/500`ページで`export const prerender = true`が設定されている場合)が存在するケースに影響します。通常、Astroアプリでエラーが発生すると、サーバーはこれらのエラーページを取得するために内部的にHTTPリクエストを発行します。
問題は、この内部リクエストのURLの「オリジン(ドメイン部分)」が、ユーザーからのHTTPリクエストに含まれる`Host`ヘッダーから生成される点にありました。そして、この`Host`ヘッダーが`allowedDomains`オプションによって適切に検証されていなかったため、攻撃者は`Host`ヘッダーを任意のドメインに偽装できました。
結果として、Astroサーバーが攻撃者指定の不正なURLに対して内部的にリクエストを送信し、そのレスポンスを攻撃者が読み取ることが可能となる「Server-Side Request Forgery (SSRF)」の状態が引き起こされました。これにより、サーバー内部の機密情報が外部に漏れたり、外部のサーバーへの不正なリクエストが強制されたりするリスクがあります。
影響を受ける条件
以下の**両方の条件**を満たすAstroのSSRデプロイメントが本脆弱性の影響を受けます。
1. **事前レンダリングされた404または500ページが存在する**: 例えば、`src/pages/404.astro`や`src/pages/500.astro`などで`export const prerender = true`が設定されている場合です。
2. **`astro/app/node`から`createRequestFromNodeRequest`関数を使って`app.render()`を呼び出しており、かつ`prerenderedErrorPageFetch`オプションを明示的にオーバーライドしていない場合**: これには、カスタムサーバーを構築しているケースや、一部のサードパーティ製アダプターが含まれる可能性があります。
影響を受けないケース
以下の場合は、本脆弱性の影響を受けません。
* **`@astrojs/node`バージョン9.5.4以上を使用している場合**:これらのバージョンでは、エラーページをディスクから直接読み込むため影響を受けません。
* **`@astrojs/cloudflare`を使用している場合**:Cloudflare WorkersのASSETSバインディングを利用するため影響を受けません。
* **開発サーバーを使用している場合**:開発サーバーはエラーページをプロセス内で直接レンダリングするため影響を受けません。
攻撃の具体例
`createRequestFromNodeRequest`関数は、受信したHTTPリクエストの`Host`ヘッダーから`request.url`を構築します。この際、`allowedDomains`オプションは`X-Forwarded-For`ヘッダーの検証には使われていましたが、URLのオリジン自体を制約する機能はありませんでした。
攻撃者は、`Host: attacker-host:port`のように偽装した`Host`ヘッダーを含むリクエストをAstroサーバーに送信します。同時に、サーバーが404または500エラーを発生させるような、存在しないパスへのアクセスなどを行います。
サーバーがエラーを検知し、事前レンダリングされたエラーページをフェッチしようとする際、偽装された`Host`ヘッダーから得られた攻撃者指定のオリジン(`attacker-host:port`)に対して内部リクエストが送られてしまいます。その結果、攻撃者は、Astroサーバーが取得した任意のホストからのレスポンスボディを、自身のクライアントで受け取ることができてしまいます。これにより、本来アクセスできないはずの内部ネットワークリソースへのアクセスや、外部サービスへの不正なリクエストが実行される可能性があります。
今すぐ行うべき対策
本脆弱性への対策として、Astroのコアチームは迅速に修正をリリースしました。現在は、エラーページをフェッチする際のオリジンは、使用前に`allowedDomains`に対して厳密に検証されるようになっています。検証が成功した場合は元のオリジンがそのまま使用されますが、検証に失敗した場合は安全のために`localhost`にフォールバックしてリクエストが行われるようになりました。
さらに、フェッチ処理全体が`try/catch`ブロックで囲まれるように改善され、ネットワーク接続の失敗時などでもサーバーが予期せず停止することなく、安全に一般的なエラーレスポンスを返すようになりました。
**ユーザーの皆さんへの推奨事項**:ご自身のAstroプロジェクトで利用しているバージョンを確認し、本脆弱性の影響を受ける場合は、**速やかに最新バージョンまたは修正が含まれるバージョンにアップデートしてください**。特に、カスタムサーバーを使用している場合や、影響を受ける条件に該当する場合は、早急な対応が求められます。
まとめ
AstroのSSRアプリケーションにおけるSSRF脆弱性は、サーバー内部のリソースへの不正アクセスや情報漏洩に繋がる可能性のある、非常に危険な問題です。フロントエンドエンジニアとして、依存関係の脆弱性には常に注意を払い、迅速なアップデートと適切な設定を行うことが不可欠です。本記事が皆さんのアプリケーションを安全に保つ一助となれば幸いです。不明な点があれば、Astroの公式ドキュメントやコミュニティフォーラムも参照してください。