概要
クリックジャッキング(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>
クリックジャッキングとCSRFの違い
一見似ていますが、攻撃の成立条件と防げる対策層が異なります。
| 観点 | クリックジャッキング | CSRF |
|---|---|---|
| 悪用する仕組み | 画面表示(iframe重ね合わせ)による視覚的な錯誤 | Cookieの自動送信 |
| ユーザの関与 | ユーザが実際にクリック操作を行う(誘導される) | ユーザは何もクリックせずリクエストが自動送信される場合もある |
| 有効な対策 | X-Frame-Options / CSP frame-ancestors(フレーム化の禁止) | CSRFトークン / SameSite Cookie |
| トークン対策の効果 | CSRFトークンがあっても無効(正規ページをそのまま操作させるため) | 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-ancestors は X-Frame-Options の後継であり、複数オリジンの許可リストなど柔軟な指定ができます。両方のヘッダを併用し、frame-ancestors 対応ブラウザではそちらが優先されるようにするのが実務上の推奨です。
JavaScriptによるフレームバスティング(補助的対策)
if (top !== self) {
top.location = self.location;
}
ヘッダによる対策が確実であり、JavaScriptのみに頼るのは推奨されません(sandbox 属性で無効化されるケースがあるため)。
亜種:Cursorjacking と Likejacking
| 亜種 | 手口 |
|---|---|
| Cursorjacking | CSSでカーソル画像をずらして表示し、実際のクリック位置を誤認させる |
| Likejacking | SNSの「いいね」ボタンを透明化して重ね、意図せず拡散に加担させる |
| Filejacking | ファイル選択ダイアログを悪用し任意のローカルファイルをアップロードさせる古典的な派生手口 |
いずれも透明化・視覚的な誤誘導という共通原理を持つUI Redressing攻撃の一種です。
SC試験での頻出ポイント
- X-Frame-Options / frame-ancestors の使い分け:
frame-ancestorsはCSPディレクティブでありX-Frame-Optionsの後継として策定された - CSRFトークンでは防げない理由:被害者は正規ページをそのまま操作しているため、なりすましリクエストを防ぐCSRF対策は無効
DENYとSAMEORIGINの選択:外部埋め込みを一切許容しない設計であればDENYが最も安全- ワンクリック操作が狙われやすい:確認ダイアログなしで完結する機能(フォロー・購読・設定変更)がターゲットになりやすい
- 重要操作への再確認の追加:フレーム対策に加え、金銭が絡む操作等ではパスワード再入力等の追加確認も有効な多層防御
よくある誤問・ひっかけパターン
誤り① 「クリックジャッキングはCSRFトークンを導入すれば防げる」→ 誤。クリックジャッキングは正規ページそのものをユーザに操作させる攻撃のため、CSRFトークンの有無は無関係です。有効なのはフレーム化を禁止する X-Frame-Options / frame-ancestors です。
誤り② 「JavaScriptのフレームバスティングコードがあれば十分な対策になる」→ 不十分。iframe の sandbox 属性でJavaScriptの実行を制限されると無効化されるため、確実性の高いHTTPレスポンスヘッダによる対策が基本です。
誤り③ 「クリックジャッキングは古い攻撃で現代のブラウザでは発生しない」→ 誤。ブラウザ自体はフレーム化を制限しません。サーバ側が明示的に X-Frame-Options や frame-ancestors を設定しない限り、現代でも成立します。
関連用語
- CSRF(クロスサイトリクエストフォージェリ) — 混同しやすいが対策層が異なる攻撃
- XSS(クロスサイトスクリプティング) — 同じくブラウザ上で成立するクライアントサイドの脆弱性
- ファイアウォールとDMZ — HTTPヘッダによる対策と併せて多層防御を構成する要素
重要キーワード
| 用語 | 説明 |
|---|---|
| クリックジャッキング(UI Redressing) | 透明なiframeを重ねて意図しないクリックを誘発する攻撃 |
| X-Frame-Options | ページの iframe 埋め込み可否を制御するレスポンスヘッダ |
| frame-ancestors | CSPのディレクティブ。X-Frame-Optionsの後継でフレーム化元を制御 |
| Cursorjacking | カーソル表示をずらしてクリック位置を誤認させる亜種 |
| Likejacking | SNSの「いいね」ボタンを透明化して悪用する亜種 |
| フレームバスティング | JavaScriptで iframe 内表示を検知・回避する補助的対策 |