Share
Embed
Transcript
33 slides
-
エンコーディングと セキュリティ 徹底調査 Masato Kinugawa -‐
XSS Allstars from Japan -‐ -
調べた経緯 ! エンコーディングに関わるセキュリティ 問題が頻繁に発⾒見見されている ! ⽇日本でははせがわようすけ⽒氏による研究が有名 ! が、網羅羅的に調査したという報告はきい たことがない
! ⼿手法は少しずつでてくるが…他は安全? ➡がっつり全部⾃自分で⾒見見てみよう! -
収穫の⼀一部 ! Chrome/Safari ! (CVE-‐2011-‐3058) Bad interac>on possibly leading to
XSS in EUC-‐JP ! Firefox ! (CVE-‐2012-‐0477) Poten>al XSS through ISO-‐2022-‐KR/ISO-‐2022-‐CN decoding issues ! (CVE-‐2012-‐4207) Improper character decoding in HZ-‐GB-‐2312 charset ! (CVE-‐2013-‐5612) Character encoding cross-‐origin XSS aWack ! IE ! (CVE-‐2012-‐1872) EUC-‐JP Character Encoding Vulnerability ! (CVE-‐2013-‐0015)(CVE-‐2013-‐3166) ShiY JIS Character Encoding Vulnerability ! Opera(Presto) ! (CVEなし) Some invalid EUC-‐TW sequences causes read outside of allocated memory -
エンコーディングを使った 攻撃おさらい ! ページ構造が期待しない形になり XSSが起こる ! <script src=hWp://vic>m charset=***></script>な
どで中⾝身を読み出す ! ポイントは普段使われないエンコーディングも攻撃 者側で指定できること ! 変わりものがサポートされていると中⾝身を有効に読み出せ る形になるかもしれない -
やったこと 1. 各ブラウザのエンコーディングのサ ポート状況を調査 2. サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト
3. テスト結果を踏まえ攻撃に利利⽤用でき ないか検討 -
やったこと 1. 各ブラウザのエンコーディングのサ ポート状況を調査 2. サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト
3. テスト結果を踏まえ攻撃に利利⽤用でき ないか検討 -
サポート状況の調査 ! かき集めたエンコーディング名っぽい ⽂文字列列をブラウザが識識別するか⾒見見る UTF-‐8 UTF8 unicode-‐1-‐1-‐ue-‐8
UTF-‐9 … (2500個以上のエンコーディ ングっぽい⽂文字列列) 調査⽅方法の詳細は: hWp://masatokinugawa.l0.cm/2013/03/browser-‐support-‐encodings-‐list.html 正式名 識識別不不可 エイリアス (正式名を指す別名) 分 類 -
結果 ! 多数の普段使わないエンコーディン グがサポートされていた 正式名とエイリアスの⼀一覧 hWp://l0.cm/encodings/list/ ブラウザごとのサポートの⼀一覧
hWp://l0.cm/encodings/table/ 注: l0 = L Zero -
! Big5 ! Big5-‐HKSCS ! BOCU-‐1 ! CESU-‐8 ! EUC-‐JP
! EUC-‐KR ! GB18030 ! GBK ! HZ-‐GB-‐2312 ! IBM864 ! ISO-‐2022-‐CN ! iso-‐2022-‐CN-‐EXT ! ISO-‐2022-‐JP ! ISO-‐2022-‐KR ! ISO-‐8859-‐1 ! ISO-‐8859-‐10 ! ISO-‐8859-‐13 ! ISO-‐8859-‐14 ! ISO-‐8859-‐15 ! ISO-‐8859-‐16 ! ISO-‐8859-‐2 ! ISO-‐8859-‐3 ! ISO-‐8859-‐4 ! ISO-‐8859-‐5 ! ISO-‐8859-‐6 ! ISO-‐8859-‐7 ! ISO-‐8859-‐8 ! ISO-‐8859-‐8-‐I ! KOI8-‐R ! KOI8-‐U ! macintosh ! SCSU ! ShiY_JIS ! US-‐ASCII ! UTF-‐16BE ! UTF-‐16LE ! UTF-‐32 ! UTF-‐32BE ! UTF-‐32LE ! UTF-‐8 ! Windows-‐1250 ! Windows-‐1251 ! Windows-‐1252 ! Windows-‐1253 ! Windows-‐1254 ! Windows-‐1255 ! Windows-‐1256 ! Windows-‐1257 ! Windows-‐1258 ! Windows-‐874 ! x-‐mac-‐cyrillic ! x-‐user-‐defined Chromeの例例(計52個) -
IEの例例(計139個!) ! _autodetect_kr ! asmo-‐708 ! Big5 ! cp1025
! cp866 ! cp875 ! csiso2022jp ! DOS-‐720 ! DOS-‐862 ! EUC-‐CN ! EUC-‐JP ! EUC-‐KR ! GB18030 ! GB2312 ! HZ-‐GB-‐2312 ! IBM00858 ! IBM00924 ! IBM01047 ! IBM01140 ! IBM01141 ! IBM01142 ! IBM01143 ! IBM01144 ! IBM01145 ! IBM01146 ! IBM01147 ! IBM01148 ! IBM01149 ! IBM037 ! IBM1026 ! IBM273 ! IBM277 ! IBM278 ! IBM280 ! IBM284 ! IBM285 ! IBM290 ! IBM297 ! IBM420 ! IBM423 ! IBM424 ! IBM437 ! IBM500 ! IBM737 ! IBM775 ! IBM850 ! IBM852 ! IBM855 ! IBM857 ! IBM860 ! IBM861 ! IBM863 ! IBM864 ! IBM865 ! IBM869 ! IBM870 ! IBM871 ! IBM880 ! IBM905 ! IBM-‐thai ! ISO-‐2022-‐JP ! ISO-‐2022-‐KR ! ISO-‐8859-‐1 ! ISO-‐8859-‐13 ! ISO-‐8859-‐15 ! ISO-‐8859-‐2 ! ISO-‐8859-‐3 ! ISO-‐8859-‐4 ! ISO-‐8859-‐5 ! ISO-‐8859-‐6 ! ISO-‐8859-‐7 ! ISO-‐8859-‐8 ! ISO-‐8859-‐8-‐I ! ISO-‐8859-‐9 ! Johab ! KOI8-‐R ! KOI8-‐U ! ks_c_5601-‐1987 ! macintosh ! ShiY_JIS ! Unicode ! UnicodeFEFF ! US-‐ASCII ! UTF-‐7 ! UTF-‐8 ! Windows-‐1250 ! Windows-‐1251 ! Windows-‐1252 ! Windows-‐1253 ! Windows-‐1254 ! Windows-‐1255 ! Windows-‐1256 ! Windows-‐1257 ! Windows-‐1258 ! Windows-‐874 ! x-‐chinese-‐cns ! x-‐chinese-‐eten ! x-‐cp20001 ! x-‐cp20003 ! x-‐cp20004 ! x-‐cp20005 ! x-‐cp20261 ! x-‐cp20269 ! x-‐cp20936 ! x-‐cp20949 ! x-‐cp21027 ! x-‐cp50227 ! x-‐cp50229 ! x-‐ebcdic-‐koreanextended ! x-‐ia5 ! x-‐ia5-‐german ! x-‐ia5-‐norwegian ! x-‐ia5-‐swedish ! x-‐iscii-‐as ! x-‐iscii-‐be ! x-‐iscii-‐de ! x-‐iscii-‐gu ! x-‐iscii-‐ka ! x-‐iscii-‐ma ! x-‐iscii-‐or ! x-‐iscii-‐pa ! x-‐iscii-‐ta ! x-‐iscii-‐te ! x-‐mac-‐arabic ! x-‐mac-‐ce ! x-‐mac-‐chinesesimp ! x-‐mac-‐chinesetrad ! x-‐mac-‐croa>an ! x-‐mac-‐cyrillic ! x-‐mac-‐greek ! x-‐mac-‐hebrew ! x-‐mac-‐icelandic ! x-‐mac-‐japanese ! x-‐mac-‐korean ! x-‐mac-‐romanian ! x-‐mac-‐thai ! x-‐mac-‐turkish ! x-‐mac-‐ukrainian ! x-‐user-‐defined -
余談 ! ⼀一通りみてもやはりUTF-‐7が凶悪 ! ⼀一般にエスケープの必要がない⽂文字列列だけであらゆる⽂文字 を表現できる ! エンコーディング絡みのバグがあった際に真っ先に使える ! サポートしているのは現在IEのみ
! IE11でもまだサポート… (MicrosoYいわく12では削除を検討中とのこと) ! IEはUTF-‐7が圧倒的に危険なため他の考えられる⼿手法を脆弱 性と呼ぶ段階にない… +ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQB yAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0 AD4-‐ -
やったこと 1. 各ブラウザのエンコーディングのサ ポート状況を調査 2. サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト
3. テスト結果を踏まえ攻撃に利利⽤用でき ないか検討 -
テストを実施 ! 過去に問題になった挙動を参考にテス トを作成 ! {TEST1} 特定バイトが特別な⽂文字を作る [0xBC]script[0xBE]
➡ <script> ! {TEST2} 特定バイトが後続の⽂文字を破壊する <p id="abc[0xE0]"> ➡ <p id="abc[U+FFFD]> ! {TEST3} 特定バイトが無視される <scri[0x80]pt> ➡ <script> -
テストの⼤大まかな⽅方法 ! char_fuzzと呼んでいるテスト PerlでベースのHTMLを作って各エ ンコーディング・各ブラウザでラ ンダムにバイト列列を表⽰示
表⽰示された状態をJavaScriptで確認 ( 異異常が無ければ リロードして繰返す ) -
TEST-‐1 特殊⽂文字の検出 「"&'<>\」(0x22 0x26 0x27 0x3C 0x3E 0x5C)を除いたバイト列列をランダムに
表⽰示する 特殊⽂文字の有無を確認 あれば別のバイトから特殊⽂文字が 現れたと判断 -
TEST-‐1 結果の⼀一部 ブラウザ charset バイト 出現⽂文字
Chrome/Safari (CVE-‐2011-‐3058) EUC-‐JP 0x8EE3 \ Safari (OS X) x-‐mac-‐korean 0xA179 < と U+F877 0xA178 > と U+F877 x-‐mac-‐chinesetrad 0x80 \ と U+F87F x-‐mac-‐japanese 0x80 \ と U+F87F IE (CVE-‐2012-‐1872) EUC-‐JP 0x8FEBBD U+4E57 と \ -
TEST-‐2 後続の⽂文字を潰す バイト値の検出 バイト列列をランダムに表⽰示する その直後に<tag>を配置しておく <tag>の有無を確認
なければ直前のバイト列列に 破壊されたと判断 [バイト列列]<tag> -
TEST-‐2 結果の⼀一部 ブラウザ charset 潰すバイト 潰すバイト数
Firefox (CVE-‐2012-‐0471) EUC-‐JP 0x8F 2 HZ-‐GB-‐2312 0x7E or [0x80-‐0xFF] 1 GB2312 [0x81-‐0xFE][0x30-‐0x39] 2 GBK GB18030 T.61-‐8bit [0xC0-‐0xCF] 1 -
TEST-‐3 無視されるバイト 値の検出 <img>要素の途中にバイト列列をはさむ <img>要素の有無を確認 存在すれば挟んだバイト列列を無視した と判断
<im[0x90][0x80]g src=x> <im[0x90][0x81]g src=x> <im[0x90][0x82]g src=x> …… -
TEST-‐3 結果の⼀一部 ブラウザ charset 無視されるバイト Chrome/Safari
HZ-‐GB-‐2312 ~} or ~[0x0A] Firefox ISO-‐2022-‐JP 0x1B284A IE X-‐ISCII-‐AS [0xEF][0x40-‐0x4B] X-‐ISCII-‐DE X-‐ISCII-‐BE X-‐ISCII-‐KA X-‐ISCII-‐GU X-‐ISCII-‐PA X-‐ISCII-‐MA X-‐ISCII-‐TA X-‐ISCII-‐OR X-‐ISCII-‐TE -
やったこと 1. 各ブラウザのエンコーディングのサ ポート状況を調査 2. サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト
3. テスト結果を踏まえ攻撃に利利⽤用でき ないか検討 -
IEのケース <meta hWp-‐equiv>でcharset指定有、XSS有のページ hWp://example.com?q=<meta charset=ue-‐7> <img src=x o+AG4-‐
error=alert(1)>&<meta hWp-‐equiv=> <me#a hWp-‐equiv="Content-‐Type" content="text/ html;charset=ue-‐8"> … <meta charset=ue-‐7><img src=x o+AG4-‐error=alert(1)> UTF-‐7のページになって フィルタを回避できてしまう! -
XSSが起こる原理理 UTF-‐8 <script>x="く\";alert(1)//"</script> ShiY_JIS <script>x="縺⼗十";alert(1)//"</script>
同じバイト列列で違う表現 ShiY_JISにきりかえ -
脆弱性ではないけれど ! charset指定の有無にかかわらず起きる ! アプリ側での対応は複雑になる ! HTMLの構造をcharsetが変えられても危険にならない形にする などで⼀一応は対応できる ! セキュリティ問題が起きることの⼀一般
ユーザの想像の難しさ ! ブラウザベンダには⼀一応問題提起として 報告 ! でも機能を無くしたら⽂文字化け時に困るし… ! FirefoxアドオンのNoScriptは検出可 -
まとめ ! 古くからある技術にも脆弱性はある ! 単純なテストで⾒見見つかる ! エンコーディングを利利⽤用した攻撃は 新しい技術に対しても起きうる ! An>-‐XSS機能×エンコーディング
! CSP×エンコーディング 今後も研究を続けていきます!