Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

収穫の⼀一部   ! 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  

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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    

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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  

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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  

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Chromeのケース   ~}  

Slide 28

Slide 28 text

IEのケース   でcharset指定有、XSS有のページ   hWp://example.com?q=  &     …     UTF-­‐7のページになって   フィルタを回避できてしまう!  

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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