88
Web::Security beyond HTML5 Sep 28 2012 Yosuke HASEGAWA

Web::Security beyond HTML5

  • 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

Page 1: Web::Security beyond HTML5

Web::Securitybeyond HTML5

Sep 28 2012Yosuke HASEGAWA

Page 2: Web::Security beyond HTML5

謝罪「 HTML5 」関係ないです

Perl のコードも出てきません

Page 3: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

自己紹介

はせがわようすけネットエージェント株式会社株式会社セキュアスカイ・テクノロジー 技術顧問

Microsoft MVP for Consumer Security Oct 2005 -

http://utf-8.jp/

Page 4: Web::Security beyond HTML5

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

...

Page 5: Web::Security beyond HTML5

難読化 JavaScriptObfuscated JavaScript

Page 6: Web::Security beyond HTML5

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();

記号 JavaScript JS without alnum

jjencode - http://utf-8.jp/public/jjencode.html

Page 7: Web::Security beyond HTML5

゚ ω ゚ノ = / `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

Page 8: Web::Security beyond HTML5

質問Question

Page 9: Web::Security beyond HTML5

質問 : Web 技術、好きですか ?Q. Do you love web technologies?

Page 10: Web::Security beyond HTML5

質問 : Web 技術、好きですか ?Q. Do you love web technologies?

クロスサイトスクリプティング

SQL インジェクション

CSRF

HTTP レスポンス分割

オープンリダイレクタ

HTTP ヘッダインジェクション

セッションハイジャックパストラバーサル

リモートファイルインクルード

DoS

OS コマンドインジェクション

メモリリーク

バッファオーバーフロー

強制ブラウズ

セッション固定攻撃

LDAP インジェクション

XPath インジェクション

書式文字列攻撃

Page 11: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Web 技術、好きですか ?

「はい」に挙手した人かなり打たれ強い

or攻撃者

Page 12: Web::Security beyond HTML5

今日のはなしToday's topic

Page 13: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

ぼくは Perl ほとんどわかりません!

 色々とセキュリティにまつわる細かい話をするので、みなさんぜひ Perl のコードに落とし込んで、よい実装を広めてください!

Page 14: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

Page 15: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

Page 16: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃

Ajax の利用増加Web アプリケーションの高機能化

Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直

接ブラウザ上で開いたときに XSSAjax データの盗み見

機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る

Page 17: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃

Ajax の利用増加Web アプリケーションの高機能化

Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直

接ブラウザ上で開いたときに XSSAjax データの盗み見

機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る

Page 18: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

Ajax データを直接開いて XSSIE の Content-Type 無視HTML ではないものが HTML に昇格して

XSS例えば text/plain

Page 19: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

IE は最終的に「ファイルタイプ」に基づいてコンテンツを処理する

Content-Type 以外にも様々な要因からファイルタイプを決定文書化されていない複雑なメカニズム

「ファイルのダウンロードダイアログで表示されるファイル名の命名規則」 http://support.microsoft.com/kb/436153/jaファイルタイプ決定のメカニズム解明に近づく唯一のドキュメント

Page 20: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

ファイルタイプの決定因子"Content-Type" HTTP レスポンスヘッダ"X-Content-Type-Option" HTTP レスポ

ンスヘッダWindows レジストリにおける関連付けIE の設定 :" 拡張子ではなく、内容によって

ファイルを開く "URL 自身コンテンツそのもの

Page 21: Web::Security beyond HTML5

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/※ これ以外にも例外的な挙動が多数あり

Page 22: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

ファイルタイプ決定のメカニズムは、とにかく複雑すぎる!そもそも例外的な挙動が多いいつのまにか挙動が変化していることも多いMicrosoft 自身も挙動を把握しきれていな

いのでは

Page 23: Web::Security beyond HTML5

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" はレジストリに未登録

Page 24: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSSXSS 実例

Page 25: Web::Security beyond HTML5

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 - そもそもエスケープできない

Page 26: Web::Security beyond HTML5

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" はレジストリに未登録

Page 27: Web::Security beyond HTML5

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" } );

Page 28: Web::Security beyond HTML5

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>"

Page 29: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した XSS

Ajax データ内に <script> を埋め込むJSON, JSONP, CSV, text など

Ajax データを直接開いたときに HTML扱いIE の Content-Type 無視が原因

対策の話はあとで。

Page 30: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃

Ajax の利用増加Web アプリケーションの高機能化

Ajax データを利用した XSSAjax データ (JSON,text, csv etc..) を直

接ブラウザ上で開いたときに XSSAjax データの盗み見

機密情報を含む Ajax データを受動的攻撃により攻撃者が盗み見る

Page 31: Web::Security beyond HTML5

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

Page 32: Web::Security beyond HTML5

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">

Page 33: Web::Security beyond HTML5

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">

Page 34: Web::Security beyond HTML5

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配列がターゲット

Page 35: Web::Security beyond HTML5

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

攻撃者の作成した罠ページ

Page 36: Web::Security beyond HTML5

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">

Page 37: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

JSON Hijacking for IE

IE6,IE7 では特定条件下で JSON の奪取が可能攻撃者が JSON 内に文字列を挿入可能機密情報を含む JSON がターゲット

Page 38: Web::Security beyond HTML5

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

Page 39: Web::Security beyond HTML5

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

Page 40: Web::Security beyond HTML5

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]" }]

Page 41: Web::Security beyond HTML5

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 こっちが優先される

Page 42: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

JSON Hijacking for IE

IE6,IE7 は HTTP レスポンスヘッダより<script> 要素の charset属性を優先IE8 では修正されている

2008年 10月に報告したが修正されない

Page 43: Web::Security beyond HTML5

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限定 ( 盗み見対

策 ) なども次善策として…

Page 44: Web::Security beyond HTML5

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

Page 45: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策

XMLHttpRequest 以外からのアクセスを弾くAjax データは通常、 XHR からのリクエス

トを想定しているXHR 以外からアクセスさせないことで XSS

および盗み見を防ぐことができる

Page 46: Web::Security beyond HTML5

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 は自動挿入される

Page 47: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策

汎用的な WAF などXHR経由のリクエストだけとは限らないPOST限定にはできない泥臭い対策が必要

Page 48: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Ajax データを利用した攻撃への対策例 : Amon2

Page 49: Web::Security beyond HTML5

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

Page 50: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-Policy

Page 51: Web::Security beyond HTML5

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 );

Page 52: Web::Security beyond HTML5

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

Page 53: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

現在の XMLHttpRequest は任意のサーバと通信可能特定相手とのみ通信する場合はクライアント側、サーバ側双方で注意が必要

Page 54: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

クライアント側:DOM based XSS自サイトとの通信を想定サーバは HTML断片を返すinnerHTML に XHR.responseText を代入

XHR の送信先が任意に指定可能な脆弱性

Page 55: Web::Security beyond HTML5

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/  などの指定で任意コンテンツを挿入可能

Page 56: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

Page 57: Web::Security beyond HTML5

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/

Page 58: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XHR Lv.2

URL の確認は実はめんどうくさい。詳細は「めんどうくさい Web セキュリ

ティ」参照

Page 59: Web::Security beyond HTML5

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 );

Page 60: Web::Security beyond HTML5

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

リクエスト

レスポンス

Page 61: Web::Security beyond HTML5

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 内

Page 62: Web::Security beyond HTML5

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" );

Page 63: Web::Security beyond HTML5

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" );

Page 64: Web::Security beyond HTML5

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" );

Page 65: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

Page 66: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XSS フィルター / XSS Auditor

反射型の XSS をほぼ軽減IE8+ 、 Chrome 、 Safari (WebKit) に搭載

リクエストとレスポンス両方に同一のスクリプトが含まれる場合にブロック

Page 67: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

XSS フィルター / XSS Auditor

レスポンスヘッダに

の指定でフィルタを停止可能誤検知の実害が出ていない場合は指定なし

(XSS フィルタ有効 ) をおすすめWebKit の XSS Auditor は XSS を検

出してもユーザへの通知なし

X-XSS-Protection: 0

Page 68: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

Page 69: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

X-Content-Type-Options

Content-Type に従ってコンテンツを開く指定コンテンツ内の "sniff" を行わなくなるIE8+ で有効レスポンスヘッダに以下をつける

原則、全てのコンテンツにつけておくべき。

X-Content-Type-Options: nosniff

Page 70: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

X-Content-Type-Options

Content-Type に従ってコンテンツを開く指定コンテンツ内の "sniff" を行わなくなるIE8+ で有効レスポンスヘッダに以下をつける

原則、全てのコンテンツにつけておくべき。

X-Content-Type-Options: nosniff

Page 71: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

Page 72: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

クリック !!

クリックジャッキング対策

クリックジャッキング標的サイトを透明に重ね、意図しないクリッ

ク等を引き起こす攻撃

透明表示の標的サイト

罠サイト

Page 73: Web::Security beyond HTML5

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

Page 74: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

Page 75: Web::Security beyond HTML5

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

Page 76: Web::Security beyond HTML5

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

Page 77: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

Content Security Policy

Content-Security-Policy(CSP)許可するリソースを記述

'self' は同一ドメイン、同一ポートのみ許可

Content-Security-Policy: default-src 'self'

Page 78: Web::Security beyond HTML5

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

Page 79: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

Page 80: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

HTTPS の強制

HSTS- HTTP Strict Transport SecurityHTTP と HTTPS 、両方を提供しているサ

イトで、 HTTPS の使用を強制する機能中間者攻撃の低減に

Google Chrome 、 Firefox が対応

Page 81: Web::Security beyond HTML5

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

Page 82: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

HTTPS の強制

HTTPS サイトのみが Strict-Transport-Security を返す

HTTP はすでに汚染されているかもしれないので

Strict-Transport-Security: max-age=15768000

Page 83: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

今日のはなし

最近見かけた脆弱性のはなしAjax データを利用した攻撃XHR Level.2 の注意点

ブラウザの保護機構XSS フィルター /XSS AuditorContent-Type の強制クリックジャッキング対策Content-Security-PolicyHTTPS の強制

Page 84: Web::Security beyond HTML5

まとめ

Page 85: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

まとめ

Ajax 関連の脆弱性はブラウザ起因が多いAndroid 2.x 、 IE6-8古いブラウザは直らない!サーバ側で対策

新しいブラウザには多数の保護機能使えるものはどんどん取り込もう

よい実装を広めてほしい !!

Page 86: Web::Security beyond HTML5

質問タイム

Page 87: Web::Security beyond HTML5

NetAgent http://www.netagent.co.jp/YAPC::Asia Tokyo 2012

質問

[email protected]@netagent.co.jp

@hasegawayosuke

http://utf-8.jp/

Page 88: Web::Security beyond HTML5