IPAから「クリックジャッキング」に関するレポート出ました

Webアプリケーションのセキュリティの分野で「新しい攻撃手法」は実はそれほど多くないのですが、比較的新しく対応が求められているものとしてクリックジャッキングがあります。クリックジャッキングは、CSRFと同じように「Webアプリケーションのサーバー側機能」を利用者(被害者)に実行させる手法です。CSRFは、当該機能を実行するHTTPリクエストを送信させる罠を使いますが、クリックジャッキングの方は、iframe等に当該機能を呼び出す画面を表示しておき、利用者(被害者)に実行ボタンを押させる(=クリックジャック)手法です。クリックジャッキングに関しては4年前にすでにJPCERT/CCが詳しい解説を出していたのですが、この3月26日にIPAからも「クリックジャッキング」に関するレポートが公開されました。
X-FRAME-OPTIONSについて、このレポートには記載されていない点についていくつか補足しておきます。

SAMEORIGINは同一ドメインではなく同一オリジン

IPAのレポートでは、X-FRAME-OPTIONSの値としてSAMEORIGINを指定する場合の注意として

SAMEORIGINを選択する場合で注意しなければならないのは、同一ドメインのみである点だ。
と書かれていますが、SAMEORIGINは言葉通り同一オリジンの場合のみフレーム内で表示されることを想定しており、httpとhttpsなどのようにプロトコルが異なる場合や、同一プロトコルであってもポートが異なる場合には異なるオリジンとなりますので、フレーム内でも表示されません(もしかすると表示されるブラウザが存在するかもしれませんが、少なくともそれは仕様を逸脱した挙動です)。

SAMEORIGINやALLOW-FROMの指定はフレームを指定している親ドキュメントではない

X-FRAME-OPTION: SAMEORIGINX-FRAME-OPTION: ALLOW-FROM uriを指定した場合に、制約を受けるベースとなるのはiframeやframeを記述した親ドキュメントではなく、「トップレベブラウジングコンテキスト」すなわちトップレベルのドキュメントになります。例えば、http://example.jp/top.html からiframeでhttp://evil.example.com/fake.htmlのコンテンツを埋め込み、http://evil.example.com/fake.htmlからiframeでhttp://example.jp/child.htmlのコンテンツを埋め込んだ場合、http://example.jp/child.htmlX-FRAME-OPTION: SAMEORIGINを指定していたとしてもiframe内にコンテンツは表示されることになります。

FirefoxにおけるALLOW-FROMの指定はfalse-positiveが多い

IPAのレポートでは、X-FRAME-OPTION: ALLOW-FROM uriをサポートするブラウザとして Firefox 19.0 を挙げています。たしかに Firefox ではALLOW-FROMをサポートしているのですが、指定方法には癖があり、間違った指定をした場合にフレームでの表示をブロックせずにそのまま表示してしまうという問題があります。
例えば http://example.jp 上のコンテンツで X-FRAME-OPTION: ALLOW-FROM として様々な値を指定した場合、IEと比べると下表のようになります。

X-Frame-Optionsの値 期待される挙動  IE8-10   Firefox 
ALLOW-FROM:example.jp ブロック ブロック   表示
ALLOW-FROM: example.jp ブロック ブロック   表示
ALLOW-FROM example.jp ブロック ブロック ブロック
ALLOW-FROM:http://example.jp ブロック ブロック   表示
ALLOW-FROM: http://example.jp ブロック ブロック   表示
ALLOW-FROM http://example.jp   表示   表示   表示
ALLOW-FROM:example.com ブロック ブロック   表示
ALLOW-FROM: example.com ブロック ブロック   表示
ALLOW-FROM example.com ブロック ブロック ブロック
ALLOW-FROM:http://example.com ブロック ブロック   表示
ALLOW-FROM: http://example.com ブロック ブロック   表示
ALLOW-FROM http://example.com ブロック ブロック ブロック

なお、上記の表でALLOW-FROMの後ろにコロンをつけた指定をテストしているのは、IETFのドラフト01では ALLOW-FROM: uri のようにコロンを指定するよう定められていたからです(現在のドラフト02では不要です)。

(今日の参考文献: IPAから「クリックジャッキング」に関するレポート出ました | 徳丸浩の日記)