Web セキュリティ

クリックジャッキング

約 3 分で読めます

クリックジャッキングとは

クリックジャッキング (Clickjacking) とは、透明または不可視の iframe を使って正規の Web ページをユーザーの画面上に重ね、ユーザーが意図しないクリック操作を誘導する攻撃手法です。見えている UI の上に別の内容を重ねてユーザーを錯覚させる攻撃群は UI Redressing (UI の偽装) と総称され、クリックジャッキングはその代表例です。

攻撃者は罠となるページを作成し、その上に標的サイトを透明な iframe で重ねます。ユーザーには罠ページのボタンやリンクが見えていますが、実際にクリックしているのは透明な iframe 内の標的サイトの要素です。これにより、ユーザーが気づかないうちに「いいね」の押下、設定の変更、送金の承認などの操作が実行されます。

攻撃の仕組みと手口

クリックジャッキングは以下の手順で実行されます。

  1. 攻撃者が罠となる Web ページを作成する。魅力的なコンテンツ (動画再生ボタン、ゲーム、懸賞応募フォームなど) を配置する
  2. 標的サイトを iframe で読み込み、CSS で opacity: 0 (完全に透明) に設定する
  3. 透明な iframe を罠ページのクリック可能な要素の上に正確に重ねる
  4. ユーザーが罠ページのボタンをクリックすると、実際には透明な iframe 内の標的サイトのボタンがクリックされる

発展的な手口

  • ドラッグ & ドロップの悪用: ユーザーのドラッグ操作を利用して、透明な iframe 内のフォームにデータを入力させる
  • カーソル表示の偽装: CSS でカーソルの画像を差し替えたり隠したりして、見かけのカーソル位置を実際のクリック位置からずらし、意図しない場所をクリックさせる
  • マルチステップ攻撃: 複数のクリックを誘導し、確認ダイアログの「OK」ボタンまでクリックさせる

XSS や CSRF と組み合わされることで、より複雑な攻撃シナリオが構築される場合もあります。

防御策の実装

クリックジャッキングの防御は、自サイトが他サイトの iframe に埋め込まれることを防ぐことが核心です。

CSP frame-ancestors ディレクティブ

CSP の frame-ancestors ディレクティブは、自サイトを iframe に埋め込める親ページのオリジンを制御します。CSP Level 2 で X-Frame-Options の後継として導入されたもので、両方が指定された場合は frame-ancestors を適用し X-Frame-Options を無視する、と CSP 仕様に定められています。これから設定するならこちらが基準になります。

  • frame-ancestors 'none': どのサイトにも iframe での埋め込みを許可しない
  • frame-ancestors 'self': 同一オリジンからの埋め込みのみ許可する
  • frame-ancestors https://trusted.example.com: 特定のオリジンからの埋め込みのみ許可する

X-Frame-Options ヘッダー

2009 年から 2010 年にかけてブラウザ各社が非標準のヘッダーとして導入し、2013 年に RFC 7034 (Informational) として文書化された対策です。使う値は次の 2 つです。

  • X-Frame-Options: DENY: すべての iframe 埋め込みを拒否
  • X-Frame-Options: SAMEORIGIN: 同一オリジンからの埋め込みのみ許可

仕様には ALLOW-FROM <URI> という 3 つ目の値もありますが、主要ブラウザで動作しないため使いません。対応していないブラウザでは指定が丸ごと無視され、防御が何も残らない状態になります。

もう一つの落とし穴が SAMEORIGIN の照合範囲です。多くのブラウザは最上位の文書のオリジンだけを照合する実装になっているため、自サイトのページを自サイトの iframe に読み込み、その全体を攻撃者のページが最上位で囲む入れ子の構成をすり抜けます。frame-ancestors は祖先のフレームを 1 つずつ照合するので、この抜け穴がありません。

両方を設定しておけば、frame-ancestors に対応するブラウザではそちらが適用され、対応しないブラウザでは X-Frame-Options が働きます。重複して指定しても互いに打ち消し合うことはありません。

JavaScript による防御 (フレームバスティング)

if (top !== self) { top.location = self.location; } のようなスクリプトで、iframe 内に読み込まれた場合にトップフレームに脱出する手法です。ただし、攻撃者が sandbox 属性で JavaScript の実行を制限できるため、HTTP ヘッダーによる対策の補助としてのみ使用すべきです。

実務での対策チェックリスト

クリックジャッキング対策を確実に実装するためのチェックリストです。

  • セキュリティヘッダーの設定確認: すべてのページのレスポンスに X-Frame-Options: DENY (または SAMEORIGIN) と CSP frame-ancestors が含まれていることを確認する
  • iframe の埋め込みが必要なページの特定: 決済フォームの埋め込みなど、正当な理由で iframe を許可する必要があるページは、許可するオリジンを厳密に制限する
  • 重要な操作の保護: パスワード変更、送金、アカウント削除などの重要な操作には、CSRF トークンに加えて再認証 (パスワードの再入力) を要求する
  • HSTS の併用: HTTPS を強制し、中間者攻撃によるセキュリティヘッダーの除去を防ぐ
  • 定期的なテスト: 自サイトが iframe に埋め込み可能かどうかを定期的にテストする。ブラウザの開発者ツールやセキュリティスキャナーで検証できる

クリックジャッキングは単独では大きな被害に見えないこともありますが、ソーシャルエンジニアリングと組み合わせることで、ユーザーに気づかれずに重要な操作を実行させる強力な攻撃手法です。HTTP ヘッダーの設定だけで防御できるため、対策コストに対する効果が非常に高いセキュリティ施策です。

よくある誤解

クリックジャッキングは古い攻撃手法で現在は脅威ではない
成立条件は「自サイトが他サイトの iframe に読み込めること」だけであり、X-Frame-Options も CSP frame-ancestors も設定していないページでは 2026 年時点でも成立する。1 クリックで結果が確定する UI (SNS の共有ボタン、OAuth の認可画面、設定の切り替えなど) を持つサイトは、公開時期にかかわらず自分のレスポンスヘッダーを確認する必要がある。
JavaScript のフレームバスティングだけで十分に防御できる
攻撃者は iframe の sandbox 属性で JavaScript の実行を制限したり、onbeforeunload イベントでフレーム脱出を妨害したりできる。HTTP ヘッダー (X-Frame-Options、CSP frame-ancestors) による防御が必須であり、JavaScript は補助的な対策にすぎない。
共有する

関連用語

関連記事