$30 off During Our Annual Pro Sale. View Details »

The Complete Investigation of Encoding and Security #appsecapac2014

OWASP Japan
March 20, 2014
1.1k

The Complete Investigation of Encoding and Security #appsecapac2014

OWASP Japan

March 20, 2014
Tweet

Transcript

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

    View Slide

  2. ⾃自⼰己紹介  
    ! 脆弱性発⾒見見者(フリー)  

    View Slide

  3. 調べた経緯  
    ! エンコーディングに関わるセキュリティ
    問題が頻繁に発⾒見見されている  
    ! ⽇日本でははせがわようすけ⽒氏による研究が有名  
    ! が、網羅羅的に調査したという報告はきい
    たことがない  
    ! ⼿手法は少しずつでてくるが…他は安全?  
      ➡がっつり全部⾃自分で⾒見見てみよう!    

    View Slide

  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  

    View Slide

  5.   エンコーディングを使った  
                攻撃おさらい  
    ! ページ構造が期待しない形になり
    XSSが起こる  
    ! m  charset=***>な
    どで中⾝身を読み出す  
    ! ポイントは普段使われないエンコーディングも攻撃
    者側で指定できること  
    ! 変わりものがサポートされていると中⾝身を有効に読み出せ
    る形になるかもしれない  

    View Slide

  6. 開発者がすべきこと  
    Content-­‐Type:  text/html;  charset=***  
    HTTP  Response  Headerでの指定を推奨  

    View Slide

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

    View Slide

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

    View Slide

  9. サポート状況の調査  
    ! かき集めたエンコーディング名っぽい
    ⽂文字列列をブラウザが識識別するか⾒見見る  
    UTF-­‐8  
    UTF8  
    unicode-­‐1-­‐1-­‐ue-­‐8  
    UTF-­‐9  
    …  
    (2500個以上のエンコーディ
    ングっぽい⽂文字列列)  
    調査⽅方法の詳細は:  
     hWp://masatokinugawa.l0.cm/2013/03/browser-­‐support-­‐encodings-­‐list.html  
    正式名  
    識識別不不可  
    エイリアス  
    (正式名を指す別名)  

    類  

    View Slide

  10. 結果  
    ! 多数の普段使わないエンコーディン
    グがサポートされていた  
    正式名とエイリアスの⼀一覧  
    hWp://l0.cm/encodings/list/  
    ブラウザごとのサポートの⼀一覧  
    hWp://l0.cm/encodings/table/  
    注:  
    l0  =  L  Zero    

    View Slide

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

    View Slide

  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    

    View Slide

  13. 余談  
    ! ⼀一通りみてもやはりUTF-­‐7が凶悪  
    ! ⼀一般にエスケープの必要がない⽂文字列列だけであらゆる⽂文字
    を表現できる  
    ! エンコーディング絡みのバグがあった際に真っ先に使える  
    ! サポートしているのは現在IEのみ  
    ! IE11でもまだサポート…  
     (MicrosoYいわく12では削除を検討中とのこと)  
    ! IEはUTF-­‐7が圧倒的に危険なため他の考えられる⼿手法を脆弱
    性と呼ぶ段階にない…  
    +ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQB
    yAHQAKAAxACkAPAAvAHMAYwByAGkAcAB0
    AD4-­‐  

    View Slide

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

    View Slide

  15. テストを実施  
    ! 過去に問題になった挙動を参考にテス
    トを作成  
    ! {TEST1}  特定バイトが特別な⽂文字を作る  
     [0xBC]script[0xBE]          ➡      <br/>! {TEST2}  特定バイトが後続の⽂文字を破壊する  <br/>            <p  id="abc[0xE0]">    ➡    <p  id="abc[U+FFFD]>  <br/>! {TEST3}  特定バイトが無視される  <br/>                    <scri[0x80]pt>                      ➡      <script>  <br/>

    View Slide

  16. テストの⼤大まかな⽅方法  
    ! char_fuzzと呼んでいるテスト  
    PerlでベースのHTMLを作って各エ  
    ンコーディング・各ブラウザでラ  
    ンダムにバイト列列を表⽰示  
    表⽰示された状態をJavaScriptで確認  
     (  異異常が無ければ  
      リロードして繰返す  )  

    View Slide

  17. TEST-­‐1  特殊⽂文字の検出  
    「"&'<>\」(0x22  0x26  0x27  0x3C  0x3E  
    0x5C)を除いたバイト列列をランダムに
    表⽰示する  
     特殊⽂文字の有無を確認  
    あれば別のバイトから特殊⽂文字が  
    現れたと判断  

    View Slide

  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  と  \  

    View Slide

  19. TEST-­‐2  後続の⽂文字を潰す  
    バイト値の検出  
    バイト列列をランダムに表⽰示する  
    その直後にを配置しておく  
    の有無を確認  
    なければ直前のバイト列列に  
    破壊されたと判断  
    [バイト列列]  

    View Slide

  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  

    View Slide

  21. TEST-­‐3  無視されるバイト
    値の検出  
    要素の途中にバイト列列をはさむ  
    要素の有無を確認  
    存在すれば挟んだバイト列列を無視した
    と判断  
     
     
     
    ……  

    View Slide

  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  

    View Slide

  23. すべてのテスト結果  
    hWp://l0.cm/encodings/  

    View Slide

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

    View Slide

  25. 更更なる攻撃への応⽤用  
    ! ブラウザのAn>-­‐XSS機能のBypass  
    ! エンコーディング切切替えのSelf-­‐XSS  

    View Slide

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

    View Slide

  27. Chromeのケース  
    ~}  

    View Slide

  28. IEのケース  
    でcharset指定有、XSS有のページ  
    hWp://example.com?q=  error=alert(1)>&  
    html;charset=ue-­‐8">  
    …  
     
    UTF-­‐7のページになって  
    フィルタを回避できてしまう!  

    View Slide

  29.   エンコーディング  
      切切替えのSelf-­‐XSS  
    ! ブラウザはエンコーディングを切切
    りかえるための設定を持っている  

    View Slide

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

    View Slide

  31. XSSが起こる原理理  
    UTF-­‐8  
    x="く\";alert(1)//"  
    ShiY_JIS  
    x="縺⼗十";alert(1)//"  
        同じバイト列列で違う表現  
    ShiY_JISにきりかえ  

    View Slide

  32. 脆弱性ではないけれど  
    ! charset指定の有無にかかわらず起きる  
    ! アプリ側での対応は複雑になる  
    ! HTMLの構造をcharsetが変えられても危険にならない形にする
    などで⼀一応は対応できる  
    ! セキュリティ問題が起きることの⼀一般
    ユーザの想像の難しさ  
    ! ブラウザベンダには⼀一応問題提起として
    報告  
    ! でも機能を無くしたら⽂文字化け時に困るし…  
    ! FirefoxアドオンのNoScriptは検出可  

    View Slide

  33. まとめ  
    ! 古くからある技術にも脆弱性はある  
    ! 単純なテストで⾒見見つかる  
    ! エンコーディングを利利⽤用した攻撃は
    新しい技術に対しても起きうる  
    ! An>-­‐XSS機能×エンコーディング  
    ! CSP×エンコーディング  
    今後も研究を続けていきます!  

    View Slide