Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The Complete Investigation of Encoding and Secu...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
OWASP Japan
March 20, 2014
1.3k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
The Complete Investigation of Encoding and Security #appsecapac2014
OWASP Japan
March 20, 2014
More Decks by OWASP Japan
See All by OWASP Japan
OWASP Night 2019.03 Tokyo
owaspjapan
0
400
OWASP SAMMを活用したセキュア開発の推進
owaspjapan
0
1.1k
20190107_AbuseCaseCheatSheet
owaspjapan
0
220
セキュリティ要求定義で使える非機能要求グレードとASVS
owaspjapan
5
1.2k
AWSクラスタに捧ぐウェブを衛っていく方法論と死なない程度の修羅場の価値
owaspjapan
9
3.5k
Shifting Left Like a Boss
owaspjapan
2
340
OWASP Top 10 and Your Web Apps
owaspjapan
2
430
OWASP Japan Proposal: Encouraging Japanese Translation
owaspjapan
1
290
elegance_of_OWASP_Top10_2017
owaspjapan
2
580
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The agentic SEO stack - context over prompts
schlessera
0
810
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
How STYLIGHT went responsive
nonsquared
100
6.2k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
160
Everyday Curiosity
cassininazir
0
230
Transcript
エンコーディングと セキュリティ 徹底調査 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>な
どで中⾝身を読み出す ! ポイントは普段使われないエンコーディングも攻撃 者側で指定できること ! 変わりものがサポートされていると中⾝身を有効に読み出せ る形になるかもしれない
開発者がすべきこと Content-‐Type: text/html; charset=*** HTTP Response Headerでの指定を推奨
やったこと 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
すべてのテスト結果 hWp://l0.cm/encodings/
やったこと 1. 各ブラウザのエンコーディングのサ ポート状況を調査 2. サポートされているエンコーディン グをブラウザに表⽰示させ様々なテスト
3. テスト結果を踏まえ攻撃に利利⽤用でき ないか検討
更更なる攻撃への応⽤用 ! ブラウザのAn>-‐XSS機能のBypass ! エンコーディング切切替えのSelf-‐XSS
An;-‐XSS機能の Bypass ! (Chrome) エンコーディング指定がな いページで回避できた! ! (IE) <meta hWp-‐equiv>でエンコーディ
ング指定があっても回避できた!
Chromeのケース ~}
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のページになって フィルタを回避できてしまう!
エンコーディング 切切替えのSelf-‐XSS ! ブラウザはエンコーディングを切切 りかえるための設定を持っている
Oh 細⼯工されたページで使うと…
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×エンコーディング 今後も研究を続けていきます!