[緊急警報] Angular SSRに深刻なSSRF脆弱性 (CVE-2026-50168)!フロントエンドエンジニアが知るべき詳細と対策
はじめに:Angular SSRユーザーへ緊急のお知らせ
日本のAngularフロントエンドエンジニアの皆さん、こんにちは!今回は、皆さんのプロジェクトに深刻な影響を与える可能性のある、AngularのServer-Side Rendering (SSR) 機能に関する重大な脆弱性(GHSA-xrxm-cp7j-8xf6 / CVE-2026-50168)について詳しく解説します。この脆弱性は「High」という高い深刻度に分類されており、適切な対策を怠ると、ユーザーの機密情報が漏洩したり、悪意のあるコンテンツが表示されたりする危険性があります。
特に、Angular Universal (@angular/platform-server) を使用しているプロジェクトでは、ご自身のアプリケーションが影響を受ける可能性がないか、この機会にしっかりと確認してください。
脆弱性の概要:なぜSSRFが発生するのか?
この脆弱性は、Server-Side Request Forgery (SSRF) と呼ばれるもので、サーバーが内部的に行うリクエストを攻撃者が意図しない外部サーバーへ強制的に送信させてしまうものです。Angular SSRの場合、URLの解析を行うパーサーの挙動の違いが原因で発生します。
具体的には、許可されたホストかどうかを検証する際には「厳格なWHATWG URLパーサー」が使われる一方で、サーバーがエミュレートするDOMを初期化する際には「より寛容なDomino URLパーサー」が使われます。この厳格さの違いが悪用されるのです。
攻撃者は、例えば `http://evil.com:80:80/path` のような「ポート番号が二重になった不正なURL」を送信します。この時、何が起こるか見てみましょう。
1. **ホストの許可リストチェック時:** Node.jsで使われる厳格な `URL.canParse()` 関数は、この二重ポート番号のURLを「無効な形式」と判断します。これにより、Angular SSRのホスト許可リスト(`allowedHosts`)によるチェックがスキップされてしまいます。つまり、本来ブロックされるべきURLがチェックをすり抜けるのです。
2. **DOM初期化時:** 同じ不正なURLが、次にDominoの内部パーサーによって解析されます。Dominoはより寛容なため、これを有効なURL (`http://evil.com:80`) として解釈してしまいます。
結果として、Angular SSRアプリケーション内で実行される相対パスのバックエンドHTTPリクエスト(例: `this.http.get('/api/data')`)は、この不正に設定されたオリジンに基づいて解決され、攻撃者が制御する外部サーバーへ送信されてしまうのです。本来のバックエンドサービスへのリクエストが、意図しない外部に流れてしまうという恐ろしい事態が発生します。
具体的な影響
このSSRF脆弱性により、以下のような深刻な影響が考えられます。
1. **機密情報の漏洩:** SSRアプリケーションが内部的に利用するAPIリクエストには、ユーザーのセッションクッキー、内部認証トークン、その他の機密性の高い認証情報が含まれることがあります。これらが攻撃者のサーバーに送信され、情報漏洩につながる可能性があります。
2. **コンテンツ汚染とレスポンスインジェクション:** 攻撃者はエミュレートされたDOMに任意のコンテンツを注入できるため、SSRによって生成されるHTMLに悪意のあるスクリプトやコンテンツを紛れ込ませることができます。これにより、ユーザーに誤った情報が表示されたり、さらなる攻撃(XSSなど)の足がかりにされたりする危険があります。
攻撃が成立する条件:あなたのプロジェクトは大丈夫?
この脆弱性が悪用されるには、以下の4つの条件がすべて満たされている必要があります。ご自身のAngular SSRプロジェクトが当てはまるか確認してみてください。
1. **アクティブなServer-Side Rendering (SSR):** アプリケーションがAngular Server-Side Rendering (`@angular/platform-server`) を使用して設定されていること。
2. **Hostヘッダ/URIの伝播:** SSRハンドラが、クライアントからの生のリクエスト入力(`Host`ヘッダや絶対形式URIなど)を使用してリクエストURLを再構築し、それを`renderApplication`または`renderModule`関数の`config.url`として渡していること。
3. **外部への相対HTTPリクエスト:** サーバアプリケーションが、相対パス(例: `this.http.get('/api/data')`)でバックエンドAPIリクエストを実行しており、それがベースURLインターセプターによる書き換えの対象となること。
4. **`allowedHosts`チェックの有効化:** サーバが、Angularフレームワーク提供の`allowedHosts`オプションを使用して、有効なサーバロケーションを制限していること。(この許可リストが、上記のパーサー挙動の違いによりバイパスされます。)
対策:今すぐアップデートを!
この脆弱性に対応するためには、速やかにAngular関連パッケージを以下のバージョンへアップデートすることが強く推奨されます。
- **22.0.0-rc.2** (またはそれ以降の安定版)
- **21.2.15**
- **20.3.22**
- **19.2.23**
これらのバージョンには、脆弱性を修正するためのパッチが含まれています。バージョンアップを行うことで、このSSRF攻撃からアプリケーションを保護できます。
まとめ
Angular SSRは強力な機能ですが、その特性上、サーバーサイドのセキュリティリスクにも注意を払う必要があります。今回のSSRF脆弱性 (CVE-2026-50168) は、URLパーサーの挙動の違いという、一見すると見過ごされがちな部分を突いた巧妙な攻撃です。
ご自身のプロジェクトが影響範囲に該当しないか確認し、対象となる場合は、セキュリティパッチが適用されたバージョンへの速やかなアップデートをお願いします。日頃から依存ライブラリのセキュリティ情報にアンテナを張り、安全なアプリケーション開発を心がけましょう!