Object.watch と Greasemonkey の脆弱性
知らなかったのだけれど、Mozilla の Object には watch というメソッド(イベントハンドラ?)がある。
o=new Object; o.p = 1; o.watch("p",function( id, oldval, newval ){ alert("o." + id + " changed from " + oldval + " to " + newval); return newval; });
のように設定して
o.p = 2;
とすると
o.p changed from 1 to 2
と表示される。これはデバッグなんかに最高!
Greasemonkey の脆弱性
http://greaseblog.blogspot.com/2005/07/mandatory-greasemonkey-update.html
で、これを利用したGreasemonkeyの脆弱性が発覚。Greasemonkeyをとりあえず0.3.5にバージョンアップしてください。
要は「悪意あるサイトはGM_* というGreasemonkey拡張APIをつかいまくり! Greasemonkeyの拡張APIを用いて、ローカルハードディスクが読まれまくり!」、ということらしい。
0.3.5では、GM_log 以外の拡張APIが無効にされているようですショボーン NiceLink も動かなくなります…orz
あんまり詳しく説明するのもあれなんで、やめておきますが、一番重要なのは watch は代入される直前に実行される、ということ。シリアルに実行されるはずのjavascriptの実に好きなところに割り込みを設定できる。Greasemonkeyでは「ユーザースクリプトが実行されている間だけGreasemonkey拡張APIが有効になる」というモデルなんですが…。
そんなことできたんだ、と驚くことばっかりです。