880 likes | 999 Views
Web::Security beyond HTML5. Sep 28 2012 Yosuke HASEGAWA. 謝罪. 「 HTML5 」関係ないです Perl のコードも出てきません. 自己紹介. はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ・テクノロジー 技術顧問 Microsoft MVP for Consumer Security Oct 2005 - http://utf-8.jp/. これまでに調べた脆弱性. Web ブラウザ、 Web アプリケーションを中心にいろいろ …
E N D
Web::Securitybeyond HTML5 Sep 28 2012 Yosuke HASEGAWA
謝罪 「HTML5」関係ないです Perlのコードも出てきません
自己紹介 はせがわようすけ • ネットエージェント株式会社 • 株式会社セキュアスカイ・テクノロジー 技術顧問 • Microsoft MVP for Consumer Security Oct 2005 - • http://utf-8.jp/
これまでに調べた脆弱性 • 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 • 攻撃者
今日のはなし • ぼくはPerlほとんどわかりません! 色々とセキュリティにまつわる細かい話をするので、みなさんぜひPerlのコードに落とし込んで、よい実装を広めてください!
今日のはなし • 最近見かけた脆弱性のはなし • Ajaxデータを利用した攻撃 • XHR Level.2の注意点 • ブラウザの保護機構 • XSSフィルター/XSS Auditor • Content-Typeの強制 • クリックジャッキング対策 • Content-Security-Policy • HTTPSの強制
今日のはなし • 最近見かけた脆弱性のはなし • Ajaxデータを利用した攻撃 • XHR Level.2の注意点 • ブラウザの保護機構 • XSSフィルター/XSS Auditor • Content-Typeの強制 • クリックジャッキング対策 • Content-Security-Policy • HTTPSの強制
Ajaxデータを利用した攻撃 • Ajaxの利用増加 • Webアプリケーションの高機能化 • Ajaxデータを利用したXSS • Ajaxデータ(JSON,text,csv etc..)を直接ブラウザ上で開いたときにXSS • Ajaxデータの盗み見 • 機密情報を含むAjaxデータを受動的攻撃により攻撃者が盗み見る
Ajaxデータを利用した攻撃 • Ajaxの利用増加 • Webアプリケーションの高機能化 • Ajaxデータを利用したXSS • Ajaxデータ(JSON,text,csv etc..)を直接ブラウザ上で開いたときにXSS • Ajaxデータの盗み見 • 機密情報を含むAjaxデータを受動的攻撃により攻撃者が盗み見る
Ajaxデータを利用したXSS • Ajaxデータを直接開いてXSS • IEのContent-Type無視 • HTMLではないものがHTMLに昇格してXSS • 例えばtext/plain
Ajaxデータを利用したXSS • IEは最終的に「ファイルタイプ」に基づいてコンテンツを処理する • Content-Type 以外にも様々な要因からファイルタイプを決定 • 文書化されていない複雑なメカニズム • 「ファイルのダウンロードダイアログで表示されるファイル名の命名規則」http://support.microsoft.com/kb/436153/jaファイルタイプ決定のメカニズム解明に近づく唯一のドキュメント
Ajaxデータを利用したXSS • ファイルタイプの決定因子 • "Content-Type" HTTPレスポンスヘッダ • "X-Content-Type-Option" HTTPレスポンスヘッダ • Windowsレジストリにおける関連付け • IEの設定:"拡張子ではなく、内容によってファイルを開く" • URL自身 • コンテンツそのもの
IEにおけるファイルタイプ決定のメカニズム Content-Typeがレジストリに登録されている? [ HKEY_CLASSES_ROOT\MIME\Database\Content Type ] Y N ファイルタイプを仮決定 IE8+ && "X-Content-Type-Options:nosniff"? Y N Y 外部プラグイン/アプリが必要? ダウンロード プラグインを起動またはダウンロード N Y IE8+ && "X-Content-Type-Options:nosniff"? 仮決定したファイルタイプを使用 N 有効 「拡張子ではなく、内容によってファイルを開く」設定値 コンテンツをsniffしファイルタイプを決定 無効 仮決定したファイルタイプを使用 URLの拡張子が".cgi" または ".exe" または "/" ? e.g. http://utf-8.jp/a.cgi?abcd, http://utf-8.jp/foo/ Y N QUERY_STRINGからファイルタイプを 仮決定 URLの拡張子からファイルタイプを 仮決定 外部プラグイン/アプリが必要? 外部プラグイン/アプリが必要? N Y N Y プラグインを起動 またはダウンロード コンテンツをsniffし ファイルタイプを決定 コンテンツをsniffし ファイルタイプを決定 プラグインを起動 またはダウンロード ※これ以外にも例外的な挙動が多数あり Yosuke HASEGAWA http://utf-8.jp/
Ajaxデータを利用したXSS • ファイルタイプ決定のメカニズムは、とにかく複雑すぎる! • そもそも例外的な挙動が多い • いつのまにか挙動が変化していることも多い • Microsoft自身も挙動を把握しきれていないのでは
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,"settings":{"interactiontype":{"0":true,"1":true,"2":true,"3":true,"4":true,"5":true,"6":true,"7":true,"8":true,"9":true,"10":true,"11":true,"12":true,"13".... "text/javascript" はレジストリに未登録
Ajaxデータを利用したXSS • XSS実例
Ajaxデータを利用したXSS • AjaxコンテンツによるXSSは以下のような状況で発生しやすい • JSON - JSON文字列内{"text" :"<script>..." } • JSONP - callback名 http://example.com/?callback=<script>... • text, CSV - そもそもエスケープできない
Ajaxデータを利用したXSS • JSON - JSON文字列内 Content-Type: application/json; charset=utf-8 { "txt" : "<script>alert(1);</script>" } "application/javascript" はレジストリに未登録
Ajaxデータを利用したXSS • JSONP – callback名 http://example.com/?callback=<script>alert(1);</script> Content-Type: text/javascript; charset=utf-8 <script>alert(1)</script>( { "name" : "value" } ); "text/javascript" はレジストリに未登録
Ajaxデータを利用したXSS • text, csv – そもそもエスケープできない Content-Type: text/plain; charset=utf-8 これはテキストファイルです。<script>alert(1)</script> "text/plain" はsniff対象 Content-Type: text/csv; charset=utf-8 1,2,"abcd","<script>alert(1)</script>" "text/csv" はレジストリに未登録
Ajaxデータを利用したXSS • Ajaxデータ内に<script>を埋め込む • JSON, JSONP, CSV, text など • Ajaxデータを直接開いたときにHTML扱い • IEのContent-Type無視が原因 • 対策の話はあとで。
Ajaxデータを利用した攻撃 • Ajaxの利用増加 • Webアプリケーションの高機能化 • Ajaxデータを利用したXSS • Ajaxデータ(JSON,text,csv etc..)を直接ブラウザ上で開いたときにXSS • Ajaxデータの盗み見 • 機密情報を含むAjaxデータを受動的攻撃により攻撃者が盗み見る
Ajaxデータの盗み見 JSON • JavaScriptとして解釈可能なAjaxデータが狙われやすい • JavaScriptのsrcとして読み込む<script src="target.json"></script><script src="target.csv"></script> {"from" : "a@example.com"}
Ajaxデータの盗み見 • 様々な手法でブラウザごとにJSONデータを奪取 • JSON Array Hijacking for Android • JSON Hijacking for IE • JSON以外にもCSVなどは狙いやすい • <script src="target.csv">
Ajaxデータの盗み見 • 様々な手法でブラウザごとにJSONデータを奪取 • JSON Array Hijacking for Android • JSON Hijacking for IE • JSON以外にもCSVなどは狙いやすい • <script src="target.csv">
Array Hijacking for Android • Androidでは、古いJSON Hijackingの手法がまた通用する • PC用ブラウザでは2008年頃にはすでに根絶 • Android 2.2, 2.3で確認 • property setter の再定義 • 機密情報を含むJSON配列がターゲット
Array Hijacking for Android [ {"name" : "alice","mail" : "alice@example.com"}, {"name" : "bob","mail" : "bob@example.jp"}, ] 攻撃対象となる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> 攻撃者の作成した罠ページ
Ajaxデータの盗み見 • 様々な手法でブラウザごとにJSONデータを奪取 • JSON Array Hijacking for Android • JSON Hijacking for IE • JSON以外にもCSVなどは狙いやすい • <script src="target.csv">
JSON Hijacking for IE • IE6,IE7では特定条件下でJSONの奪取が可能 • 攻撃者がJSON内に文字列を挿入可能 • 機密情報を含むJSONがターゲット
JSON Hijacking for IE [ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" } ] 攻撃者によって挿入 ターゲットとなるJSON : http://example.com/newmail.json
JSON Hijacking for IE [ { "name" : "abc"}];var t=[{"":"", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" } ] ターゲットとなるJSON : http://example.com/newmail.json
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 t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" } ] [ { "name" : "abc"}];var t=[{"":"", "mail" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" } ]
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" : "hasegawa@utf-8.jp" }, { "name" : "John Smith", "mail" : "john@example.com" } ]
JSON Hijacking for IE • IE6,IE7はHTTPレスポンスヘッダより<script>要素のcharset属性を優先 • IE8では修正されている • 2008年10月に報告したが修正されない
Ajaxデータを利用した攻撃 • Ajaxデータを利用した攻撃 • Ajaxデータを利用したXSSAjaxデータ(JSON,text,csv etc..)を直接ブラウザ上で開いたときにXSS • Ajaxデータの盗み見機密情報を含むAjaxデータを受動的攻撃により攻撃者が盗み見る • 対策 • X-Content-Type-Options: nosniffヘッダ • XMLHttpRequest以外からのアクセスを弾く • エスケープ(XSS対策),POST限定(盗み見対策)なども次善策として…
Ajaxデータを利用した攻撃への対策 • X-Content-Type-Optoins:nosniff • XSS対策 • レスポンスヘッダで応答 • IE8以降でHTML扱いされることがなくなるIE6,7には効果なし Content-Type: application/json; charset=utf-8 X-Content-Type-Options: nosniff
Ajaxデータを利用した攻撃への対策 • XMLHttpRequest以外からのアクセスを弾く • Ajaxデータは通常、XHRからのリクエストを想定している • XHR以外からアクセスさせないことでXSSおよび盗み見を防ぐことができる
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 は自動挿入される
Ajaxデータを利用した攻撃への対策 • 汎用的なWAFなど • XHR経由のリクエストだけとは限らない • POST限定にはできない • 泥臭い対策が必要
Ajaxデータを利用した攻撃への対策 • 例: Amon2
Ajaxデータを利用した攻撃への対策 • JSONの過剰エスケープ"<>+" を "\u003c\u003e\u002b" に • 下記条件を満たす場合は403を返す • 「GET リクエストである」かつ • 「Cookie ヘッダを送信している」かつ • 「/android/iにマッチする User-Agent ヘッダを付与している」かつ • 「X-Requested-With ヘッダを付与していない」 http://blog.64p.org/entry/20111125/1322185155
今日のはなし • 最近見かけた脆弱性のはなし • Ajaxデータを利用した攻撃 • XHR Level.2の注意点 • ブラウザの保護機構 • XSSフィルター/XSS Auditor • Content-Typeの強制 • クリックジャッキング対策 • Content-Security-Policy