1.06k likes | 1.84k Views
HTML5 時代の Web セキュリティ. 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
E N D
HTML5時代のWebセキュリティ 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 ...
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())(); 記号JavaScript JS without alnum jjencode - http://utf-8.jp/public/jjencode.html
゚ω゚ノ= /`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゚]) (゚Θ゚)) ('_'); 顔文字JavaScript JS with emoticons aaencode - http://utf-8.jp/public/aaencode.html
質問 :Web技術、好きですか?Q. Do you love web technologies?
クロスサイトスクリプティング 強制ブラウズ 書式文字列攻撃 リモートファイルインクルード SQLインジェクション LDAPインジェクション バッファオーバーフロー パストラバーサル CSRF 質問 :Web技術、好きですか?Q. Do you love web technologies? セッションハイジャック OSコマンドインジェクション オープンリダイレクタ セッション固定攻撃 DoS メモリリーク HTTPレスポンス分割 HTTPヘッダインジェクション XPathインジェクション
Web技術、好きですか? 「はい」に挙手した人 • かなり打たれ強いor • 攻撃者
HTML5時代のWebアプリ • 次々とリリースされるブラウザ • 多数の新しい要素と属性 • canvas, video, audio, input… • 多数の新しいAPI • Web Sockets, Web Storage, XHR Lv.2… • 最適化されたJavaScriptエンジン • 高速化された描画エンジン • どのブラウザにどの機能が実装されているのか把握できない
次々とリリースされるブラウザ 2001 2001 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 6 7 8 9 10 3.6 15 1.0 1.5 2.0 3.0 3.5 Ajax 5 1 3 4 2 23 5 6 1 2 3 4 11 5 6 7 8 9 10 12
HTML5の新機能 • マルチメディアのサポート<video> <audio> <canvas>... • 文書構造を表す要素<section> <header> <footer> ... • フォームの拡張<input type="email"> ... • JavaScript APIWeb Workers, WebSocket, File... • その他…
HTML5時代のWebアプリ • HTML5時代のブラウザ • 高速化、高機能化 • 実行コードのブラウザ上へのシフト • ネイティブアプリからWebアプリへ • サーバ側で実行されていた処理がブラウザのJavaScript上へ • 攻撃もクライアントサイドへシフト • JavaScript上の問題点の増加 • XSSやCSRFなどの比重が増加
HTML5時代のWebアプリ • 攻撃もクライアントサイドへシフト • JavaScriptを通じた攻撃の比重が増加 • XSSのリスクも増加 “ 多くの点から見て、XSS 脆弱性の危険性はバッファ オーバーフローに匹敵します。 ” セキュリティに関するブリーフィング : Web に対する SDL の適用 http://msdn.microsoft.com/ja-jp/magazine/cc794277.aspx
XSSおさらい • 対象 • 動的にHTMLを生成するWebアプリ • 問題 • 攻撃者が用意したスクリプトがHTML内に挿入される • 対策 • HTMLを生成する時点でエスケープ
XSSおさらい http://shop.example.com/ ?item="><script>... 攻撃者 被害者 GET /?item="><script>... <input type="text" value=""><script>... HTMLを生成するときの エスケープ漏れ オンラインショップなど
XSSおさらい http://shop.example.com/ ?item="><script>... 攻撃者 被害者 GET /?item="><script>... <input type="text" value=""><script>... 反射型XSS ユーザの送信内容をそのまま表示する オンラインショップなど
XSSおさらい 攻撃者 被害者 Subject: test mail <html><script>... Subject: test mail <html><script>... HTMLを生成するときの エスケープ漏れ Webメールなど
XSSおさらい 攻撃者 被害者 Subject: test mail <html><script>... Subject: test mail <html><script>... 持続型/蓄積型XSS 攻撃者のスクリプトはサーバ内で保持されている HTMLを生成するときの エスケープ漏れ Webメールなど
XSSおさらい • 対象 • 動的にHTMLを生成するWebアプリ • 問題 • 攻撃者が用意したスクリプトがHTML内に挿入される • 対策 • HTMLを生成する時点でエスケープ
大原則HTMLを生成する時点でエスケープ って何だっけ? → おさらい
XSSおさらい <html> • HTMLを生成する時点でエスケープ! < → < > → > " → " ' → ' & → & < > 1101100110010 0010001110110 1000010100110 0101011011110 データ 処理 HTML生成 ユーザ
エスケープの例外 • href、src等のURLの動的生成 • http以外のスキームに注意 • JavaScript内の動的生成 • JS内の文字列リテラルはHTMLとは異なるエスケープ <a href="javascript:alert(1)"> <iframe src="data:text/html;base64, PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> <script> var s="</script><script>alert(1)//"; </script>
XSSおさらい • HTMLを生成する時点でエスケープ • コンテキスト(文脈)に応じたエスケープ • コンテキストが入れ子になっているときはエスケープも入れ子に。<div onclick="foo('\u0022><script>…');"> • URLの動的生成 • href、src等はhttp,https限定とする
やってはいけないXSS対策 <html> • 入力時のサニタイズ < → < > → > " → " ' → ' & → & < > 1101100110010 0010001110110 1000010100110 0101011011110 サニタイズ データ 処理 HTML生成 ユーザ
やってはいけない:入力時のサニタイズ • 入力時点でのデータの加工はプログラム規模が大きくなると破綻する • 「サニタイズ」という語が本来の意味を失って意味不明になっている • 続きはWebで サニタイズ言うな 検索
XSSの種類 • 反射型XSS / Type-1 • ユーザからの送信内容をそのまま表示 • XSSフィルタ等である程度防御 • お問い合わせフォーム、サイト内検索 • 持続型XSS / Type-2 • 攻撃者のスクリプトがサーバ内で保持 • 掲示板、Webメール
XSSの種類 • 反射型XSS / Type-1 • ユーザからの送信内容をそのまま表示 • XSSフィルタ等である程度防御 • お問い合わせフォーム、サイト内検索 • 持続型XSS / Type-2 • 攻撃者のスクリプトがサーバ内で保持 • 掲示板、Webメール ※GETだけでなくPOSTもあり得る GET /?item="><script>... <input type="text"value=""><script>...
XSSの種類 XSSフィルターはリクエストとレスポンス 両方に同じスクリプトが含まれると反応
XSSの種類 • 反射型XSS / Type-1 • ユーザからの送信内容をそのまま表示 • XSSフィルタ等である程度防御 • お問い合わせフォーム、サイト内検索 • 持続型XSS / Type-2 • 攻撃者のスクリプトがサーバ内で保持 • 掲示板、Webメール
XSSの種類 • 反射型XSS / Type-1 • ユーザからの送信内容をそのまま表示 • XSSフィルタ等である程度防御 • お問い合わせフォーム、サイト内検索 • 持続型XSS / Type-2 • 攻撃者のスクリプトがサーバ内で保持 • 掲示板、Webメール Subject: test <script>... Subject: test <script>...
XSSの種類 • 持続型XSS / Type-2 • 2006年6月 mixi「こんにちはこんにちは」 • 2007年8月 Twitter「こんにちはこんにちは」 • 2010年9月 Twitter
XSSの種類 • 反射型XSS / Type-1 • ユーザからの送信内容をそのまま表示 • XSSフィルタ等である程度防御 • お問い合わせフォーム、サイト内検索 • 持続型XSS / Type-2 • 攻撃者のスクリプトがサーバ内で保持 • 掲示板、Webメール • DOM based XSS / Type-0 • JavaScriptが引き起こす • サーバ側のHTML生成には問題なし //http://example.jp/#<script>alert(1)</script> div.innerHTML = location.hash;
DOM based XSS • JavaScriptが引き起こすXSS • サーバ側のHTML生成時には問題なし • JavaScriptによるHTMLレンダリング時の問題 • JavaScriptの利用に合わせて増加 //http://example.jp/#<script>alert(1)</script> div.innerHTML = location.hash;
DOM based XSS location.hashを使ったXSSの場合、サーバ側に攻撃の詳細が残らない
HTML5が生む脆弱性 • Cross-Site Scripting(XSS) • 要素、属性、イベントが増えている • Cross-Document Messaging(XDM) • クロスドメインでのドキュメント間通信 • XMLHttpRequest(XHR) Lv.2 • クロスドメインでの読み込み • Ajaxデータを利用した攻撃 • XSS、データの盗み見
HTML5が生む脆弱性 • Cross-Site Scripting(XSS) • 要素、属性、イベントが増えている • Cross-Document Messaging(XDM) • クロスドメインでのドキュメント間通信 • XMLHttpRequest(XHR) Lv.2 • クロスドメインでの読み込み • Ajaxデータを利用した攻撃 • XSS、データの盗み見
XSS • これまでの間違ったXSS対策 • 危険そうな要素を検出<script> <object> <iframe> • onXXX、hrefなどの名称の属性を検出<div onmouseover=alert(1)><img src=# onerror=alert(1)><a href="javascript:alert(1)> • これまで仮にこの方法で網羅できていたとしても…
XSS • HTML5で多数の要素、属性、イベントが導入<input autofocuspattern="..."><videoonplay="...">
XSS • いわゆる「ブラックリスト」での対応に漏れ • そもそもブラックリスト方式は無理がある • 「HTML生成時にエスケープ」の原則 • HTML5と関係なくXSSを防げる <form> <button formaction="javascript:alert(1)">X </button> //http://html5sec.org/#72