Hello there, ('ω')ノ
フレームバスティングとは?
クリックジャッキング攻撃は、ウェブサイトが他のページ内にフレームとして埋め込まれる(iframe化される)ことで可能になります。そのため、クリックジャッキング対策は主にフレーミング制限を目的とした手法に集中しています。その一つがフレームバスティング(Frame Busting)です。
フレームバスティングの主な仕組み
フレームバスティングとは、JavaScriptを使ってページがiframe内で表示されていないかチェックし、強制的にトップレベルで表示させようとする技術です。具体的には以下のような挙動をします:
- 現在のウィンドウがトップレベル(
top
)かどうか確認し、違う場合はトップレベルに遷移する。 - 全てのiframeを可視化する。
- 透明なiframeへのクリックを防止する。
- 攻撃の可能性をユーザーに通知する。
フレームバスティングの限界と回避
JavaScriptに依存
- JavaScriptを無効にしているユーザーには効果がありません。
- 一部のブラウザや拡張機能(例:NoScript)がスクリプトの動作を制限する可能性があります。
HTML5 iframeのsandbox
属性による回避
攻撃者は以下のようにsandbox
属性を使って、フレームバスティングスクリプトを無効化することが可能です:
<iframe src="https://victim-website.com" sandbox="allow-forms"></iframe>
allow-forms
: フォーム送信を許可allow-scripts
: JavaScriptの実行を許可(ただし、トップナビゲーションは制限される)allow-top-navigation
を省略することで、iframe内のスクリプトがtop.location
などの操作を実行できなくなり、フレームバスティングを回避できます。
対策方法
サーバーサイド対策:HTTPヘッダーの使用
以下のHTTPヘッダーでフレーミングを完全に制御可能です:
X-Frame-Options: DENY
- どんな場合でもiframeでの表示を禁止。
X-Frame-Options: SAMEORIGIN
- 同一オリジンからのフレーミングのみ許可。
推奨:Content Security Policy (CSP)
- CSPフレーム制限(
frame-ancestors
)を使用して、特定のドメインのみがiframeとして埋め込めるよう制限できます:
Content-Security-Policy: frame-ancestors 'self'
まとめ
- フレームバスティングは、iframeによる表示を検知・阻止するJavaScriptベースの防御手法です。
- HTML5の
sandbox
属性を使用することで、攻撃者はこの対策をバイパス可能です。 - より強力で安定した対策として、
X-Frame-Options
やCSPのframe-ancestors
ヘッダーの実装が推奨されます。
クリックジャッキングからの防御は、複数の手法を組み合わせることで堅牢になります。サーバーとクライアント両方の視点から対策を講じましょう。
Best regards, (^^ゞ