2011年6月18日土曜日

アドレスバーからjavascript:を実行できなくするブラウザ側の対策について

Facebookなどで、裏技する方法などと言ってjavascript:をアドレスバーにコピペして実行させて、情報を盗んだりするソーシャルエンジニアリングが流行っていて(ニコニコでも似たようなのありましたね)、それを防止するためにブラウザ側が取っている対策を書き出してみたもの。

IE9の場合

アドレスバーにテキストを貼り付けたときには、javascript: というプレフィックスは削除されます。これは、ソーシャルネットワーク上でよく見られる、ユーザ自身の手によるXSSというソーシャルエンジニアリングなXSS攻撃を軽減します。
IE9 RC マイナーな変更点リスト - 葉っぱ日記

javascript:alert(1);
上記をコピペしたときはalert(1);部分だけがアドレスバーに残るという対策。
手動で、javascript:alert(1);と書いて実行した場合はちゃんと実行できる。
実行コンテキスト(実行した際に影響を与える事ができる場所)も表示している現在のページ(未確認表示しているページがコンテキストになるようです)
 
Chromeの場合

Chromium 13: defenses for self-XSS via javascript URLs Working together with Facebook and other browser vendors, we’re trialing a self-XSS defense that makes it harder for users to shoot themselves in the foot when they are tricked into pasting javascript: URLs into the omnibox.
Chromium Blog: New Chromium security features, June 2011

Chrome13からIE9と同様にコピペした際にjavascript:部分は削除される。
手動でjavascript:alert(1);と書いて実行した場合はちゃんと実行できる。
実行コンテキストも表示している現在のページ。

Firefoxの場合

ロケーションバーへ入力された javascript: と data: URL が、現在表示されているページの権限を継承しなくなりました
アドオンを Firefox 5 と 6 へ対応させるための注意点 « Mozilla Developer Street (modest)

Firefox6からこの変更が適応されている。
IE9やChrome13とは異なるアプローチで、javascript:alert(1);とコピペする際には何も起こらない。
しかし、アドレスバーでjavascript:を実行する際のコンテキストが異なるようになったため、javascript:で実行するスクリプトは表示しているページに影響を与えることができない。(多分DOMが使えないので多くのスクリプトはエラーになる。)

image

実際にFirefox/6.0a2で適当なページを開いてやってみると、windowオブジェクトが存在しないというエラーになった。このようにそのページのDOMにアクセスできないようにする事で、ユーザ自身によるXSSを行えなくしている。

これはアドレスバーから実行するものを無害化するために導入されたので、通常のブックマークレットからの実行やaの埋め込みからの実行などは問題なく動作する。

<a href="javascript:...>HOGE</a>
またjavascript:ハックとか呼んでるコード内でlocation.hrefに入れてJavaScriptを実行させる方法も問題なく動作した。
function evalInPage(fun) {
location.href = "javascript:void (" + fun + ")()";
}
evalInPage(function(){
alert(1)
});

つまり、ロケーションバー以外には特に影響がないという感じらしい。
同じようにdata:スキームURLにも適応される。

ロケーションバーからjavascript:を実行する愛好家達には不便になるかもしれない。(@hasegawayosukeさんとか)

愛好家達の対応策としては

  • それ専用のブックマークレットを作る
  • 多くの場合evalInSandboxからの実行でも動作は異ならないのでxqjsなどのアドオンを使う。
  • Firebugはevalで実行してるのでそれを意識して書く

Firefox6ではScratchpadっていうものが標準でついている。(これはどういう風に実行されてるかは知らない、多分evalInSandboxだと思うけど)

image

など。

おまけ

FirefoxではNoScriptを使う事で、Firefox6未満でも同様の効果を得られます。(この動作だけを得たいという人はほとんどいないと思いますが…)

0 コメント:

コメントを投稿