GMだとunsafeWindowへのアクセスもとの関数を参照できる
"GMだとunsafeWindowの呼び出しで関数は参照される"だったのを修正。ひどい日本語。
window.__defineGetter__("console", function () { return { log: function me() { try { var fn = me.caller.caller.caller.caller.caller.caller; } catch ( e ) { c.log(e); } } } } );
これでgm側からunsafeWindow.console.logを呼び出すと、HTMLに埋め込んだコードで呼び出しもとの関数が取れる。でもあくまで関数がとれるだけでスコープはくっついていないのでevalでFirefox、evalの第二引数、プライベートメンバ/クロージャーの実行コンテキストへのアクセス - 実用を使ってほかの関数を取り出すことはできない(できたとしてもeval特権の壁に阻まれるはず)。
前回JSActionsでtoStringのcaller経由で呼び出し元を取ろうとしたら取れなかった(permission denied)のにGMだと取れるということはsandbox/unsafeWindow(ふつうのHTMLの実行コンテキストというか、なんと呼ぶのが正しいのかわかんない)間にはevalの壁がない?。
ということはsetterに関数をメンバにもつオブジェクトを渡すのは致命的なのかもです。ていうかObjectのtoStringとかがあるからオブジェクトをsetterに渡すと死亡か?
やってみた限りgetterは危険性が低いのだとおもう。オブジェクトを代入する可能性があるsetterは危険だけど、でもやっぱりevalの壁があるので直接、渡してはいけない関数をオブジェクトに入れて渡したりしない限りは安全になっているように思える。
上参照のこと。
とはいえ、単純で直接的に呼び出せたりする問題が起きないかチェックしているだけなので、__proto__に何かを入れておいて運よくnewされるのを待つ、みたいな方法で回避できるのかも。できないのかも。
きちんと仕様を理解してトップダウンで考え直す。
dive into greasemonkey にunsafeWindowから受け取ったもののtoString()にきをつけれ、って書いてあってソースコードにもその配慮があるけど、toStringが危険なのはもう過去の話?
書いてあったのはどっかほかのドキュメントだ。
Mozilla のセキュリティ評価と最良実践ガイド
でした。
とりあえずJSActionsであとからminibufferに特権のついてるコマンドを追加するのは無理。