HTML5時代の Webセキュリティ Jul 21 2012 Yosuke HASEGAWA 自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ・テクノロジー 技術顧問 Microsoft MVP for Consumer Security Oct 2005 http://utf-8.jp/ セキュリティキャンプ Webセキュリティクラス講師 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ これまでに調べた脆弱性 Webブラウザ、Webアプリケーションを中 心にいろいろ… CVE-2007-0995 CVE-2007-1262 CVE-2007-2227 CVE-2008-0416 CVE-2008-1468 CVE-2008-5808 CVE-2010-1213 CVE-2010-3348 CVE-2010-3770 CVE-2011-1339 CVE-2011-3384 CVE-2011-3648 ... security-mikan techtalk #5 XSS of Mozilla Firefox XSS of SquirrelMail XSS of Internet Explorer XSS of Mozilla Firefox XSS of Namazu XSS of Movable Type Cross-origin data disclosure of Mozilla Firefox Cross-origin data disclosure of Internet Explorer XSS of Mozilla Firefox XSS of Google Search Appliance XSS of Sage XSS of Mozilla Firefox NetAgent http://www.netagent.co.jp/ 難読化 JavaScript Obfuscated JavaScript 記号JavaScript JS without alnum $=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:+ +$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$_ _:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$} ;$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$ ])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($. _=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$ ._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\" "+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\ \"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$ ._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$ .$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_ +$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\ \"+$.$__+$.___+")"+"\"")())(); jjencode - http://utf-8.jp/public/jjencode.html 顔文字JavaScript JS with emoticons ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o (゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+ ((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚) [゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)a+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚) [゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚) [゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚) [゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_'); aaencode - http://utf-8.jp/public/aaencode.html 質問 Question 質問 : Web技術、好きですか? Q. Do you love web technologies? クロスサイトスクリプティング 強制ブラウズ 書式文字列攻撃 リモートファイルインクルード SQLインジェクション パストラバーサル LDAPインジェクション バッファオーバーフロー CSRF セッションハイジャック 質問 : Web技術、好きですか? Q. Do you love web technologies? OSコマンドインジェクション オープンリダイレクタ DoS セッション固定攻撃 HTTPレスポンス分割 XPathインジェクション メモリリーク HTTPヘッダインジェクション Web技術、好きですか? 「はい」に挙手した人 かなり打たれ強い or 攻撃者 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ HTML5時代のWebアプリ HTML5時代のWebアプリ 次々とリリースされるブラウザ 多数の新しい要素と属性 canvas, video, audio, input… 多数の新しいAPI Web Sockets, Web Storage, XHR Lv.2… 最適化されたJavaScriptエンジン 高速化された描画エンジン どのブラウザにどの機能が実装されてい るのか把握できない security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ 次々とリリースされるブラウザ 2001 2001 2003 2004 2005 2006 6 2007 2008 2009 7 1.0 1.5 2.0 1 6 security-mikan techtalk #5 7 2 8 3 9 2011 8 3.0 23 5 10 10 15 2 3 4 5 4 2012 9 3.6 3.5 1 5 2010 11 6 12 NetAgent http://www.netagent.co.jp/ HTML5の新機能 マルチメディアのサポート <video> <audio> <canvas>... 文書構造を表す要素 <section> <header> <footer> ... フォームの拡張 <input type="email"> ... JavaScript API Web Workers, WebSocket, File... その他… security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ HTML5時代のWebアプリ HTML5時代のブラウザ 高速化、高機能化 実行コードのブラウザ上へのシフト ネイティブアプリからWebアプリへ サーバ側で実行されていた処理がブラウザの JavaScript上へ 攻撃もクライアントサイドへシフト JavaScript上の問題点の増加 XSSやCSRFなどの比重が増加 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ HTML5時代のWebアプリ 攻撃もクライアントサイドへシフト JavaScriptを通じた攻撃の比重が増加 XSSのリスクも増加 “ 多くの点から見て、XSS 脆弱性の危険性 はバッファ オーバーフローに匹敵します。 ” セキュリティに関するブリーフィング : Web に対する SDL の適用 http://msdn.microsoft.com/ja-jp/magazine/cc794277.aspx security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ そもそもXSSって? →簡単におさらい XSSおさらい 対象 動的にHTMLを生成するWebアプリ 問題 攻撃者が用意したスクリプトがHTML内に挿 入される 対策 HTMLを生成する時点でエスケープ security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSおさらい http://shop.example.com/ ?item="><script>... 攻撃者 被害者 GET /?item="><script>... <input type="text" value=""><script>... HTMLを生成するときの エスケープ漏れ security-mikan techtalk #5 オンラインショップなど NetAgent http://www.netagent.co.jp/ XSSおさらい http://shop.example.com/ ?item="><script>... 攻撃者 被害者 GET /?item="><script>... <input type="text" value=""><script>... 反射型XSS ユーザの送信内容をそのまま表示する オンラインショップなど security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSおさらい 攻撃者 被害者 Subject: test mail <html><script>... HTMLを生成するときの エスケープ漏れ security-mikan techtalk #5 Subject: test mail <html><script>... Webメールなど NetAgent http://www.netagent.co.jp/ XSSおさらい 攻撃者 被害者 Subject: test mail <html><script>... Subject: test mail <html><script>... 持続型/蓄積型XSS HTMLを生成するときの 攻撃者のスクリプトはサーバ内で保持されている Webメールなど エスケープ漏れ security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSおさらい 対象 動的にHTMLを生成するWebアプリ 問題 攻撃者が用意したスクリプトがHTML内に挿 入される 対策 HTMLを生成する時点でエスケープ security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ 大原則 HTMLを生成する時点で エスケープ って何だっけ? → おさらい XSSおさらい HTMLを生成する時点でエスケープ! < → < > → > " → " ' → ' & → & <html> < > データ security-mikan techtalk #5 処理 HTML生成 ユーザ NetAgent http://www.netagent.co.jp/ エスケープの例外 href、src等のURLの動的生成 <a href="javascript:alert(1)"> <iframe src="data:text/html;base64, PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> http以外のスキームに注意 JavaScript内の動的生成 <script> var s="</script><script>alert(1)//"; </script> JS内の文字列リテラルはHTMLとは異なるエ スケープ security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSおさらい HTMLを生成する時点でエスケープ コンテキスト(文脈)に応じたエスケープ コンテキストが入れ子になっているときはエス ケープも入れ子に。 <div onclick="foo('\u0022><script>…');"> URLの動的生成 href、src等はhttp,https限定とする security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ やってはいけない XSS対策 やってはいけないXSS対策 入力時のサニタイズ < → < > → > " → " ' → ' & → & データ サニタイズ security-mikan techtalk #5 <html> < > 処理 HTML生成 ユーザ NetAgent http://www.netagent.co.jp/ やってはいけない:入力時のサニタイズ 入力時点でのデータの加工はプログラム 規模が大きくなると破綻する 「サニタイズ」という語が本来の意味を 失って意味不明になっている 続きはWebで サニタイズ言うな security-mikan techtalk #5 検索 NetAgent http://www.netagent.co.jp/ XSSの種類 XSSの種類 反射型XSS / Type-1 ユーザからの送信内容をそのまま表示 XSSフィルタ等である程度防御 お問い合わせフォーム、サイト内検索 持続型XSS / Type-2 攻撃者のスクリプトがサーバ内で保持 掲示板、Webメール security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSの種類 反射型XSS / Type-1 ユーザからの送信内容をそのまま表示 XSSフィルタ等である程度防御 お問い合わせフォーム、サイト内検索 持続型XSS / Type-2 攻撃者のスクリプトがサーバ内で保持 掲示板、Webメール ※GETだけでなくPOSTもあり得る GET /?item="><script>... <input type="text" value=""><script>... security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSの種類 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSの種類 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSの種類 XSSフィルターはリクエストとレスポンス 両方に同じスクリプトが含まれると反応 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSの種類 反射型XSS / Type-1 ユーザからの送信内容をそのまま表示 XSSフィルタ等である程度防御 お問い合わせフォーム、サイト内検索 持続型XSS / Type-2 攻撃者のスクリプトがサーバ内で保持 掲示板、Webメール security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSの種類 反射型XSS / Type-1 ユーザからの送信内容をそのまま表示 XSSフィルタ等である程度防御 お問い合わせフォーム、サイト内検索 持続型XSS / Type-2 攻撃者のスクリプトがサーバ内で保持 掲示板、Webメール security-mikan techtalk #5 Subject: test Subject: test <script>... <script>... NetAgent http://www.netagent.co.jp/ XSSの種類 持続型XSS / Type-2 2006年6月 mixi「こんにちはこんにちは」 2007年8月 Twitter「こんにちはこんにち は」 2010年9月 Twitter security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSの種類 反射型XSS / Type-1 ユーザからの送信内容をそのまま表示 XSSフィルタ等である程度防御 お問い合わせフォーム、サイト内検索 //http://example.jp/#<script>alert(1)</script> div.innerHTML =/location.hash; 持続型XSS Type-2 攻撃者のスクリプトがサーバ内で保持 掲示板、Webメール DOM based XSS / Type-0 JavaScriptが引き起こす サーバ側のHTML生成には問題なし security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ DOM based XSS DOM based XSS JavaScriptが引き起こすXSS サーバ側のHTML生成時には問題なし JavaScriptによるHTMLレンダリング時の問題 //http://example.jp/#<script>alert(1)</script> div.innerHTML = location.hash; JavaScriptの利用に合わせて増加 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ DOM based XSS location.hashを使ったXSSの場合、サーバ側に攻撃の 詳細が残らない security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ ここまでXSSの復習です! HTML5が生む脆弱性 HTML5が生む脆弱性 Cross-Site Scripting(XSS) 要素、属性、イベントが増えている Cross-Document Messaging(XDM) クロスドメインでのドキュメント間通信 XMLHttpRequest(XHR) Lv.2 クロスドメインでの読み込み Ajaxデータを利用した攻撃 XSS、データの盗み見 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ HTML5が生む脆弱性 Cross-Site Scripting(XSS) 要素、属性、イベントが増えている Cross-Document Messaging(XDM) クロスドメインでのドキュメント間通信 XMLHttpRequest(XHR) Lv.2 クロスドメインでの読み込み Ajaxデータを利用した攻撃 XSS、データの盗み見 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSS これまでの間違ったXSS対策 危険そうな要素を検出 <script> <object> <iframe> onXXX、hrefなどの名称の属性を検出 <div onmouseover=alert(1)> <img src=# onerror=alert(1)> <a href="javascript:alert(1)> これまで仮にこの方法で網羅できていた としても… security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSS HTML5で多数の要素、属性、イベントが 導入 <input autofocus pattern="..."> <video onplay="..."> security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSS いわゆる「ブラックリスト」での対応に 漏れ <form> <button formaction="javascript:alert(1)">X </button> //http://html5sec.org/#72 そもそもブラックリスト方式は無理がある 「HTML生成時にエスケープ」の原則 HTML5と関係なくXSSを防げる security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ DOM based XSS DOM based XSSは増えている JavaScriptの大規模化に伴い増加 サーバ側での対策と原則は同じ HTML生成時にエスケープ URL生成時はhttp(s)のみ backgroundImageへの代入やイベントハ ンドラの動的生成は避ける security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ DOM based XSS HTML生成時にエスケープ div.innerHTML = s.replace( /&/g, "&" ) .replace( /</g, "<" ) .replace( />/g, ">" ) .replace( /"/g, """ ) .replace( /'/g, "'" ); むしろtextNodeを使おう! div.appendChild( document.createTextElement( s ) ); security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ DOM based XSS URL生成時はhttp(s)のみ if( url.match( /^https?:\/\// ) ){ a.setAttribute( "href", url ); } var base = location.protocol + "//" + location.host + "/"; if( url.substring( 0, base.length ) == base ){ location.href = url; } オープンリダイレクタを発生させないよう 同一ホストに制限 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ DOM based XSS // bad code div.innerHTML = '<a href="' + url + '">' + url + '</a>'; if( url.match( /^https?:\/\// ) ){ var elm = docuement.createElement( "a" ); elm.appendChild( document.createTextNode( url ) ); elm.setAttribute( "href", url ); div.appendChild( elm ); } security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ HTML5が生む脆弱性 Cross-Site Scripting(XSS) 要素、属性、イベントが増えている Cross-Document Messaging(XDM) クロスドメインでのドキュメント間通信 XMLHttpRequest(XHR) Lv.2 クロスドメインでの読み込み Ajaxデータを利用した攻撃 XSS、データの盗み見 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XDM Cross-Document Messaging ブラウザのwindow/iframe間で相互に通信 http://example.com/ iframe1.contentWindow.postMessage( "..." ); <iframe id="iframe1"> http://example.jp/ window.onmessage=function( ){ } security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XDM Cross-Document Messaging // メッセージ送信側 iframe1.contentWindow.postMessage( "メッセージ" ) // メッセージ受信側 (iframe内に表示) window.onmessage = function( e ){ if( e.origin == "http://example.jp/" ){ alert( e.data ); } } 正規の相手以外と通信しないようにoriginを必ず確認する security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ HTML5が生む脆弱性 Cross-Site Scripting(XSS) 要素、属性、イベントが増えている Cross-Document Messaging(XDM) クロスドメインでのドキュメント間通信 XMLHttpRequest(XHR) Lv.2 クロスドメインでの読み込み Ajaxデータを利用した攻撃 XSS、データの盗み見 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XHR Lv.2 XMLHttpRequest かつては同一オリジンへのリクエストしかで きなかった プロトコル + ホスト + ポート var xhr = new XMLHttpRequest(); xhr.open( "GET", "http://example.jp/", true ); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ){ alert( xhr.responseText ); } } xhr.send( null ); security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XHR Lv.2 XMLHttpRequest 現在はクロスドメインでのリクエストが可能 base.example.jp another.example.jp HTML GET / HTTP/1.1 Host: another.example.jp Origin: http://base.example.jp/ HTTP/1.1 200 OK Access-Control-Allow-Origin: * security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XHR Lv.2 XHRを利用する側は、任意ドメインから のデータを読まないようにチェック // bad code: http://example.jp/#/foo/bar.txt var url = location.hash.substring(1); var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ){ div.innerHTML = xhr.responseText; } } xhr.send( null ); http://example.jp/#http://evil.example.jp/ などの指定で任意コンテンツを挿入可能 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XHR Lv.2 XHRを利用する側は、任意ドメインから のデータを読まないようにチェック // bad code: http://example.jp/#/foo/bar.txt var url = location.hash.substring(1); var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ){ div.innerHTML = xhr.responseText; } } xhr.send( null ); http://example.jp/#http://evil.example.jp/ などの指定で任意コンテンツを挿入可能 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XHR Lv.2 XHRを利用する側は、任意ドメインから のデータを読まないようにチェック // http://example.jp/#/foo/bar.txt var url = location.hash.substring(1); if( url.match( /^\/\w/ ) ){ var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); ... } security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XHR Lv.2 サーバ側:特定の相手にのみ応答を許可 GET / HTTP/1.1 Host: another.example.jp Origin: http://base.example.jp/ リクエスト レスポンス HTTP/1.1 200 OK Access-Control-Allow-Origin: htp://base.example.jp サーバ側はリクエストのOriginヘッダを見て 相手を判別してはいけない Originヘッダは偽装されている可能性がある。 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XHR Lv.2 サーバ側:特定の相手にのみ応答を許可。 JSで明示的に指定した場合のみCookieが送 信される xhr.withCredentials = true; // JavaScript内 GET / HTTP/1.1 Host: another.example.jp Origin: http://base.example.jp/ Cookie: sessionid=A251BBCA リクエスト HTTP/1.1 200 OK レスポンス Access-Control-Allow-Origin: htp://base.example.jp Access-Control-Allow-Credentials: true security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XHR Lv.2 サーバ側:特定の相手にのみ応答を許可。 リクエストヘッダに「秘密の情報」を含める xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" ); サーバ側はリクエストヘッダ内の情報を確認 して正規の通信相手か判断 クロスドメインでのsetRequestHeaderは 癖があるので注意 事前にOPTIONS要求が発行(preflight) https://developer.mozilla.org/en/http_access_control security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ HTML5が生む脆弱性 Cross-Site Scripting(XSS) 要素、属性、イベントが増えている Cross-Document Messaging(XDM) クロスドメインでのドキュメント間通信 XMLHttpRequest(XHR) Lv.2 クロスドメインでの読み込み Ajaxデータを利用した攻撃 XSS、データの盗み見 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用した攻撃 Ajaxでの利用増加 HTML5とは直接は関係ない Ajaxデータを利用したXSS Ajaxでやり取りされるデータ(JSON,text, csv etc..)を直接ブラウザ上で開いたときに XSS Ajaxデータの盗み見 機密情報を含むAjaxデータを受動的攻撃によ り攻撃者が盗み見る security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用した攻撃 Ajaxでの利用増加 HTML5とは直接は関係ない Ajaxデータを利用したXSS Ajaxでやり取りされるデータ(JSON,text, csv etc..)を直接ブラウザ上で開いたときに XSS Ajaxデータの盗み見 機密情報を含むAjaxデータを受動的攻撃によ り攻撃者が盗み見る security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用したXSS IEのContent-Type無視 HTMLではないものがHTMLに昇格して XSS 例えばtext/plain security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用したXSS IEは最終的に「ファイルタイプ」に基づいて コンテンツを処理する Content-Type 以外にも様々な要因から ファイルタイプを決定 文書化されていない複雑なメカニズム 「ファイルのダウンロードダイアログで表示され るファイル名の命名規則」 http://support.microsoft.com/kb/436153/ja ファイルタイプ決定のメカニズム解明に近づく唯一のドキュメント security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用したXSS ファイルタイプの決定因子 "Content-Type" HTTPレスポンスヘッダ "X-Content-Type-Option" HTTPレスポ ンスヘッダ Windowsレジストリにおける関連付け IEの設定:"拡張子ではなく、内容によって ファイルを開く" URL自身 コンテンツそのもの security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ IEにおけるファイルタイプ決定のメカニズム Content-Typeがレジストリに登録されている? [ HKEY_CLASSES_ROOT\MIME\Database\Content Type ] Y N ファイルタイプを仮決定 外部プラグイン/アプリが必要? IE8+ && "X-Content-Type-Options:nosniff"? Y Y プラグインを起動またはダウンロード N IE8+ && "X-Content-Type-Options:nosniff"? Y N ダウンロード 仮決定したファイルタイプを使用 N 「拡張子ではなく、内容によって ファイルを開く」設定値 有効 コンテンツをsniffしファイルタイプを決定 無効 仮決定したファイルタイプを使用 URLの拡張子が ".cgi" または ".exe" または "/" ? Y e.g. http://utf-8.jp/a.cgi?abcd, http://utf-8.jp/foo/ N QUERY_STRINGからファイルタイプを 仮決定 URLの拡張子からファイルタイプを 仮決定 外部プラグイン/アプリが必要? 外部プラグイン/アプリが必要? N コンテンツをsniffし ファイルタイプを決定 ※これ以外にも例外的な挙動が多数あり Y プラグインを起動 またはダウンロード N コンテンツをsniffし ファイルタイプを決定 Y プラグインを起動 またはダウンロード 73 Yosuke HASEGAWA http://utf-8.jp/ Ajaxデータを利用したXSS ファイルタイプ決定のメカニズムは、と にかく複雑すぎる! そもそも例外的な挙動が多い いつのまにか挙動が変化していることも多い Microsoft自身も挙動を把握しきれていない のでは security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用したXSS XSS実例 https://www.microsoft.com/en-us/homepage/ bimapping.js/a.html?v=<script>alert(1)</script>&k... HTTP/1.1 200 OK Content-Type: text/javascript; charset=utf-8 Date: Wed, 22 Jun 2011 13:53:37 GMT Content-Length: 2092 var <script>alert(1)</script>={"Webtrends":{"enabled":true,"sett ings":{"interactiontype":{"0":true,"1":true,"2":true,"3":true,"4":t rue,"5":true,"6":true,"7":true,"8":true,"9":true,"10":true,"11":tr ue,"12":true,"13".... "text/javascript" はレジストリに未登録 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用したXSS XSS実例 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用したXSS AjaxコンテンツによるXSSは以下のよう な状況で発生しやすい JSON - JSON文字列内 {"text" :"<script>..." } JSONP - callback名 http://example.com/?callback=<script>... text, CSV - そもそもエスケープできない 対策の話はあとで。 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用した攻撃 Ajaxでの利用増加 HTML5とは直接は関係ない Ajaxデータを利用したXSS Ajaxでやり取りされるデータ(JSON,text, csv etc..)を直接ブラウザ上で開いたときに XSS Ajaxデータの盗み見 機密情報を含むAjaxデータを受動的攻撃によ り攻撃者が盗み見る security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータの盗み見 JavaScriptとして解釈可能なAjaxデータ が狙われやすい JavaScriptのsrcとして読み込む <script src="target.json"></script> <script src="target.csv"></script> JSON {"from" : "[email protected]"} security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータの盗み見 様々な手法でブラウザごとにJSONデータ を奪取 JSON Array Hijacking for Android JSON Hijacking for IE JSON以外にもCSVなどは狙いやすい security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータの盗み見 様々な手法でブラウザごとにJSONデータ を奪取 JSON Hijacking for Android JSON Hijacking for IE JSON以外にもCSVなどは狙いやすい security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Array Hijacking for Android Androidでは、古いJSON Hijackingの 手法がまた通用する PC用ブラウザでは2008年頃にはすでに根絶 Android 2.2, 2.3で確認 property setter の再定義 機密情報を含むJSON配列がターゲット security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Array Hijacking for Android [ { "name" : "alice", "mail" : "[email protected]" }, { "name" : "bob", "mail" : "[email protected]" }, ] 攻撃対象となるJSON : http://example.jp/target.json <script type="text/javascript"> var s = ""; Object.prototype.__defineSetter__( "mail", function( val ) { s += "mail:" + val + "\n"; } ); Object.prototype.__defineSetter__( "name", function( val ) { s += "name:" + val + "\n"; } ); </script> <script src="http://example.jp/target.json"></script> 攻撃者の作成した罠ページ security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータの盗み見 様々な手法でブラウザごとにJSONデータ を奪取 JSON Hijacking for Android JSON Hijacking for IE JSON以外にもCSVなどは狙いやすい security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ JSON Hijacking for IE IE6,IE7では特定条件下でJSONの奪取が 可能 攻撃者がJSON内に文字列を挿入可能 機密情報を含むJSONがターゲット security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ JSON Hijacking for IE [ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "[email protected]" 攻撃者によって挿入 }, { "name" : "John Smith", "mail" : "[email protected]" } ] ターゲットとなるJSON : http://example.com/newmail.json security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ JSON Hijacking for IE [ { "name" : "abc"}];var t=[{"":"", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" } ] ターゲットとなるJSON : http://example.com/newmail.json security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ JSON Hijacking for IE 攻撃者は罠ページを準備して誘導 <script src="http://example.com/newmail.json" charset="utf-7"> <script> alert( t[ 1 ].name + t[ 1 ].mail ); </script> ターゲットとなるJSON http://example.com/newmail.json [ { "name" : "abc+MPv/fwAiAH0AXQA7-var "abc"}];var t=[{"":"", t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" } ] security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ JSON Hijacking for IE 攻撃者の準備した罠ページ <script src="http://example.com/newmail.json" charset="utf-7"> 攻撃者対象のJSON こっちが優先される Content-Type: application/json; charset=utf-8 [ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" } ] security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ JSON Hijacking for IE IE6,IE7はHTTPレスポンスヘッダより <script>要素のcharset属性を優先 IE8では修正されている 2008年10月に報告したが修正されない security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用した攻撃 Ajaxデータを利用した攻撃 Ajaxデータを利用したXSS Ajaxでやり取りされるデータ(JSON,text, csv etc..) を直接ブラウザ上で開いたときにXSS Ajaxデータの盗み見 機密情報を含むAjaxデータを受動的攻撃により攻撃者 が盗み見る 対策 XMLHttpRequest以外からのアクセスを弾く X-Content-Type-Options: nosniffヘッダ エスケープ(XSS対策)、POST only(盗み見対策)など も次善策として… security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用した攻撃への対策 XMLHttpRequest以外からのアクセスを 弾く Ajaxデータは通常、XHRからのリクエスト を想定している XHR以外からアクセスさせないことでXSSお よび盗み見を防ぐことができる security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用した攻撃への対策 XMLHttpRequest以外からのアクセスを 弾く リクエストヘッダに特定文字列を入れる GET http://example.jp/foo.json HTTP/1.1 Host: example.jp Connection: keep-alive X-Request-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:8.0) jQuery、prototype.js だと X-Request-With は自動挿入される security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用した攻撃への対策 XMLHttpRequest以外からのアクセスを 弾く リクエストヘッダに特定文字列を入れる GET http://example.jp/foo.json HTTP/1.1 Host: example.jp Connection: keep-alive X-Request-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:8.0) jQuery、prototype.js だと X-Request-With は自動挿入される security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Ajaxデータを利用した攻撃への対策 X-Content-Type-Optoins:nosniff レスポンスヘッダで応答 Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff IE8以降でHTML扱いされることがなくなる security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ HTML5が生む脆弱性:まとめ Cross-Site Scripting(XSS) これまで通りの対策の徹底 Cross-Document Messaging(XDM) originによる通信相手の確認 XMLHttpRequest(XHR) Lv.2 クライアント/サーバ側とも通信相手を確認 Ajaxデータを利用した攻撃 XMLHttpRequestからの要求のみに限定 X-Content-Type-Options:nosniffヘッダの 付与 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ 新しい防御機構 新しい防御機構 様々な防御機構がブラウザに追加 XSSフィルター / XSS Auditor X-Content-Type-Options クリックジャッキング対策 Content Security Policy security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ XSSフィルター / XSS Auditor 反射型のXSSをほぼ軽減 IE8+、Chrome、Safari に搭載 レスポンスヘッダに X-XSS-Protection: 0 の指定でフィルタを停止可能 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ X-Content-Type-Options Content-Typeに従ってコンテンツを開 く指定 コンテンツ内の "sniff" を行わなくなる IE8+で有効 レスポンスヘッダに以下をつける X-Content-Type-Options: nosniff 原則、全てのコンテンツにつけておくべ き。 security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ クリックジャッキング対策 クリックジャッキング 標的サイトを透明に重ね、意図しないクリッ ク等を引き起こす攻撃 透明表示の 標的サイト 罠サイト security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ クリックジャッキング対策 frameおよびiframeでの表示を禁止する IE8+、Chrome、Safari、Opera、 Firefoxの各ブラウザが対応 レスポンスヘッダで指定 // 全ての埋め込みを禁止 X-Frame-Options: DENY // 同一オリジン以外からの埋め込みを禁止 X-Frame-Options: SAMEORIGIN http://www.jpcert.or.jp/ed/2009/ed090001.pdf security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ Content Security Policy Content-Security-Policy(CSP) <script src>等のソースを限定するための 指令 レスポンスヘッダで指定 // 画像以外を同一ドメインに制約 Content-Security-Policy: default-src 'self'; image-src * // example.jp の script src を許可 Content-Security-Policy: default-src 'self'; script-src example.jp http://www.w3.org/TR/2012/WD-CSP-20120710/ http://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/ 質問タイム 質問 [email protected] [email protected] @hasegawayosuke http://utf-8.jp/ security-mikan techtalk #5 NetAgent http://www.netagent.co.jp/
© Copyright 2024 ExpyDoc