Minibuffer Exploit
GreasemonkeyのユーザスクリプトであるMinibufferに脆弱性があるよって話。Scriptishでも同様ですよ
Minibufferが動く状態で、↓のページにアクセスしてみよう
ただし、Minibufferはしばらくメンテされていない様で、最近のGreasemonkeyでは動かない。GM_addStyleあたりでエラーがでるはず。現状使っている人は自身でパッチをあてて修正しているのではないかと思う。これについては、Firefox4でcan’t wrap XML objectsというエラーが出る件について | Web scratchあたりを参照
あと、Minibufferでピンと来ない人は、LDRizeを動かすために必要なスクリプト、というと分かるかな?
ともかく、以下の様なことが勝手になされると思う
- タブが開く
- alertが出る
- www.example.comに飛ぶ
まあ、何と言うか、任意のページを開くことができるわけ。直接の攻撃にはならないけど、フィッシングや開かせたページにプラグインの脆弱性を突くようなものがあったりすると、ヤバイ。
何をやっているか
- onloadでMinibufferのプロンプトを開く
- コマンドライン部分に実行させるコードを入れる
xpath /html/body/div/p | innerHTML | open
- これはXPathで指定した要素のinnerHTMLをopenコマンドに渡すコード
- openは標準入力(?)を GM_openInTab を実行するコマンド
- 普通のURLでも良いし、javascript URLでも良い
- Returnを発行し、コマンド実行
技術的詳解
- Minibufferはプロンプトが開くときコンテンツにDOM要素(input要素)を置く
- Minibufferはキーイベント取得に
event.isTrusted
を使用したチェックを行っていない- コンテンツ側からプロンプトを開くキーコード:を発行するとプロンプトを開くことができる
- ただし、コマンド確定のReturnまたはCtr + mは、実行関数中に
GM_getValue
があり、Greasemonkeyのセキュリティチェックに引っかかる- チェックは関数のコールスタックにある実行元URLをチェックする方式(Greasemonkey内やユーザスクリプトのURLならOK)
- しかし、完全ではなく、about:blank的なページではチェックがすり抜ける模様
- ということで、
iframe.src="javascript:window.top.sendReturn();"
みたいなことをやると....
- ということで、
まあ、詳しくはソースを見ると良いんじゃないかな!