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が有効になる」というモデルなんですが…。
そんなことできたんだ、と驚くことばっかりです。