arguments.callee.caller で UserJavaScriptのソース取得

最初に要点を述べると、UserJavaScriptのソースはサイト側のScriptから取得することが不可能ではないので、UserJavaScript にパスワードなどを書き込む必要がある場合は実行を許可するサイトに十分に気をつけましょう(そもそも書き込まないで済むならそれに越したことはない)。というお話です。

Function.caller

9.60 beta 1 RCからFunctionにcallerプロパティが追加され、関数の呼び出し元を参照できるようになりました。caller は非標準ではありますが、FirefoxやIEでも以前から使えているようです。

そして、サイト側のScriptで、UserJavaScriptが呼び出すであろうメソッドを上書きしておくことで、UserJavaScriptの処理をフックし、そこから .caller を辿って UserJavaScript のソースを取得できるケースがあります。

具体的はこんな感じです。

サイト側
(function(){
var hoge = document.getElementById('hoge');
hoge.addEventListener = function(){
	var caller = arguments.callee.caller;
	while (caller && caller.caller && caller != caller.caller) {
		caller = caller.caller || caller;
	}
	alert(caller);
};
})();
UserJavaScript側
(function(){
var password = 'xxxx';
var hoge = document.getElementById('hoge');
hoge.addEventListener('click',function(){/* hoge */},false);

})();

この例では、UserJavaScriptで#hogeな要素に addEventListener している想定として、その addEventListener を上書きしています。
UserJavaScript はそれが上書きされているとは知らずに addEventListener を呼び出してしまうので、そこから caller を辿り、ソースを取得出来てしまいます。


厳密な検証はしていませんが、 安全そうに見えても、getter/setter や DOMNodeInserted などと組み合わせることで「なんとか」できてしまうかもしれません。

# まあ、深刻な問題というわけではないですし、条件が限定されすぎているので、実際に狙われることはないと思いますけどね。