概要

クリックジャッキング(Clickjacking、別名 UI Redressing)は、正規サイトを透明化した iframe として罠サイトの上に重ね、ユーザに見えているボタンとは異なる要素をクリックさせる攻撃です。ユーザは自分の意図した操作をしているつもりでも、実際には攻撃者が仕込んだ別の操作(アカウント設定変更・SNSのフォロー・不正送金の承認など)を実行させられます。SC試験では、レスポンスヘッダによる対策の理解と、混同しやすいCSRFとの区別が問われます。

仕組みと動作原理

透明iframeによる基本的な攻撃手口

攻撃者は罠サイト上に、正規サイトのページを opacity: 0 などで透明化した iframe を重ね、その真上に「クリックしたくなる」おとりのボタンを配置します。ユーザはおとりボタンをクリックしたつもりでも、実際には透明な iframe 内の正規サイトのボタン(例:「アカウントを削除」「フォローする」)をクリックしています。

<style>
  iframe {
    position: absolute;
    top: -300px; left: -50px;
    width: 500px; height: 500px;
    opacity: 0.0001;   /* 透明化してユーザに見えなくする */
    z-index: 2;
  }
  .decoy-button {
    position: absolute;
    top: 250px; left: 100px;
    z-index: 1;         /* おとりボタンを下層に配置し重ねて見せる */
  }
</style>
<button class="decoy-button">豪華賞品が当たる!クリック</button>
<iframe src="https://sns.example.com/follow?user=attacker"></iframe>
クリックジャッキング攻撃の流れ
1
被害者
対象サイトに認証済みでログイン中
Cookieを保持
2
攻撃者
罠サイトに誘導
正規サイトを透明iframeとして重ねる
3
被害者
おとりのボタンをクリックしたつもりになる
実際は透明iframe内の正規サイトの操作ボタンをクリック
4
正規サイト
被害者本人の正規操作として処理を実行
意図しない設定変更・フォロー・送金承認等

クリックジャッキングとCSRFの違い

一見似ていますが、攻撃の成立条件と防げる対策層が異なります。

観点クリックジャッキングCSRF
悪用する仕組み画面表示(iframe重ね合わせ)による視覚的な錯誤Cookieの自動送信
ユーザの関与ユーザが実際にクリック操作を行う(誘導される)ユーザは何もクリックせずリクエストが自動送信される場合もある
有効な対策X-Frame-Options / CSP frame-ancestors(フレーム化の禁止)CSRFトークン / SameSite Cookie
トークン対策の効果CSRFトークンがあっても無効(正規ページをそのまま操作させるため)CSRFトークンで防止可能
攻撃対象になりやすい機能ワンクリックで完結する操作(フォロー・いいね・設定変更)フォーム送信を伴う操作全般
クリックジャッキング と CSRF の比較
クリックジャッキング CSRF
悪用する仕組み
画面表示(iframe重ね合わせ)の錯誤
Cookieの自動送信
ユーザの関与
実際にクリックさせられる
自動送信されクリック不要な場合も
有効な対策
X-Frame-Options / frame-ancestors
CSRFトークン / SameSite Cookie
CSRFトークンの効果
無効(正規ページをそのまま操作)
有効

CSRFトークンはフォーム送信の「なりすまし」を防ぐ対策であり、クリックジャッキングでは攻撃者は被害者に本物の正規ページを操作させているため、トークンの有無に関係なく成立してしまう点が重要な違いです。

対策:フレーム化の禁止

X-Frame-Options ヘッダ

動作
DENYいかなるサイトからも iframe 埋め込みを禁止
SAMEORIGIN同一オリジンからの iframe 埋め込みのみ許可
ALLOW-FROM uri指定したオリジンのみ許可(非推奨・多くのブラウザで非対応)

CSP(Content Security Policy)の frame-ancestors ディレクティブ

Content-Security-Policy: frame-ancestors 'self';

frame-ancestorsX-Frame-Options の後継であり、複数オリジンの許可リストなど柔軟な指定ができます。両方のヘッダを併用し、frame-ancestors 対応ブラウザではそちらが優先されるようにするのが実務上の推奨です。

JavaScriptによるフレームバスティング(補助的対策)

if (top !== self) {
  top.location = self.location;
}

ヘッダによる対策が確実であり、JavaScriptのみに頼るのは推奨されません(sandbox 属性で無効化されるケースがあるため)。

亜種:Cursorjacking と Likejacking

亜種手口
CursorjackingCSSでカーソル画像をずらして表示し、実際のクリック位置を誤認させる
LikejackingSNSの「いいね」ボタンを透明化して重ね、意図せず拡散に加担させる
Filejackingファイル選択ダイアログを悪用し任意のローカルファイルをアップロードさせる古典的な派生手口

いずれも透明化・視覚的な誤誘導という共通原理を持つUI Redressing攻撃の一種です。

SC試験での頻出ポイント

  • X-Frame-Options / frame-ancestors の使い分けframe-ancestors はCSPディレクティブであり X-Frame-Options の後継として策定された
  • CSRFトークンでは防げない理由:被害者は正規ページをそのまま操作しているため、なりすましリクエストを防ぐCSRF対策は無効
  • DENYSAMEORIGIN の選択:外部埋め込みを一切許容しない設計であれば DENY が最も安全
  • ワンクリック操作が狙われやすい:確認ダイアログなしで完結する機能(フォロー・購読・設定変更)がターゲットになりやすい
  • 重要操作への再確認の追加:フレーム対策に加え、金銭が絡む操作等ではパスワード再入力等の追加確認も有効な多層防御

よくある誤問・ひっかけパターン

誤り① 「クリックジャッキングはCSRFトークンを導入すれば防げる」→ 。クリックジャッキングは正規ページそのものをユーザに操作させる攻撃のため、CSRFトークンの有無は無関係です。有効なのはフレーム化を禁止する X-Frame-Options / frame-ancestors です。

誤り② 「JavaScriptのフレームバスティングコードがあれば十分な対策になる」→ 不十分iframesandbox 属性でJavaScriptの実行を制限されると無効化されるため、確実性の高いHTTPレスポンスヘッダによる対策が基本です。

誤り③ 「クリックジャッキングは古い攻撃で現代のブラウザでは発生しない」→ 。ブラウザ自体はフレーム化を制限しません。サーバ側が明示的に X-Frame-Optionsframe-ancestors を設定しない限り、現代でも成立します。

関連用語

重要キーワード

用語説明
クリックジャッキング(UI Redressing)透明なiframeを重ねて意図しないクリックを誘発する攻撃
X-Frame-Optionsページの iframe 埋め込み可否を制御するレスポンスヘッダ
frame-ancestorsCSPのディレクティブ。X-Frame-Optionsの後継でフレーム化元を制御
Cursorjackingカーソル表示をずらしてクリック位置を誤認させる亜種
LikejackingSNSの「いいね」ボタンを透明化して悪用する亜種
フレームバスティングJavaScriptで iframe 内表示を検知・回避する補助的対策