フォームハイジャックでCSPをすり抜ける――見落とされがちな抜け道と現実的な防御策
概要
元ソースは PortSwigger Research の記事「Using form hijacking to bypass CSP」です。本稿はその内容を起点に、CSP(Content Security Policy)が強固に見える構成でも、フォーム送信(<form> の送信先)という経路が盲点になり得ることを、防御の観点から整理します。
CSPは本来、XSSなどを起点にした外部リソース読み込みやスクリプト実行を制限し、被害を抑えるための仕組みです。しかし、CSPの設定が「スクリプト実行の制限」には厳格でも、「フォームがどこへ送信できるか」を明示的に縛っていない場合、攻撃者がページ内のフォーム送信先を意図しない宛先へ変えて情報を抜き取る(フォームハイジャック)余地が残ります。見た目の“厳格さ”と、データ流出の“実効的な防止”が一致しない典型例です。
この論点が厄介なのは、開発者や監査担当がCSPの評価を「script-src が強いか」「unsafe-inline がないか」といった観点に寄せがちな一方で、アプリが実際に扱う最重要データ(認証情報、CSRFトークン、個人情報など)がフォームで送られているケースが多いからです。フォーム送信は“ページが正しく見える限り”ユーザーが操作してしまうため、影響が大きくなりやすい領域でもあります。
詳細
フォームハイジャックのポイントは、CSPで「何が実行できるか」を抑えても、「どこへデータが送れるか」を抑えていなければ、データの出口が残るという点です。PortSwiggerのナレッジベースでも、フォーム送信先を制御するためにCSPの form-action ディレクティブを用いることが推奨されています。CSPは万能の“XSS無効化装置”ではなく、ポリシーの適用範囲を正しく設計して初めて効果が出る、という理解が重要になります。
また、PortSwiggerのWeb Security Academyには、非常に厳格なCSPで保護されているように見える状況でも「dangling markup attack」を絡めたフォームハイジャックによって、(ラボ上で模擬的に)トークンの流出が成立することを扱う教材があります。ここで示唆されるのは、CSPの強度だけでなく、HTMLの解釈のされ方やマークアップの崩れ(ぶら下がり)といった“レンダリング/パースの現実”が、結果としてデータフローに影響し得る点です。
さらにPortSwigger Researchには、CSPを巡る別のバイパス研究として「dangling iframes」や「policy injection」も公開されています。これらは手口自体は異なるものの、「CSPが意図した制約が、別の経路(ブラウザの挙動や境界の取り方)で迂回される」ことがあり得る、という共通の注意点を与えます。運用上は、単一の“強い設定”に頼るのではなく、設計・入力処理・テンプレート・境界防御を合わせて考える姿勢が求められます。
防御側がまず押さえるべき実務ポイントは次の通りです。
- フォーム送信先の制限をCSPで明示する: フォームが送信できる宛先を
form-actionで制御し、想定外のオリジンへ送れないようにします。 - 「CSPが厳格=安全」という評価を避ける:
script-srcが厳しいことは有益でも、アプリの“データの出口”を塞いでいるかは別問題です。特にログイン/再認証/決済など、フォームを通る重要操作は重点的に見ます。 - 学習用ラボや既知の問題分類を活用してレビュー観点を固定化する: PortSwiggerの教材・知見は、レビュー時のチェックリスト化に向いています(「フォーム送信の制御があるか」など)。
CSPヘッダの例(あくまで防御側の設定例)としては、少なくともフォーム送信の宛先をアプリ自身に限定する、といった方針が検討対象になります。
Content-Security-Policy: default-src 'none'; base-uri 'none'; form-action 'self'
もちろん、実際のポリシーはアプリの要件(CDN、外部ID連携、決済、埋め込みなど)に合わせて設計が必要です。重要なのは「フォーム送信」が許可リストに含まれているか、そしてそれが“意図した範囲にだけ”許可されているかを、CSP設計の必須項目として扱うことです。
最後に、LinkedIn上でも本テーマは共有・議論されており、CSPを導入している組織ほど「これで安心」という心理が働きやすい点がうかがえます。防御を強化するうえでは、設定の厳しさを誇るより、情報がどの経路で出ていくかを地道に洗い出し、ポリシーで封じることが最短距離になります。
出典
- 元ソースUsing form hijacking to bypass CSPPortSwigger Research
- Lab: Reflected XSS protected by very strict CSP, with dangling markup attack | Web Security Academyportswigger.net
- Content security policy: allows form hijacking - PortSwiggerportswigger.net
- Bypassing CSP with dangling iframes | PortSwigger Researchportswigger.net
- Bypassing CSP with policy injection | PortSwigger Researchportswigger.net
- Kiowa Security's Post - Using form hijacking to bypass CSP - LinkedInlinkedin.com