Upload
candy
View
53
Download
0
Embed Size (px)
DESCRIPTION
Web::Security beyond HTML5. Sep 28 2012 Yosuke HASEGAWA. 謝罪. 「 HTML5 」関係ないです Perl のコードも出てきません. 自己紹介. はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ・テクノロジー 技術顧問 Microsoft MVP for Consumer Security Oct 2005 - http://utf-8.jp/. これまでに調べた脆弱性. Web ブラウザ、 Web アプリケーションを中心にいろいろ … - PowerPoint PPT Presentation
Citation preview
Web::Securitybeyond HTML5
Sep 28 2012Yosuke HASEGAWA
謝罪「 HTML5 」関係ないです
Perl のコードも出てきません
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
自己紹介
はせがわようすけネットエージェント株式会社株式会社セキュアスカイ・テクノロジー 技術顧問
Microsoft MVP for Consumer Security Oct 2005 -
http://utf-8.jp/
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
これまでに調べた脆弱性
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
...
難読化 JavaScriptObfuscated JavaScript
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();
記号 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
質問Question
質問 : Web 技術、好きですか ?Q. Do you love web technologies?
質問 : Web 技術、好きですか ?Q. Do you love web technologies?
クロスサイトスクリプティング
SQL インジェクション
CSRF
HTTP レスポンス分割
オープンリダイレクタ
HTTP ヘッダインジェクション
セッションハイジャックパストラバーサル
リモートファイルインクルード
DoS
OS コマンドインジェクション
メモリリーク
バッファオーバーフロー
強制ブラウズ
セッション固定攻撃
LDAP インジェクション
XPath インジェクション
書式文字列攻撃
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Web 技術、好きですか ?
「はい」に挙手した人かなり打たれ強い
or攻撃者
今日のはなしToday's topic
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
ぼくは Perl ほとんどわかりません!
色々とセキュリティにまつわる細かい話をするので、みなさんぜひ Perl のコードに落とし込んで、よい実装を広めてください!
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃
Ajax の利用増加Web アプリケーションの高機能化
Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直
接ブラウザ上で開いたときに XSSAjax データの盗み見
機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃
Ajax の利用増加Web アプリケーションの高機能化
Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直
接ブラウザ上で開いたときに XSSAjax データの盗み見
機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
Ajax データを直接開いて XSSIE の Content-Type 無視HTML ではないものが HTML に昇格して
XSS例えば text/plain
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
IE は最終的に「ファイルタイプ」に基づいてコンテンツを処理する
Content-Type 以外にも様々な要因からファイルタイプを決定文書化されていない複雑なメカニズム
「ファイルのダウンロードダイアログで表示されるファイル名の命名規則」 http://support.microsoft.com/kb/436153/jaファイルタイプ決定のメカニズム解明に近づく唯一のドキュメント
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
ファイルタイプの決定因子"Content-Type" HTTP レスポンスヘッダ"X-Content-Type-Option" HTTP レスポ
ンスヘッダWindows レジストリにおける関連付けIE の設定 :" 拡張子ではなく、内容によって
ファイルを開く "URL 自身コンテンツそのもの
IE におけるファイルタイプ決定のメカニズム
Y N
Y
N
N
Y
有効無効
Y N
N YY N
Y N
Content-Type がレジストリに登録されている ? [ HKEY_CLASSES_ROOT\MIME\Database\Content Type ]
ファイルタイプを仮決定
外部プラグイン / アプリが必要 ?
IE8+ && "X-Content-Type-Options:nosniff"?
コンテンツを sniff しファイルタイプを決定
URL の拡張子が ".cgi" または ".exe" または "/" ? e.g. http://utf-8.jp/a.cgi?abcd, http://utf-8.jp/foo/
外部プラグイン / アプリが必要 ?プラグインを起動またはダウンロード
「拡張子ではなく、内容によってファイルを開く」設定値 仮決定したファイルタイプを使用
IE8+ && "X-Content-Type-Options:nosniff"? 仮決定したファイルタイプを使用
QUERY_STRING からファイルタイプを仮決定
プラグインを起動またはダウンロードコンテンツを sniff しファイルタイプを決定
コンテンツを sniff しファイルタイプを決定
外部プラグイン / アプリが必要 ?
URL の拡張子からファイルタイプを仮決定
ダウンロード
プラグインを起動またはダウンロードYosuke HASEGAWA http://utf-8.jp/※ これ以外にも例外的な挙動が多数あり
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
ファイルタイプ決定のメカニズムは、とにかく複雑すぎる!そもそも例外的な挙動が多いいつのまにか挙動が変化していることも多いMicrosoft 自身も挙動を把握しきれていな
いのでは
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSSXSS 実例
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-8Date: Wed, 22 Jun 2011 13:53:37 GMTContent-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" はレジストリに未登録
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSSXSS 実例
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
Ajax コンテンツによる XSS は以下のような状況で発生しやすいJSON - JSON 文字列内
{"text" :"<script>..." }JSONP - callback 名
http://example.com/?callback=<script>...text, CSV - そもそもエスケープできない
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
JSON - JSON 文字列内Content-Type: application/json; charset=utf-8
{ "txt" : "<script>alert(1);</script>" }
"application/javascript" はレジストリに未登録
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
JSONP – callback 名http://example.com/?callback=<script>alert(1);</script>
"text/javascript" はレジストリに未登録
Content-Type: text/javascript; charset=utf-8
<script>alert(1)</script>( { "name" : "value" } );
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
text, csv – そもそもエスケープできない
"text/plain" は sniff 対象
Content-Type: text/plain; charset=utf-8
これはテキストファイルです。 <script>alert(1)</script>
"text/csv" はレジストリに未登録
Content-Type: text/csv; charset=utf-8
1,2,"abcd","<script>alert(1)</script>"
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した XSS
Ajax データ内に <script> を埋め込むJSON, JSONP, CSV, text など
Ajax データを直接開いたときに HTML扱いIE の Content-Type 無視が原因
対策の話はあとで。
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃
Ajax の利用増加Web アプリケーションの高機能化
Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直
接ブラウザ上で開いたときに XSSAjax データの盗み見
機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データの盗み見
JavaScript として解釈可能な Ajaxデータが狙われやすいJavaScript の src として読み込む
<script src="target.json"></script><script src="target.csv"></script>
{"from" : "[email protected]"}
JSON
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データの盗み見
様々な手法でブラウザごとに JSON データを奪取JSON Array Hijacking for Android JSON Hijacking for IE
JSON 以外にも CSV などは狙いやすい<script src="target.csv">
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データの盗み見
様々な手法でブラウザごとに JSON データを奪取JSON Array Hijacking for Android JSON Hijacking for IE
JSON 以外にも CSV などは狙いやすい<script src="target.csv">
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Array Hijacking for Android
Android では、古い JSON Hijackingの手法がまた通用するPC 用ブラウザでは 2008年頃にはすでに根絶
Android 2.2, 2.3 で確認property setter の再定義機密情報を含む JSON配列がターゲット
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Array Hijacking for Android[ { "name" : "alice", "mail" : "[email protected]" }, { "name" : "bob", "mail" : "[email protected]" },]
<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>
攻撃対象となる JSON : http://example.jp/target.json
攻撃者の作成した罠ページ
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データの盗み見
様々な手法でブラウザごとに JSON データを奪取JSON Array Hijacking for Android JSON Hijacking for IE
JSON 以外にも CSV などは狙いやすい<script src="target.csv">
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
JSON Hijacking for IE
IE6,IE7 では特定条件下で JSON の奪取が可能攻撃者が JSON 内に文字列を挿入可能機密情報を含む JSON がターゲット
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
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
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
JSON Hijacking for IE
[ { "name" : "abc"}];var t=[{"":"", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" }]
ターゲットとなる JSON : http://example.com/newmail.json
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
JSON Hijacking for IE
<script src="http://example.com/newmail.json" charset="utf-7"><script> alert( t[ 1 ].name + t[ 1 ].mail ); </script>
攻撃者は罠ページを準備して誘導
[ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" }]
ターゲットとなる JSON http://example.com/newmail.json[ { "name" : "abc"}];var t=[{"":"", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" }]
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
JSON Hijacking for IE
<script src="http://example.com/newmail.json" charset="utf-7">攻撃者の準備した罠ページ
Content-Type: application/json; charset=utf-8
[ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : "[email protected]" }, { "name" : "John Smith", "mail" : "[email protected]" }]
攻撃者対象の JSON こっちが優先される
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
JSON Hijacking for IE
IE6,IE7 は HTTP レスポンスヘッダより<script> 要素の charset属性を優先IE8 では修正されている
2008年 10月に報告したが修正されない
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃Ajax データを利用した攻撃
Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直接ブラウザ上で開いたときに XSS
Ajax データの盗み見機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る
対策X-Content-Type-Options: nosniff ヘッダXMLHttpRequest 以外からのアクセスを弾くエスケープ (XSS 対策 ),POST限定 ( 盗み見対
策 ) なども次善策として…
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃への対策
X-Content-Type-Optoins:nosniffXSS 対策レスポンスヘッダで応答
IE8 以降で HTML扱いされることがなくなるIE6,7 には効果なし
Content-Type: application/json; charset=utf-8X-Content-Type-Options: nosniff
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃への対策
XMLHttpRequest 以外からのアクセスを弾くAjax データは通常、 XHR からのリクエス
トを想定しているXHR 以外からアクセスさせないことで XSS
および盗み見を防ぐことができる
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃への対策
XMLHttpRequest 以外からのアクセスを弾くリクエストヘッダに特定文字列を入れる
GET http://example.jp/foo.json HTTP/1.1Host: example.jpConnection: keep-aliveX-Request-With: XMLHttpRequestUser-Agent: Mozilla/5.0 (Windows NT 6.0; rv:8.0)
jQuery 、 prototype.js だと X-Request-With は自動挿入される
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃への対策
汎用的な WAF などXHR経由のリクエストだけとは限らないPOST限定にはできない泥臭い対策が必要
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃への対策例 : Amon2
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Ajax データを利用した攻撃への対策
JSON の過剰エスケープ"<>+" を "\u003c\u003e\u002b" に
下記条件を満たす場合は 403 を返す「 GET リクエストである」かつ「 Cookie ヘッダを送信している」かつ「 /android/i にマッチする User-Agent
ヘッダを付与している」かつ「 X-Requested-With ヘッダを付与して
いない」http://blog.64p.org/entry/20111125/1322185155
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-Policy
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
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 );
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
XMLHttpRequest現在はクロスドメインでのリクエストが可能
GET / HTTP/1.1Host: another.example.jpOrigin: http://base.example.jp/
HTTP/1.1 200 OKAccess-Control-Allow-Origin: *
HTML
base.example.jp
another.example.jp
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
現在の XMLHttpRequest は任意のサーバと通信可能特定相手とのみ通信する場合はクライアント側、サーバ側双方で注意が必要
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
クライアント側:DOM based XSS自サイトとの通信を想定サーバは HTML断片を返すinnerHTML に XHR.responseText を代入
XHR の送信先が任意に指定可能な脆弱性
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
典型的なコード// bad code: http://example.jp/#/foo/bar.txtvar 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/#//evil.example.jp/ などの指定で任意コンテンツを挿入可能
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
XHR を利用する側は、任意ドメインからのデータを読まないようにチェック// http://example.jp/#/foo/bar.txtvar url = location.hash.substring(1);if( url.match( ??????? ) ){ var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); ...}url.match( /^\// ) // NG : #//evil.example.jp/url.match( /^\/[^\/]/ ) // NG : #/\evil.example.jp/url.match( /^\/\w/ ) // OK : #/foo/
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
URL の確認は実はめんどうくさい。詳細は「めんどうくさい Web セキュリ
ティ」参照
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
むしろ XHR の宛先は固定で保持するべきvar pages = [ "/", "/foo", "/bar", "/baz" ];var index = location.hash.substring(1) | 0;
var xhr = new XMLHttpRequest();xhr.open( "GET", pages[ index ], true );
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
サーバ側 :特定の相手にのみ応答を許可
サーバ側はリクエストの Origin ヘッダを見て相手を判別してはいけない
Origin ヘッダは偽装されている可能性がある。
GET / HTTP/1.1Host: another.example.jpOrigin: http://base.example.jp/
HTTP/1.1 200 OKAccess-Control-Allow-Origin: htp://base.example.jp
リクエスト
レスポンス
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2サーバ側 :特定の相手にのみ応答を許可。
JS で明示的に指定した場合のみ Cookie が送信される
GET / HTTP/1.1Host: another.example.jpOrigin: http://base.example.jp/Cookie: sessionid=A251BBCA
HTTP/1.1 200 OKAccess-Control-Allow-Origin: htp://base.example.jpAccess-Control-Allow-Credentials: true
リクエスト
レスポンス
xhr.withCredentials = true; // JavaScript 内
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2サーバ側 :特定の相手にのみ応答を許可。
リクエストヘッダに「秘密の情報」を含める
サーバ側はリクエストヘッダ内の情報を確認して正規の通信相手か判断
クロスドメインでの setRequestHeader は癖があるので注意事前に OPTIONS 要求が発行 (preflight)https://developer.mozilla.org/en/http_access_control
xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
クロスドメインでの preflight リクエストOPTIONS / HTTP/1.1Host: another.example.jpOrigin: http://base.example.jp/Access-Control-Request-Method: GETAccess-Control-Request-Headers: X-Secret-Key
HTTP/1.1 200 OKAccess-Control-Allow-Origin: htp://base.example.jpAccess-Control-Allow-Methods: GETAccess-Control-Allow-Headers: X-Secret-Key
リクエスト
レスポンス
xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XHR Lv.2
クロスドメインでの preflight リクエストPlack::Middleware::CrossOrigin
builder { enable 'CrossOrigin', origins => '*', methods => ['GET'], headers => X-Secret-Key';}
xhr.setRequestHeader( "X-Secret-Key", "A251BBCA" );
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XSS フィルター / XSS Auditor
反射型の XSS をほぼ軽減IE8+ 、 Chrome 、 Safari (WebKit) に搭載
リクエストとレスポンス両方に同一のスクリプトが含まれる場合にブロック
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
XSS フィルター / XSS Auditor
レスポンスヘッダに
の指定でフィルタを停止可能誤検知の実害が出ていない場合は指定なし
(XSS フィルタ有効 ) をおすすめWebKit の XSS Auditor は XSS を検
出してもユーザへの通知なし
X-XSS-Protection: 0
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
X-Content-Type-Options
Content-Type に従ってコンテンツを開く指定コンテンツ内の "sniff" を行わなくなるIE8+ で有効レスポンスヘッダに以下をつける
原則、全てのコンテンツにつけておくべき。
X-Content-Type-Options: nosniff
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
X-Content-Type-Options
Content-Type に従ってコンテンツを開く指定コンテンツ内の "sniff" を行わなくなるIE8+ で有効レスポンスヘッダに以下をつける
原則、全てのコンテンツにつけておくべき。
X-Content-Type-Options: nosniff
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
クリック !!
クリックジャッキング対策
クリックジャッキング標的サイトを透明に重ね、意図しないクリッ
ク等を引き起こす攻撃
透明表示の標的サイト
罠サイト
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
クリックジャッキング対策
frame および iframe での表示を禁止するIE8+ 、 Chrome 、 Safari 、 Opera 、 F
irefox の各ブラウザが対応レスポンスヘッダで指定// 全ての埋め込みを禁止
X-Frame-Options: DENY
// 同一オリジン以外からの埋め込みを禁止X-Frame-Options: SAMEORIGIN
http://www.jpcert.or.jp/ed/2009/ed090001.pdf
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Content Security Policy
Content-Security-Policy(CSP)XSS根絶の切り札指定された以外のリソースが読めない<script><img><iframe>...
インラインスクリプトが禁止される<script>alert(1)</script> … NG
eval やイベント属性が禁止される<body onload=alert(1)> … NG
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Content Security Policy
Content-Security-Policy(CSP)規格、実装が不安定レスポンスヘッダで許可するリソースを指定
<meta> でも指定可。上書きは不可。
http://www.w3.org/TR/2012/WD-CSP-20120710/http://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html
Content-Security-Policy: directive; // W3CX-Content-Security-Policy: directive; // FirefoxX-WebKit-CSP: directive; // Chrome
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Content Security Policy
Content-Security-Policy(CSP)許可するリソースを記述
'self' は同一ドメイン、同一ポートのみ許可
Content-Security-Policy: default-src 'self'
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
Content Security Policy
Content-Security-Policy(CSP)リソースの種別ごとに指定可能
// 画像以外を同一ドメインに制約Content-Security-Policy: default-src 'self'; image-src *
// example.jp の script src を許可Content-Security-Policy: default-src 'self'; script-src example.jp
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
HTTPS の強制
HSTS- HTTP Strict Transport SecurityHTTP と HTTPS 、両方を提供しているサ
イトで、 HTTPS の使用を強制する機能中間者攻撃の低減に
Google Chrome 、 Firefox が対応
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
HTTPS の強制
HTTPS のレスポンスヘッダで以下を返す
これ以降の HTTPへのアクセスは HTTPS に置き換わる
max-age は有効期間を秒数で指定includeSubDomains が指定されるとサブ
ドメインも対象
Strict-Transport-Security: max-age=15768000
Strict-Transport-Security: max-age=15768000 ; includeSubDomanis
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
HTTPS の強制
HTTPS サイトのみが Strict-Transport-Security を返す
HTTP はすでに汚染されているかもしれないので
Strict-Transport-Security: max-age=15768000
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
今日のはなし
最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点
ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制
まとめ
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
まとめ
Ajax 関連の脆弱性はブラウザ起因が多いAndroid 2.x 、 IE6-8古いブラウザは直らない!サーバ側で対策
新しいブラウザには多数の保護機能使えるものはどんどん取り込もう
よい実装を広めてほしい !!
質問タイム
NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012
質問
[email protected]@netagent.co.jp
@hasegawayosuke
http://utf-8.jp/