めんどうくさくない Bugハンティング Jul 21 2012 Yosuke HASEGAWA
自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ・テクノロジー 技術顧問 Microsoft MVP for Consumer Security Oct 2005 - http://utf-8.jp/ セキュリティキャンプ Webセキュリティクラス講師
これまでに調べた脆弱性 Webブラウザ、Webアプリケーションを中心にいろいろ… CVE-2007-0995 XSS of Mozilla Firefox CVE-2007-1262 XSS of SquirrelMail CVE-2007-2227 XSS of Internet Explorer CVE-2008-0416 XSS of Mozilla Firefox CVE-2008-1468 XSS of Namazu CVE-2008-5808 XSS of Movable Type CVE-2010-1213 Cross-origin data disclosure of Mozilla Firefox CVE-2010-3348 Cross-origin data disclosure of Internet Explorer CVE-2010-3770 XSS of Mozilla Firefox CVE-2011-1339 XSS of Google Search Appliance CVE-2011-3384 XSS of Sage CVE-2011-3648 XSS of Mozilla Firefox ...
質問 Question
質問 : Web技術、好きですか? Q. Do you love web technologies?
質問 : Web技術、好きですか? Q. Do you love web technologies? クロスサイトスクリプティング 強制ブラウズ 書式文字列攻撃 リモートファイルインクルード SQLインジェクション LDAPインジェクション バッファオーバーフロー パストラバーサル CSRF 質問 : Web技術、好きですか? Q. Do you love web technologies? セッションハイジャック OSコマンドインジェクション オープンリダイレクタ セッション固定攻撃 DoS メモリリーク HTTPレスポンス分割 HTTPヘッダインジェクション XPathインジェクション
Web技術、好きですか? 「はい」に挙手した人 かなり打たれ強い or 攻撃者
そもそもバグハンターって?
バグハンター(適当な想像) バグハンターってこんな人だ バグハントの方法 いつもバイナリエディタを開いてる デバッガは友達 電卓立ち上げたら勝ちだと思ってる バグハントの方法 とにかくコードを追う ファザーで叩く 見つけるための根気と執念
バグハンター ≒ バイナリアン? 否
バイナリもWebもバグハンターの資質は変わらない バグハンター(適当な想像) バイナリ系バグハンター いつもバイナリエディタを開いてる デバッガは友達 電卓立ち上げたら勝ちだと思ってる バグハントの方法 とにかくコードを追う ファザーで叩く 見つけるための根気と執念 Web系バグハンター いつもローカルHTTPプロキシを開いてる IEは友達 alert立ち上げたら勝ちだと思ってる バグハントの方法 とにかく入出力を追う スキャナで叩く 見つけるための根気と執念 バイナリもWebもバグハンターの資質は変わらない
とにかく(コード|入出力)を追う 見つけるための根気と執念 だいぶめんどくさい!
「未来を予測する最善の方法は、 それを創りだすことだ」 バグ探しめんどくさい! 執念深く探すのはだいぶめんどくさい 探さずにバグを見つける方法はないものか? 「未来を予測する最善の方法は、 それを創りだすことだ」 アラン・ケイ
脆弱性も「創り」だしちゃえばいいんだ!!!
脆弱性を創りだす 新しい脆弱性を「創りだす」 めんどくさい解析とかイヤだ 手より頭を使う 実装のミスではなく、既存の仕様・機能を最大限悪用できる方法を考える 新しい攻撃手法を考える 昨日まで安全だったソフトウェアがある日とつぜん軒並み危険になる
新しい脆弱性を創りだす 既存の機能を最大限悪用できる方法、新しい攻撃手法 Unicode円記号によるパストラバーサル UTF-7によるXSS(IE) E4X+WebWorkersによるデータ漏えい(Firefox)
Unicode円記号による パストラバーサル
円記号によるパストラバーサル Unicodeにはパス区切りの∖(U+005C)とは別に\(U+00A5)が定義 UnicodeからShift_JISへの変換でどちらも0x5Cに置き換わる いろいろできるんじゃね?
円記号によるパストラバーサル Unicodeの入力を持ちながら内部はShift_JISで処理 NTFS/FAT32上のファイル名 アンチウイルスでDoS、検索エンジンのインデックサでトラバーサルなど メーラの添付ファイル 一時展開するディレクトリを超えて展開
円記号によるパストラバーサル
円記号によるパストラバーサル
UTF-7によるXSS
UTF-7によるXSS 初出: 2005年12月、Googleを対象としたXSSをYair Amit氏が報告
UTF-7によるXSS 文字コードをUTF-7と誤認することによるXSS +ADw-script+AD4-alert(1)+ADw-script+AD4- 当時の対策「charsetをつける」 文字コードを誤認させるのが目的ならcharsetついてても攻略できるんじゃね?
UTF-7によるXSS charsetついてても IEが認識できないcharsetならXSS可能 Content-Type: text/html;charset=cp932 <meta>より前にニセの<meta>吐いてXSS可能 <title>+ADw-/title+AD4APA-meta http-equiv+AD0-content-type content+AD0-text/html+ADs-charset=utf-7+AD4-</title>
UTF-7によるXSS GoogleのあちこちでXSS可能でした www, news, books, Appliance… http://www.google.com/search?oe=cp932&q=%2BADw-... (今ならがっぽり報奨金もらえたのに…)
E4X+WebWorkerによるデータ漏えい
E4X + Web Workers = データ漏えい ECMAScript for XML (ECMA-357) https://developer.mozilla.org/ja/E4X JS内に直接XMLを記述可能 Firefox 15以前、ActionScriptでサポート
E4X + Web Workers = データ漏えい ECMAScript for XML (ECMA-357) https://developer.mozilla.org/ja/E4X JS内に直接XMLを記述可能 Firefox、ActionScriptでサポート var s = <mail> <subject>Test mail</subject> <from>Yosuke HASEGAWA</from> <addr>hasegawa@utf-8.jp</addr> </mail> ; alert( s.subject );
E4X + Web Workers = データ漏えい XML内にJSの記述もできる。 XML内の {....} はJavaScriptとして動作
E4X + Web Workers = データ漏えい XML内にJSの記述もできる。 XML内の {....} はJavaScriptとして動作 var s = <mail> <subject>Test mail</subject> <from> { alert(1) } </from> <addr>hasegawa@utf-8.jp</addr> </mail> ; alert( s.subject ); { alert(1) }
E4X + Web Workers = データ漏えい E4XはJavaScript 外部から読み込み可能
E4X + Web Workers = データ漏えい var s = <mail> <subject>Test mail</subject> </mail> ; <script src="e4x.js"></script> <script> alert( s.subject ); </script>
E4X + Web Workers = データ漏えい これはJavaScript? HTML? HTMLでもありJavaScriptでもある <div> { alert( "Hello, E4X World." ); } </div> Hello, HTML World.
E4X + Web Workers = データ漏えい 攻撃者がHTML内の2か所に文字列を挿入可能な場合、その間のメッセージが外部から取得可能 (以下のコードは現在のFirefoxではそのままでは動作しません) <div>{ foo( <span>秘密のメッセージ部分</span> ) } </div> <script> function foo( s ){ alert( s ); } </script> <script src="target.html"></script>
E4X + Web Workers = データ漏えい FirefoxでのE4Xによるデータ漏えい対策 XML宣言、DOCTYPE宣言のついたXML,HTMLはE4Xとして解釈不可 script srcとして読み込まれたJSが単一のXMLオブジェクトのときはエラーとしてJSを実行しない 泥臭い… <div>{ foo( <span>秘密のメッセージ</span> ) } </div> // JavaScriptとして動作しない var s = <div>{ foo( <span>秘密のメッセージ</span> ) } </div>; // JavaScriptとして動作する
E4X + Web Workers = データ漏えい JavaScript待望のマルチスレッド機構 バックグランドで重い処理を実行 DOMとは切り離されている
E4X + Web Workers = データ漏えい var worker = new Worker( "worker.js" ); worker.onmessage = function( event ) { ... }; worker.postMessage( msg ); メイン側 onmessage = function( event ){ /* 時間のかかる処理 */ postMessage( msg ); // メイン側に通知 } worker.js
E4X + Web Workers = データ漏えい new Workers( src ) は同一オリジンのみ (プロトコル、ホスト、ポートが一致すること) Worker内からは間接的に他オリジンのJSも利用可能 var worker = new Worker( "worker.js" ); // OK var worker = new Worker( "http://utf-8.jp/w.js" ); // NG メイン側 importScripts( "http://utf-8.jp/w.js" ); // OK worker.js
E4X + Web Workers = データ漏えい FirefoxでのE4Xによるデータ漏えい対策 script srcとして読み込まれたJSが単一のXMLオブジェクトのときはエラーとしてJSを実行しない …というのが、Web Workers のimportScripts では効いていなかった E4XとWeb Workersを組み合わせると外部サイトのHTML内のデータを盗み見ることが可能だった <div>{ foo( <span>秘密のメッセージ</span> ) } </div> // JavaScriptとして動作しない var s = <div>{ foo( <span>秘密のメッセージ</span> ) } </div>; // JavaScriptとして動作する
E4X + Web Workers = データ漏えい FirefoxでのE4Xによるデータ漏えい対策 E4XとWeb Workersを組み合わせると外部サイトのHTML内のデータを盗み見ることが可能だった // 罠サイト: WebWorkersからJSとしてHTMLを読む var worker = new Worker( “http://.../target.html" ); // JavaScriptとして動作する <div>{ foo( <span>秘密のメッセージ</span> ) } </div>
E4X + Web Workers = データ漏えい 単一XMLオブジェクトが読み込めない 仕様通りの実装だと脆弱性を生む いったんは収まったがWeb Workersの実装に伴い再度オープン 枯れていない新しい機能は狙い目 MFSA-2010-42で修正済み
E4X + Web Workers = データ漏えい ちなみに Mozilla Security Bug Bounty Programの対象なので賞金もらいました :-)
$500の小切手!! (今なら$3000なのに)
まとめ
まとめ めんどくさくない方法でバグハント! 脆弱性を創りだす 報奨金は報告のタイミング次第 個別の脆弱性を丹念に探すのではなく 新しい攻撃手法を創りだし それに合致するソフトウェアの実装を探す 報奨金は報告のタイミング次第 うまくやればバグハンティングで暮らせる時代!
質問 hasegawa@utf-8.jp hasegawa@netagent.co.jp @hasegawayosuke http://utf-8.jp/