第 5 章 Visual clickjacking の実行 51
5.2 Visual clickjacking を防ぐための既存手法
5.2.3 Frame busting の回避手法
Frame bustingは,リダイレクトやコード自体を無効化することで回避すること
ができる.この項では,Rydstedtらが紹介しているframe bustingを回避する7種 類の手法[27]について説明する.
double framing
Frame bustingのコードがブラウザを防御対象のページにリダイレクトするため
にparent.locationを利用する場合,このframe bustingによるリダイレクトはdouble
framingによって無効化される.double framingは,リダイレクトを無効化するた
めに二つの攻撃者のページがframeを利用してターゲットページを入れ子にする.
二つの攻撃者のページでターゲットページを入れ子にすることで,frame bustingの コード内のparent.locationによるリダイレクトはdescendant policyによってセキュ リティ違反になり,このリダイレクトはブラウザによって無効化される.Descendant
policyにおいて,フレームは子孫のフレームのみを異なるURIに誘導することが
できる.つまり,子孫のフレーム(防御対象のページ内にあるframe bustingのコー ド)が親フレームをリダイレクトすることはできない.
onBeforeUnload Event
リダイレクトが取り消された時に frame busting のコードが防御対象のページ を表示したままなら,この frame busting は回避されてしまう.攻撃者は,frame
busting によるリダイレクトを取り消すために onBeforeUnloadハンドラを登録し
た攻撃者のページを用意する.このonBeforeUnloadハンドラは,リダイレクトに よって攻撃者のページがアンロードされた時に呼び出され,リダイレクトを取り 消すかをユーザに尋ねる.ユーザが取り消すことを選んだ場合,ブラウザによっ てリダイレクトが取り消されて防御対象のページは攻撃者のページに埋め込まれ たままとなる.
No-Content Flushing
ヘッドタグまたはボディタグ内の先頭にframe bustingのコードが設置されていな い場合,このframe bustingは回避されてしまう.frame bustingのコードがボディタ グ内の後尾に設置されている場合,ページがレンダリングされた後にframe busting のコードが評価され,このコードがブラウザをリダイレクトする.リダイレクトを 無効化するために,攻撃者のページにonBeforeUnloadハンドラを登録する.上記 の通り,このハンドラはframe bustingのコードによってリダイレクトがあったと きに呼び出され,HTTP/1.1 204 NoContentを返信するサーバにリクエストを送信 する.ブラウザは 204 No Contentを受け取るとリクエストパイプラインをフラッ シュするために,frame bustingのコードによるリダイレクトが取り消される.
manipulating Referrer
Frame bustingのコードは,document.referrerを確認することであらかじめ指定
されたサードパーティのページに防御対象のページを埋め込むことができる.doc-ument.referrerは,防御対象のページを要求したページのURIが入っており,この
document.referrerに指定されたサードパーティのページのURIが入っていた場合,
frame busting のコードはリダイレクトを行わずに,防御対象のページが埋め込ま
れることを許可する.
もしこの確認が簡単な文字列検索を利用して行われているなら,frame bustingの コードは回避されてしまう.なぜなら,攻撃者が検索に当てはまる文字列を
doc-ument.referrer に埋め込むことができるためである.例えば,防御対象のページ
が safe.comが生成元のページに埋め込まれることを許可する時,攻撃者は docu-ment.referrerにsafe.comを埋め込んだURIであるattacker.com/page?s=safe.comを 入れることができる.
Browser-dependent Approaches
以下のframe bustingを回避する3つの手法はブラウザ特有の挙動を利用してい
るために脆弱性のないframe bustingの実装をより困難にしている.さらに,この ブラウザ特有の挙動はバージョンによっても異なり,同じ種類のブラウザであって
もframe bustingを回避できるバージョンとできないバージョンがある.
clobbering location variable: 攻撃者のページは,frame busting のコードを回避 するために他のページのローカル変数へのアクセスによるセキュリティ違反を利 用する.Frame bustingのコードは,親ページが防御対象のページの埋め込みを許 可されたページかを確認するためにグローバル変数である top.location (親ページ のオリジン)にアクセスする.このようなframe busting のコードを無効化するた めに,攻撃者のページはローカル変数として location変数を再定義する.Frame
busting のコードがローカル変数として再定義された top.locationにアクセスした
とき,frame busting のコードはセキュリティ違反のために無効化される.この回 避手法はIE7やSafari 4.0.4上で実行することができる.
restricting JavaScript: JavaScript で実装されている frame busting のコードは,
JavaScriptが無効化されることで動作しなくなる.FirefoxやChromeはiframeタ
グの sandbox 属性を指定することで iframe内の JavaScript コードを無効化する.
そのためにiframeの中にframe bustingのコードを含んだ防御対象のページが読み 込んだ時,JavaScript コードであるframe bustingのコードは無効化される.また IEのsecurity属性に“restricted”を指定したり,IE8やFirefoxのdesignModeプロ パティをオンにすることでiframe内のframe bustingのコードを無効化することが できる.
XSS filter: Frame bustingのコードを無効化するために,攻撃者のページは IE8
やChromeのXSSフィルタを悪用する.XSSフィルタはリクエストとそのリクエ
ストに対するレスポンスの両方に含まれるスクリプトコードを無効化する.よっ て攻撃者がframe bustingのコードを抜き取り,防御対象のページをリクエストす るためのURIに埋め込むことで,防御対象のページ内のframe bustingのコードは XSSフィルタによって無効化される.