PR

クリックジャッキング攻撃と防御手法

この記事は学習用です。ChatGPT と GitHub Copilot を使っています。

1. 導入:クリックジャッキングとは何か

クリックジャッキング(Clickjacking)とは、ユーザーが意図しない操作を行うように誘導する攻撃手法です。
攻撃者は透明または偽装された要素を重ねて配置し、ユーザーがクリックした対象を別のページ要素にすり替えます。
たとえば「再生ボタン」をクリックしたつもりが、実際には「送信」や「いいね」を押してしまうケースがあります。

定義

  1. クリックジャッキングとは、ユーザーのクリック操作を視覚的に欺き、意図しないコンテンツや操作に誘導する UI レイヤー攻撃である。

この攻撃は Web ブラウザーの表示構造(特に iframe タグ)を悪用するため、サイト側での防御設定が重要になります。

2. 攻撃の仕組みと背景

クリックジャッキングの核心は、オーバーレイ構造(透明な重ね合わせ)です。
攻撃者は次のような仕組みでユーザーを欺きます。

  1. 正常なサイトを iframe で別サイト内に埋め込む
  2. 透明または部分的に見えるように CSS で調整
  3. 誘導文やボタンを上に重ねる
  4. ユーザーがクリック → 実際には隠れた iframe 上のボタンが押される
graph TD A[攻撃者サイト] -->|iframe埋め込み| B[被害サイト] B -->|透明化| C[ユーザーがクリック] C -->|意図しない操作| D[送信 / 認証 / 投稿]

背景

  • SNS の「いいね」ボタンや認証操作は悪用対象になりやすい。
  • クリックジャッキングは CSRF(クロスサイトリクエストフォージェリ)と併用されることも多い。

3. 実際の攻撃例

例1:SNS ボタンの不正クリック

ユーザーが「ゲームを始める」ボタンを押すと、透明化した iframe 越しに SNS の「いいね」ボタンが押される。
→ 攻撃者のページが急速に拡散する。

例2:オンラインバンキングの送金ボタン

被害者がログイン状態のまま攻撃サイトを閲覧すると、透明化した iframe 上の「送金確定」ボタンをクリック。
→ 不正送金が発生。

4. 技術的な防御

クリックジャッキングを防ぐ代表的な HTTP ヘッダーが X-Frame-OptionsContent-Security-Policy (CSP) です。

(1) X-Frame-Options

サーバーがページの埋め込みを制御する HTTP レスポンスヘッダーです。

設定値 説明
DENY どのサイトからも埋め込み禁止
SAMEORIGIN 同一オリジンからのみ埋め込み許可
ALLOW-FROM https://example.com 特定サイトのみ許可(非標準・主要ブラウザー非対応のため非推奨)

Apache 設定例

Header always set X-Frame-Options "SAMEORIGIN"

Nginx 設定例

add_header X-Frame-Options "SAMEORIGIN" always;

(2) Content-Security-Policy (CSP)

frame-ancestors ディレクティブを用いると、より柔軟に制御可能です。

Content-Security-Policy: frame-ancestors 'self' https://trusted-site.com;

→ モダンブラウザーでは CSP による制御が推奨。frame-ancestors が有効な場合、ブラウザーは X-Frame-Options よりも frame-ancestors を優先します。後方互換のために両方を設定する構成が一般的です。

5. 防御実装の確認方法

セキュリティ対策が有効かを確認するには、以下の方法があります。

(1) ブラウザー開発ツール

  • Network タブで対象レスポンスのヘッダーを確認
  • X-Frame-Options または Content-Security-Policy が設定されているかを確認

(2) オンライン診断ツール

  • https://securityheaders.com/
    → サイトの HTTP ヘッダー設定を自動解析し、クリックジャッキング防御の有無を評価

6. よくある誤りと注意点

誤り問題点
X-Frame-Options を設定し忘れるクリックジャッキングに対して脆弱
ALLOW-FROM を使用非標準で多くのブラウザーが非対応。期待どおりに動作しない
一部のページだけ設定ログイン・決済ページなどは特に要注意。全ページで一貫して適用
SPA の動的レンダリングで未反映すべてのルートで適切なレスポンスヘッダーを返す必要がある

補足iframe を必要とする埋め込み機能(例:地図・動画)には、frame-ancestors に許可オリジンを追加して例外設定を行う。サイトが外部コンテンツを埋め込む場合は、frame-src(CSP3。CSP2 では child-src)の適切な設定も検討する。

7. まとめ

クリックジャッキングは単純な UI 操作の欺きでありながら、被害は深刻化し得ます。
防御の基本は以下の 3 点に集約されます。

  1. iframe 制御ヘッダーの設定(X-Frame-Options と CSP の併用)
  2. 重要操作におけるユーザー確認の導入(例:二重確認ダイアログ)
  3. Web アプリ全体での統一的なセキュリティ設定

これらを組み合わせることで、クリックジャッキングによる被害リスクを最小化できます。

A. 参考サイト

OWASP: Clickjacking Defense Cheat Sheet
MDN Web Docs: X-Frame-Options
MDN Web Docs: Content-Security-Policy/frame-ancestors
Security Headers Scanner

B. 関連書籍

コメント