Shikata Ga Nai

Private? There is no such things.

フレームバスティングスクリプトとその回避

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, (^^ゞ