Webアプリケーション攻撃

クリックジャッキング くりっくじゃっきんぐ

UI偽装iframe透明レイヤーX-Frame-OptionsCSPフィッシング
クリックジャッキングって何? 普通にクリックしてるだけなのに危ないの?

簡単に言うとこんな感じ!

「無料プレゼントに応募する」ボタンをクリックしたつもりが、実は透明になった「全データを削除する」ボタンを押してた——そんな”見えないワナ”がクリックジャッキングだよ! 悪意のあるページがあなたの画面上に透明な罠を重ねて、知らないうちに操作させちゃうんだ。


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

クリックジャッキング(Clickjacking)とは、攻撃者が用意した偽ページの上に、本物のWebサービスを透明なレイヤーとして重ね、ユーザーが気づかないまま本物サービスのボタンや操作をクリックさせる攻撃手法です。“クリック(Click)“を”ハイジャック(Hijack)“することからこの名前がついています。

ユーザーには「かわいいネコの画像を見る」ボタンしか見えていません。しかしその裏には、SNSの「全員にシェア」ボタンや、ECサイトの「今すぐ購入」ボタン、あるいは管理画面の「アカウント削除」ボタンが透明なまま重なっています。ユーザーが無害に見えるボタンをクリックした瞬間、本人が意図しない操作が本物のサービス上で実行されてしまうのです。

この攻撃はJavaScript脆弱性を悪用するXSSとは異なり、HTMLの<iframe>タグという正規の機能を悪用します。そのためブラウザのフィルタをすり抜けやすく、技術的に難しい知識がなくても攻撃を仕掛けられる点が特徴です。


クリックジャッキングの仕組み

攻撃の構造を図で見てみよう

クリックジャッキングの仕組み ユーザーに見える画面 🎁 無料プレゼント応募 ← ユーザーが見ているボタン かわいいネコ動画 🐱 ← 囮のコンテンツ 攻撃者が用意した偽ページ 実際に重なっている層 🗑️ アカウントを削除する ← 透明で見えない本物ボタン 📢 全フォロワーにシェア ← opacity:0 で不可視化 iframeで読み込んだ本物サービス 重なる クリック! 😱 アカウント削除実行!

攻撃のステップを分解すると

ステップ攻撃者がやることユーザーから見た状態
① 偽ページ作成魅力的なコンテンツ(懸賞・動画等)で囮ページを用意普通のWebページに見える
② iframe埋め込み本物のWebサービスを<iframe>で読み込み見えない(透明)
③ 位置合わせ本物のボタンが囮ボタンの真上に来るようCSSで調整ずれていないため気づけない
④ 透明化iframeをopacity: 0z-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埋め込みを禁止する」という方向で行われます。

クリックジャッキング対策の比較 X-Frame-Options(旧来の対策) DENY どのサイトからもiframe禁止 SAMEORIGIN 同じドメインからのみiframe許可 ALLOW-FROM uri 指定URLからのみ許可(非推奨) ✅ 設定が簡単・歴史が長く実績あり ❌ 複数URLの指定ができない ❌ 一部ブラウザで非推奨化 CSP frame-ancestors(現代の対策) frame-ancestors 'none' 全iframe埋め込みを禁止 frame-ancestors 'self' 同一オリジンのみ許可 frame-ancestors https://a.com 複数URL・ワイルドカードも指定可能 ✅ 複数ドメインの細かい制御が可能 ✅ W3C標準・現代ブラウザ全対応 ❌ 記述がやや複雑

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 7034X-Frame-Optionsヘッダーの正式な仕様定義(2013年)
W3C CSP Level 2Content-Security-Policy: frame-ancestorsの仕様定義
OWASP Clickjacking Defense Cheat Sheetクリックジャッキング対策の実装ガイドライン
CWE-1021共通脆弱性列挙(CWE)でのUI重ね合わせ攻撃の分類

関連用語