The Complete Investigation of Encoding and Security #appsecapac2014

D2c0774c30304e4970b502118aa791fe?s=47 OWASP Japan
March 20, 2014
780

The Complete Investigation of Encoding and Security #appsecapac2014

D2c0774c30304e4970b502118aa791fe?s=128

OWASP Japan

March 20, 2014
Tweet

Transcript

  1. エンコーディングと   セキュリティ   徹底調査   Masato  Kinugawa   -­‐

     XSS  Allstars  from  Japan  -­‐  
  2. ⾃自⼰己紹介   ! 脆弱性発⾒見見者(フリー)  

  3. 調べた経緯   ! エンコーディングに関わるセキュリティ 問題が頻繁に発⾒見見されている   ! ⽇日本でははせがわようすけ⽒氏による研究が有名   ! が、網羅羅的に調査したという報告はきい たことがない  

    ! ⼿手法は少しずつでてくるが…他は安全?     ➡がっつり全部⾃自分で⾒見見てみよう!    
  4. 収穫の⼀一部   ! 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  
  5.   エンコーディングを使った               攻撃おさらい   ! ページ構造が期待しない形になり XSSが起こる   ! <script  src=hWp://vic>m  charset=***></script>な

    どで中⾝身を読み出す   ! ポイントは普段使われないエンコーディングも攻撃 者側で指定できること   ! 変わりものがサポートされていると中⾝身を有効に読み出せ る形になるかもしれない  
  6. 開発者がすべきこと   Content-­‐Type:  text/html;  charset=***   HTTP  Response  Headerでの指定を推奨  

  7. やったこと   1.  各ブラウザのエンコーディングのサ ポート状況を調査   2.  サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト  

    3.  テスト結果を踏まえ攻撃に利利⽤用でき ないか検討  
  8. やったこと   1.  各ブラウザのエンコーディングのサ ポート状況を調査   2.  サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト  

    3.  テスト結果を踏まえ攻撃に利利⽤用でき ないか検討  
  9. サポート状況の調査   ! かき集めたエンコーディング名っぽい ⽂文字列列をブラウザが識識別するか⾒見見る   UTF-­‐8   UTF8   unicode-­‐1-­‐1-­‐ue-­‐8

      UTF-­‐9   …   (2500個以上のエンコーディ ングっぽい⽂文字列列)   調査⽅方法の詳細は:    hWp://masatokinugawa.l0.cm/2013/03/browser-­‐support-­‐encodings-­‐list.html   正式名   識識別不不可   エイリアス   (正式名を指す別名)   分 類  
  10. 結果   ! 多数の普段使わないエンコーディン グがサポートされていた   正式名とエイリアスの⼀一覧   hWp://l0.cm/encodings/list/   ブラウザごとのサポートの⼀一覧

      hWp://l0.cm/encodings/table/   注:   l0  =  L  Zero    
  11. ! 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個)  
  12. 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    
  13. 余談   ! ⼀一通りみてもやはりUTF-­‐7が凶悪   ! ⼀一般にエスケープの必要がない⽂文字列列だけであらゆる⽂文字 を表現できる   ! エンコーディング絡みのバグがあった際に真っ先に使える   ! サポートしているのは現在IEのみ

      ! IE11でもまだサポート…    (MicrosoYいわく12では削除を検討中とのこと)   ! IEはUTF-­‐7が圧倒的に危険なため他の考えられる⼿手法を脆弱 性と呼ぶ段階にない…   +ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQB yAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0 AD4-­‐  
  14. やったこと   1.  各ブラウザのエンコーディングのサ ポート状況を調査   2.  サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト  

    3.  テスト結果を踏まえ攻撃に利利⽤用でき ないか検討  
  15. テストを実施   ! 過去に問題になった挙動を参考にテス トを作成   ! {TEST1}  特定バイトが特別な⽂文字を作る    [0xBC]script[0xBE]  

           ➡    <script>   ! {TEST2}  特定バイトが後続の⽂文字を破壊する              <p  id="abc[0xE0]">    ➡    <p  id="abc[U+FFFD]>   ! {TEST3}  特定バイトが無視される                      <scri[0x80]pt>                      ➡      <script>  
  16. テストの⼤大まかな⽅方法   ! char_fuzzと呼んでいるテスト   PerlでベースのHTMLを作って各エ   ンコーディング・各ブラウザでラ   ンダムにバイト列列を表⽰示  

    表⽰示された状態をJavaScriptで確認    (  異異常が無ければ     リロードして繰返す  )  
  17. TEST-­‐1  特殊⽂文字の検出   「"&'<>\」(0x22  0x26  0x27  0x3C  0x3E   0x5C)を除いたバイト列列をランダムに

    表⽰示する    特殊⽂文字の有無を確認   あれば別のバイトから特殊⽂文字が   現れたと判断  
  18. 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  と  \  
  19. TEST-­‐2  後続の⽂文字を潰す   バイト値の検出   バイト列列をランダムに表⽰示する   その直後に<tag>を配置しておく   <tag>の有無を確認

      なければ直前のバイト列列に   破壊されたと判断   [バイト列列]<tag>  
  20. 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  
  21. TEST-­‐3  無視されるバイト 値の検出   <img>要素の途中にバイト列列をはさむ   <img>要素の有無を確認   存在すれば挟んだバイト列列を無視した と判断

      <im[0x90][0x80]g  src=x>   <im[0x90][0x81]g  src=x>   <im[0x90][0x82]g  src=x>   ……  
  22. 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  
  23. すべてのテスト結果   hWp://l0.cm/encodings/  

  24. やったこと   1.  各ブラウザのエンコーディングのサ ポート状況を調査   2.  サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト  

    3.  テスト結果を踏まえ攻撃に利利⽤用でき ないか検討  
  25. 更更なる攻撃への応⽤用   ! ブラウザのAn>-­‐XSS機能のBypass   ! エンコーディング切切替えのSelf-­‐XSS  

  26. An;-­‐XSS機能の Bypass   ! (Chrome)  エンコーディング指定がな いページで回避できた!   ! (IE)  <meta  hWp-­‐equiv>でエンコーディ

    ング指定があっても回避できた!  
  27. Chromeのケース   ~}  

  28. 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のページになって   フィルタを回避できてしまう!  
  29.   エンコーディング     切切替えのSelf-­‐XSS   ! ブラウザはエンコーディングを切切 りかえるための設定を持っている  

  30. Oh   細⼯工されたページで使うと…  

  31. XSSが起こる原理理   UTF-­‐8   <script>x="く\";alert(1)//"</script>   ShiY_JIS   <script>x="縺⼗十";alert(1)//"</script>  

        同じバイト列列で違う表現   ShiY_JISにきりかえ  
  32. 脆弱性ではないけれど   ! charset指定の有無にかかわらず起きる   ! アプリ側での対応は複雑になる   ! HTMLの構造をcharsetが変えられても危険にならない形にする などで⼀一応は対応できる   ! セキュリティ問題が起きることの⼀一般

    ユーザの想像の難しさ   ! ブラウザベンダには⼀一応問題提起として 報告   ! でも機能を無くしたら⽂文字化け時に困るし…   ! FirefoxアドオンのNoScriptは検出可  
  33. まとめ   ! 古くからある技術にも脆弱性はある   ! 単純なテストで⾒見見つかる   ! エンコーディングを利利⽤用した攻撃は 新しい技術に対しても起きうる   ! An>-­‐XSS機能×エンコーディング

      ! CSP×エンコーディング   今後も研究を続けていきます!