クリックジャッキング
透明にした他サイトのフレームを重ね、ユーザーに意図しないクリックをさせる攻撃です。X-Frame-Options や CSP の frame-ancestors で防ぎます。
- 1.クリックジャッキングは、透明にした標的サイトを罠ページに重ね、別物をクリックしたつもりで実際は標的を操作させる UI 偽装攻撃です。
- 2.本人のクリックと権限で実行されるため、サーバ側は正規操作と区別できません。CSRF と似て「本人になりすませる」点が危険です。
- 3.防御はサーバ側で『他サイトに埋め込ませない』と宣言すること。X-Frame-Options か、後継の CSP frame-ancestors で指定します。
どういう攻撃か
**クリックジャッキング(Clickjacking)**は、「UI 偽装(UI redress)」とも呼ばれる攻撃です。攻撃者は自分の罠ページの上に、標的サイトを iframe で重ねて透明にし、ユーザーには無害なボタン(例:「無料プレゼントを受け取る」)を見せます。
ユーザーがそのボタンを押したつもりでも、実際にクリックしているのは透明な標的サイトのボタンです。たとえば「退会する」「許可する」「送金する」といった、標的サイト上の危険な操作が、ユーザーの指で押されてしまいます。
ポイントは、攻撃者がスクリプトでデータを盗むわけではないことです。操作しているのは紛れもなくユーザー本人で、ユーザーのログイン状態と権限がそのまま使われます。だからサーバから見れば、これは「本人が自分の意思で押した正規のクリック」と区別がつきません。
<!-- 罠ページの構造(概念図)。fences 内なので < を書ける -->
<!-- 罠ボタンの真上に、標的サイトを透明な iframe で重ねている -->
<button>無料プレゼントを受け取る</button>
<iframe src="https://bank.example/settings"></iframe>
<!-- 透明化+位置合わせで、押すと iframe 内の危険ボタンが押される -->
なぜ成立してしまうのか
成立の鍵は、ブラウザが他サイトのページを iframe で読み込めてしまうこと、そして CSS でフレームを透明にしたり、ぴったり重ねたりできることです。攻撃者はこれらを組み合わせて、見た目と実際の操作対象をずらします。
主に次のような CSS の小細工が使われます。
opacity: 0で標的フレームを完全に透明にする。z-indexで重なり順を操り、透明フレームを最前面に置く。- 位置の微調整で、見せかけのボタンと標的の危険ボタンを正確に重ねる。
ユーザーには罠ページの飾りだけが見え、その真上に乗った透明な標的サイトには気づきません。見えているものと、クリックが届く先が違う――この食い違いこそが攻撃の本質です。
CSRF との違いと関係
クリックジャッキングは CSRF と「本人の権限で意図しない操作をさせる」点が似ています。混同しやすいので違いを整理します。
| 観点 | クリックジャッキング | CSRF |
|---|---|---|
| 操作のきっかけ | ユーザーが実際にクリックする | クリック不要(自動送信でも成立) |
| 悪用する性質 | 他サイトに iframe で埋め込めること | Cookie が別サイト発でも自動で付くこと |
| 主な対策 | X-Frame-Options / frame-ancestors | CSRF トークン / SameSite Cookie |
| 見え方 | 別の UI に見せかける | 画面上は何も起きていないように見える |
両者は独立した攻撃で、それぞれ別の対策が要ります。CSRF トークンを入れていても、クリックジャッキングはユーザー自身が「本物の画面」を操作しているため、トークンも正しく送られてしまい防げません。逆もまた然りです。
「CSRF トークンを入れたから操作系は安全」と考えるのは危険です。クリックジャッキングでは、ユーザーが本物の標的画面を(透明な状態で)操作しているため、ページに埋め込まれた CSRF トークンも正規の値として一緒に送信されます。フレーム埋め込みを止める対策は、CSRF 対策とは別建てで必要です。
防御:フレーム埋め込みを禁止する
最も確実な対策は、サーバが「このページを他サイトの iframe に埋め込ませない」と宣言することです。埋め込めなければ、重ねる土台そのものが作れません。方法は 2 つあります。
| 手段 | 指定例 | 備考 |
|---|---|---|
X-Frame-Options ヘッダ | DENY / SAMEORIGIN | 古くから広く対応。値は 1 つだけ |
CSP の frame-ancestors | 'none' / 'self' / 許可元 | 後継。複数オリジン許可など柔軟 |
HTTP/1.1 200 OK
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
X-Frame-Options: DENY:いかなるサイトでも iframe 埋め込みを禁止。SAMEORIGINなら自サイト内の埋め込みのみ許可。Content-Security-Policy: frame-ancestors:CSP のディレクティブで、埋め込みを許す親オリジンを列挙できます。'none'で全面禁止、'self'で自サイトのみ、特定ドメインを並べて部分許可も可能。
frame-ancestors は X-Frame-Options の上位互換で、現代ブラウザではこちらが優先されます。一方、古い環境のために両方を併記する構成も実務ではよく使われます。
広告枠や決済ウィジェットなど、意図して他サイトに埋め込ませたいページもあります。その場合は frame-ancestors で信頼するオリジンだけを列挙し、それ以外は弾くのが安全です。「とりあえず全許可」にすると、その隙を突かれます。許可リストは最小限にとどめ、不要になったら削るのが原則です。
まとめ
クリックジャッキングは、透明にした標的サイトを罠ページに重ね、ユーザーに別物をクリックしたつもりで標的を操作させるUI 偽装攻撃です。本人のクリックと権限で実行されるため、サーバ側は正規操作と区別できず、CSRF 対策だけでは防げません。
防御の本筋は、サーバ側で「他サイトに埋め込ませない」と宣言すること。X-Frame-Options か、後継の CSP frame-ancestors で指定します。これらはセキュリティヘッダによる多層防御の一部であり、攻撃面の全体像は OWASP Top 10 と合わせて押さえておくとよいでしょう。
セキュリティ Article
クリックジャッキングを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
クリックジャッキング
比較で見る軸
難易度: intermediate / カテゴリ: セキュリティ / タグ数: 3
導入後に効く点
本人のクリックと権限で実行されるため、サーバ側は正規操作と区別できません。CSRF と似て「本人になりすませる」点が危険です。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- セキュリティ
- タグ数
- 3
判断チェックリスト
- 自社の用途が「クリックジャッキング / Webアプリ」に近いか確認する。
- 強みである「クリックジャッキングは、透明にした標的サイトを罠ページに重ね、別物をクリックしたつもりで実際は標的を操作させる UI 偽装攻撃です。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。