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