クリックジャッキング くりっくじゃっきんぐ
簡単に言うとこんな感じ!
「無料プレゼントに応募する」ボタンをクリックしたつもりが、実は透明になった「全データを削除する」ボタンを押してた——そんな”見えないワナ”がクリックジャッキングだよ! 悪意のあるページがあなたの画面上に透明な罠を重ねて、知らないうちに操作させちゃうんだ。
クリックジャッキングとは
クリックジャッキング(Clickjacking)とは、攻撃者が用意した偽ページの上に、本物のWebサービスを透明なレイヤーとして重ね、ユーザーが気づかないまま本物サービスのボタンや操作をクリックさせる攻撃手法です。“クリック(Click)“を”ハイジャック(Hijack)“することからこの名前がついています。
ユーザーには「かわいいネコの画像を見る」ボタンしか見えていません。しかしその裏には、SNSの「全員にシェア」ボタンや、ECサイトの「今すぐ購入」ボタン、あるいは管理画面の「アカウント削除」ボタンが透明なまま重なっています。ユーザーが無害に見えるボタンをクリックした瞬間、本人が意図しない操作が本物のサービス上で実行されてしまうのです。
この攻撃はJavaScriptの脆弱性を悪用するXSSとは異なり、HTMLの<iframe>タグという正規の機能を悪用します。そのためブラウザのフィルタをすり抜けやすく、技術的に難しい知識がなくても攻撃を仕掛けられる点が特徴です。
クリックジャッキングの仕組み
攻撃の構造を図で見てみよう
攻撃のステップを分解すると
| ステップ | 攻撃者がやること | ユーザーから見た状態 |
|---|---|---|
| ① 偽ページ作成 | 魅力的なコンテンツ(懸賞・動画等)で囮ページを用意 | 普通のWebページに見える |
| ② iframe埋め込み | 本物のWebサービスを<iframe>で読み込み | 見えない(透明) |
| ③ 位置合わせ | 本物のボタンが囮ボタンの真上に来るようCSSで調整 | ずれていないため気づけない |
| ④ 透明化 | iframeをopacity: 0やz-indexで不可視に | 全く見えない |
| ⑤ クリック誘導 | 「ここをクリック!」と誘導する | 無害なボタンだと思ってクリック |
| ⑥ 攻撃成立 | 本物サービス上でユーザーが操作を実行 | 意図しない操作が完了している |
クリックジャッキングで起こりうる被害の例
- SNS: スパム投稿を全フォロワーに拡散させられる
- ECサイト: 意図しない商品を購入・定期契約させられる
- 管理画面: アカウント設定変更・削除を実行させられる
- カメラ/マイク許可: ブラウザのアクセス許可ダイアログを承認させられる(“likejacking”の亜種)
- 送金・振込: オンラインバンキングの送金操作を完了させられる
歴史と背景
- 2002年頃 ―
<iframe>を使ったUIの重ね合わせ手法が研究者の間で認知され始める - 2008年 ― セキュリティ研究者のRobert HansenとJeremiah Grossmanが「Clickjacking」という名称で正式に公表。Adobe Flash Playerのカメラ・マイク許可ダイアログを乗っ取る攻撃例が大きな反響を呼ぶ
- 2009年 ― Twitterで「Don’t Click」と書かれたツイートをクリックするとリツイートされてしまう「likejacking」攻撃が大規模に拡散。数百万人が被害を受ける
- 2009年 ― Microsoftが
X-Frame-OptionsレスポンスヘッダーをIE8に実装。業界標準として普及し始める - 2013年 ― OWASP(Webセキュリティの国際標準策定団体)が「OWASP Top 10」にUI Redressing(クリックジャッキングの上位概念)を掲載し、広く認知される
- 2016年 ― Content Security Policy(CSP)の
frame-ancestorsディレクティブが普及し、X-Frame-Optionsを置き換えるより強力な対策として定着 - 現在 ― SPAフレームワーク(React・Vueなど)の普及により攻撃対象が多様化。モバイルアプリでも類似手法が確認されている
対策技術の比較
クリックジャッキングへの対策は主に「サーバー側でiframe埋め込みを禁止する」という方向で行われます。
HTTPレスポンスヘッダーの設定例
# 最も推奨される組み合わせ(両方設定することで互換性を確保)
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
# 自社ドメイン内の埋め込みは許可したい場合
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
フレームバスティング(JavaScript対策)との比較
古くは「フレームバスティング(Frame Busting)」というJavaScriptで自分がiframe内に読み込まれていることを検知して脱出するコードが使われていましたが、JavaScriptが無効な環境や攻撃者の細工により回避されやすく、現在はHTTPヘッダーによる対策が主流です。
| 対策手法 | 実装場所 | 信頼性 | 推奨度 |
|---|---|---|---|
| X-Frame-Options | サーバー(HTTPヘッダー) | 高 | ◎ 現役(互換性のため) |
| CSP frame-ancestors | サーバー(HTTPヘッダー) | 非常に高 | ◎ 最推奨 |
| フレームバスティング(JS) | フロントエンド | 低(回避可能) | ✕ 非推奨 |
| SameSite Cookie属性 | サーバー | 中(補助的) | △ 組み合わせで有効 |
関連する規格・RFC
| 規格・ドキュメント | 内容 |
|---|---|
| RFC 7034 | X-Frame-Optionsヘッダーの正式な仕様定義(2013年) |
| W3C CSP Level 2 | Content-Security-Policy: frame-ancestorsの仕様定義 |
| OWASP Clickjacking Defense Cheat Sheet | クリックジャッキング対策の実装ガイドライン |
| CWE-1021 | 共通脆弱性列挙(CWE)でのUI重ね合わせ攻撃の分類 |
関連用語
- クロスサイトスクリプティング(XSS) — スクリプト注入によってブラウザ上で悪意あるコードを実行させる攻撃
- クロスサイトリクエストフォージェリ(CSRF) — ログイン済みユーザーに意図しないリクエストを送信させる攻撃
- Content Security Policy(CSP) — Webページが読み込めるリソースをサーバーが制御するセキュリティヘッダー
- iframe — Webページ内に別のページを埋め込むHTMLタグ。クリックジャッキングの悪用手段
- OWASP Top 10 — Webアプリケーションにおける重大なセキュリティリスクのトップ10リスト
- フィッシング — 偽サイトへ誘導してユーザーを騙す攻撃手法の総称