Minibuffer Exploit

GreasemonkeyのユーザスクリプトであるMinibufferに脆弱性があるよって話。Scriptishでも同様ですよ

Minibufferが動く状態で、↓のページにアクセスしてみよう

ただし、Minibufferはしばらくメンテされていない様で、最近のGreasemonkeyでは動かない。GM_addStyleあたりでエラーがでるはず。現状使っている人は自身でパッチをあてて修正しているのではないかと思う。これについては、Firefox4でcan’t wrap XML objectsというエラーが出る件について | Web scratchあたりを参照

あと、Minibufferでピンと来ない人は、LDRizeを動かすために必要なスクリプト、というと分かるかな?

ともかく、以下の様なことが勝手になされると思う

  1. タブが開く
  2. alertが出る
  3. www.example.comに飛ぶ

まあ、何と言うか、任意のページを開くことができるわけ。直接の攻撃にはならないけど、フィッシングや開かせたページにプラグイン脆弱性を突くようなものがあったりすると、ヤバイ。

何をやっているか

  1. onloadでMinibufferのプロンプトを開く
  2. コマンドライン部分に実行させるコードを入れる
    • xpath /html/body/div/p | innerHTML | open
    • これはXPathで指定した要素のinnerHTMLをopenコマンドに渡すコード
    • openは標準入力(?)を GM_openInTab を実行するコマンド
    • 普通のURLでも良いし、javascript URLでも良い
  3. Returnを発行し、コマンド実行
技術的詳解
  • Minibufferはプロンプトが開くときコンテンツにDOM要素(input要素)を置く
    • コンテンツ側に置くと言うことはコンテンツ側のスクリプトからアクセスが可能
    • つまり、input.value等からコマンドラインを任意に書き換えられる
  • Minibufferはキーイベント取得にevent.isTrustedを使用したチェックを行っていない
    • コンテンツ側からプロンプトを開くキーコード:を発行するとプロンプトを開くことができる
  • ただし、コマンド確定のReturnまたはCtr + mは、実行関数中にGM_getValueがあり、Greasemonkeyのセキュリティチェックに引っかかる
    • チェックは関数のコールスタックにある実行元URLをチェックする方式(Greasemonkey内やユーザスクリプトのURLならOK)
    • しかし、完全ではなく、about:blank的なページではチェックがすり抜ける模様
      • ということで、iframe.src="javascript:window.top.sendReturn();"みたいなことをやると....

まあ、詳しくはソースを見ると良いんじゃないかな!