Download presentation
Presentation is loading. Please wait.
1
ネットエージェント株式会社 研究開発部 はせがわよすうけ hasegawa@utf-8.jp
Webアプリケーションセキュリティ ネットエージェント株式会社 研究開発部 はせがわよすうけ
2
悪用厳禁 自身が管理する以外のコンピュータに対して攻撃等の行為を行った場合 不正アクセス行為の禁止等に関する法律 電子計算機損壊等業務妨害罪
電磁的記録不正作出罪 その他の関連法規等に従い罰せられる可能性があります。
3
自己紹介 はせがわようすけ ネットエージェント株式会社研究開発部
Microsoft MVP for Client Operating System Unicode などの文字コードが引き起こすセキュ リティ上の問題点について調査・研究 Internet Explorer、Mozilla Firefox をはじ めソフトウェア製品および Webアプリケー ションに関する脆弱性を多数発見
4
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
5
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
6
Introduction はじめに
7
文字コードと セキュリティ 何が関係あるの?
8
レガシーな文字コードからUnicode への移行
文字コードとセキュリティ 何が関係あるの? レガシーな文字コードからUnicode への移行 EUC-JPやShift_JISと、Unicodeの混在 Webブラウザはテキストパーサ HTMLやXMLなどのテキストデータを処理 視覚的な効果 視覚的に似た文字など、攻撃者の強力な道具
9
文字列の比較検出 文字列の比較検出 セキュリティのための基本処理 「安全な文字列の確認」「危険な文字列の検出」 入力 検査 次の処理へ
text text text text 「安全な文字列の確認」「危険な文字列の検出」
10
SQL injection 攻撃者 エスケープ対象の文字の検出を すり抜けたときにSQLインジェクションが発生 http://
GET /?name='OR'1='1 メタ文字のエスケープ 入力値の検証 Webサーバ SELECT * FROM USERS WHERE name=''OR'1'='1' データベース ※バインド機構を使おう!
11
Cross Site Scripting エスケープ対象の文字の検出を すり抜けたときにXSSが発生 誘導 http://
攻撃者 ?item="><script>... GET /?item="><script>... Webサーバ メタ文字のエスケープ <input type="text" value=""><script>... 被害者
12
SQL injection メタ文字のエスケープ 入力値の検証 攻撃者 Webサーバ http:// バインド機構を使おう! データベース
13
文字列の比較・検出はセキュリティ のための要
文字コードとセキュリティ 何が関係あるの? 文字列の比較・検出はセキュリティ のための要 攻撃者は比較・検出を迂回する方法 を編み出している
14
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
15
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
16
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (F0~F7)(80~BF)(80~BF)(80~BF)
UTF-8の冗長なエンコーディング UTF-8とは Unicode文字範囲 UTF-8でのバイト列 U+0000~U+007F 0xxxxxxx (00~7F) U+0080~U+07FF 110xxxxx 10xxxxxx (C2~DF) (80~BF) U+0800~U+FFFF 1110xxxx 10xxxxxx 10xxxxxx (E0~EF) (80~BF) (80~BF) U+10000~U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (F0~F7)(80~BF)(80~BF)(80~BF)
17
UTF-8の冗長なエンコーディング UTF-8の非最小形式 / 正しい表現 不正な表現 0x2F 0xC0 0xAF
U+002F 0xE0 0x80 0xAF 0xF0 0x80 0x80 0xAF UTF-8の非最小形式 伝統的な攻撃手法のひとつ
18
UTF-8の冗長なエンコーディング IISに対するMS00-057が有名 もはや化石のような攻撃手法
19
ほんとに化石?
20
UTF-8の冗長なエンコーディング CVE Apache Tomcat UTF-8 Directory Traversal Vulnerability Published: Aug いまでも存在する「生きた化石」
21
UTF-8の冗長なエンコーディング 対策はどうしたらいいの?
22
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
23
多対一の変換 ₩ Unicodeから他の文字コードへの変換 は多対一で行われる \ U+005C U+00A5 U+20A9 0x5C
24
多対一の変換 フィルタの すり抜け パストラバーサルなど Unicodeでの 文字列の入力 ¥..¥..¥ U+00A5 入力値の検査
他のエンコーディングに変換 〵..〵..〵 0x5C パストラバーサルなど 次の処理
25
多対一の変換 "..\" and "..\..\Windows" が C:\tempフォルダに存在
ファイル名をANSIで扱うとパストラ バーサル
26
多対一の変換 DEMO
27
多対一の変換 多数の文字が「多対一」で変換される ¡ ! ¦ | À Á Â Ã Ä Å Æ A U+00A1 0xA5 U+00A6
0x7C À Á Â Ã Ä Å Æ A U+00C0 U+00C1 U+00C2 U+00C3 U+00C4 U+00C5 U+00C6 0x41
28
多対一の変換 対策はどうしたらいいの? 文字列をUnicodeの扱い、他のエンコー ディングに変換しない
(変換するとしても)検査後には変換しな い
29
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
30
大文字と小文字 大文字、小文字同一視の定義は、言語 や文化によって異なる 大文字・小文字を同一視した文字列の 比較は実は難しい
独自の基準で比較 Unicodeに従って比較
31
大文字と小文字 大文字と小文字の比較 単語 一致 不一致 Gif / GIF U.S. アメリカ Turkey トルコ Maße/MASSE
Germany ドイツ Maße / Masse Switzerland スイス 「Windowsプログラミングの極意」,株式会社アスキー,ISBN ,P.340より
32
大文字と小文字 Unicodeでは大文字と小文字の対応を 規定 A a
0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; 0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; 0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; : 0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 0041 0061 0061 0041
33
大文字と小文字 Unicodeのバージョンによって大文字 小文字の基準が異なることがある Ⴇ თ ? Unicode 2.1.9
U+10A7 U+10D7 U+2D07 Unicode 2.1.9 10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;10D7; 10D7;GEORGIAN LETTER TAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; Unicode 5.0.0 10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07; 2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7
34
大文字と小文字 対策はどうしたらいいの? 大文字、小文字の差でセキュリティ上の 分界点をつくらない
大文字、小文字の比較・変換機能は十分 動作を確認・把握する
35
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
36
Unicodeの正規化 Unicodeは文字の分解・合成をサ ポート が か ゛ 見た目は同じでもバイト列が異なる表現 合成済み文字
U+304C U+304B U+3099 合成済み文字 基底文字 結合文字 Unicodeは文字の分解・合成をサ ポート 見た目は同じでもバイト列が異なる表現
37
Unicodeの正規化 Unicodeでは4種類の正規化方法を規定 正規化した結果からは元のバイト列の復元はでき ない
NFC Normalization Form Canonical Composition 正規合成 NFD Normalization Form Canonical Decomposition 正規分解 NFKC Normalization Form Compatibility Composition 互換合成 NFKD Normalization Form Compatibility Decomposition 互換分解 正規化した結果からは元のバイト列の復元はでき ない
38
Unicodeの正規化 正規化処理により意味の異なるバイ ト列に変化する ‥ . . ① 1 NFKC,NFKD U+2025 U+002E
39
Unicodeの正規化 フィルタの すり抜け パストラバーサルなど Unicodeでの 文字列の入力 〵‥〵‥〵 U+2025 入力値の検査
正規化処理 〵..〵..〵 U+002E パストラバーサルなど 次の処理
40
Unicodeの正規化 対策はどうしたらいいの? 文字列の検査後に正規化処理を行わない
41
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
42
不正なバイト列の埋め込み 処理系によっては不正なバイト列が無 視されたり、想定外の文字に変換され ることがある
43
不正なバイト列の埋め込み Firefox 2.0.0.12以前のバージョン はShift_JISのときに0x80を無視す る
<s[0x80]c[0x80]r[0x80]ipt> alert(1) </s[0x80]c[0x80]r[0x80]ipt>
44
不正なバイト列の埋め込み IEは0x00を無視する <s[0x00]c[0x00]r[0x00]ipt> alert(1)
45
不正なバイト列の埋め込み IEは0x0Bと0x0Cを区切り文字とみ なす
<script[0x0B]> alert(1) </script> <input type=text value=a[0x0C]onmouseover=alert(1)>
46
不正なバイト列の埋め込み 他にもいろいろある!? 対策はどうしたらいいの? ホワイトリストを用いて安全な文字列の み生成する。
47
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
48
先行バイトの埋め込み マルチバイト文字の先行バイトを注 入することでフィルタを回避
49
先行バイトの埋め込み name: <input type=text value="[0x82]"> <input type=text value=" onmouseover=...//"> Shift_JISの先行バイトである0x82 でダブルクォートを無効にする (IE / Firefox / Opera)
50
先行バイトの埋め込み IE8 beta2 の XSS Filter も回避 UTF-8
Shift_JIS EUC-JP IE8 beta2 の XSS Filter も回避
51
先行バイトの埋め込み 対策はどうしたらいいの? 文字単位で検証 他の文字コードにいったん変換…
52
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
53
エンコード情報の不一致 End-to-End(サーバとクライアント 間)でcharsetの解釈が異なる UTF-8 UTF-7
< → < > → > " → " & → & ' → ' <html> < > HTML生成 処理 エスケープ ユーザ
54
エンコード情報の不一致 典型的にはUTF-7によるXSSが該当
charsetが不明瞭なとき、IE6/7は UTF-7だと解釈してXSSが発生
55
エンコード情報の不一致 HTTPヘッダおよび<meta>にて charsetが指定されていない HTTP/1.1 200 OK
Content-Type: text/html ... <html><head> <meta http-equiv="content-type" content="text/html"> </head><body> +ADw-script+AD4- alert(1) +ADw-/script+AD4-...
56
エンコード情報の不一致 IEが解釈できないcharset名
典型的には CP932 / MS932 / sjis / jis / utf8 ... <meta http-equiv='content-type' content='text/html;charset=CP932'> +ADw-script+AD4- alert(document.cookie); +ADw-/script+AD4-
57
エンコード情報の不一致 本来の<meta>より前に偽の <meta>を注入
<title>+ADw-/title+AD4- +ADw-meta http-equiv+AD0-'content-type' content+AD0-'text/html+ADs-charset+AD0-utf-7'+AD4- </title> <meta http-equiv='content-type' content='text/html;charset=euc-jp'>
58
エンコード情報の不一致 XSS対策はどうしたらいいの? charsetをHTTPレスポンスヘッダで明 記する
<meta>より前に攻撃者がコントロー ルできる文字列を置かない
59
エンコード情報の不一致 UTF-7に関連する問題はIEだけでな く他のブラウザにも影響
60
エンコード情報の不一致 UTF-7を使ったJSON Hijacking JSON内のデータを操作可能
HTTPレスポンスヘッダにcharsetがない 攻撃者がJSONの一部をコントロール可能 JSON内のデータを操作可能
61
エンコード情報の不一致 JSONはリモートから読み込み可能? XHRで読み込むのでクロスドメインでの読み込みは不可 HTML ユーザ XHR
eval( JSON ) JSON { "name" : "value" } Webサーバ
62
エンコード情報の不一致 JSONはリモートから読み込み可能? JSからJSON内にはアクセスできないはず… HTML 攻撃者 ユーザ
<script src=JSON> 無名オブジェクトが生成される or 構文エラー JSON { "name" : "value" } Webサーバ
63
エンコード情報の不一致 UTF-7を使ったJSON Hijacking JSON内のデータを操作可能
HTTPレスポンスヘッダにcharsetがない 攻撃者がJSONの一部をコントロール可能 JSON内のデータを操作可能
64
エンコード情報の不一致 JSON Hijacking with UTF-7 これが意味するのは…
[ { "name" : "abc+MPv/fwAiAH0AXQA7-var t+AD0AWwB7ACIAIg-:+ACI-", "mail" : }, "name" : "Matcha Daifuku", "mail" : } ] 攻撃者により挿入 HTTPヘッダにcharsetの指定がない場合 これが意味するのは…
65
エンコード情報の不一致 JSON Hijacking with UTF-7
[ { "name" : "abc"}];var t=[{"":"", "mail" : }, "name" : "Matcha Daifuku", "mail" : } ] HTTPヘッダにcharsetの指定がない場合
66
エンコード情報の不一致 JSON Hijacking with UTF-7 攻撃者の用意した罠ページ
<script src=" charset="utf-7"></script> <script> alert( t[ 1 ].name + t[ 1 ].mail ); </script> [ { "name" : "abc"}];var t=[{"":"", "mail" : }, "name" : "Matcha Daifuku", "mail" : } ] 外からJSONがUTF-7であると指定。 __defineSetter__が使えない場面でも有効。
67
エンコード情報の不一致 DEMO
68
エンコード情報の不一致 JSONハイジャックの対策はどうした らいいの? while( 1 ); などをJSONの前に配置
POSTのみ受け入れる
69
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
70
7ビット文字コードの解釈 IEはUS-ASCIIの最上位ビットを無視す る " 0010 「 1010 0010 < 0011
2 「 1010 0010 A 2 0x22 0xA2 < 0011 1100 3 C シ 1011 1100 B C 0x3C 0xBC > 0011 1110 3 E セ 1011 1110 B E 0x3E 0xBE
71
7ビット文字コードの解釈
72
7ビット文字コードの解釈 OEもUS-ASCIIの上位バイトを無視 する uuencode形式でeicar.comを添付
MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit This is test mail begin 644 eicar.com ヘカ#5/(5`E0$%06S1<4%I8-30H4%XI-T-#*3=]) $5)0T% Y$05)$+4%. ` end uuencode形式でeicar.comを添付
73
7ビット文字コードの解釈 対策はどうしたらいいの? HTTPレスポンスヘッダでcharsetを明記 する
US-ASCIIを避け、ISO や UTF-8などを使う
74
Agenda はじめに 比較の一致/不一致 まとめ UTF-8の冗長なエンコーディング 多対一の変換 大文字と小文字 Unicodeの正規化
不正なバイト列の埋め込み 先行バイトの埋め込み エンコード情報の不一致 7ビット文字コードの解釈 まとめ P/1.x 200 OK e: Thu, 11 Jul :37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
75
Conclusion まとめ
76
まとめ 検査後にバイト列の意味を変えるよう な変換・正規化を行わない End-to-Endで解釈が統一されるよう にする
文字コード×セキュリティって未開拓
77
Questions? Yosuke HASEGAWA hasegawa@netagent.co.jp hasegawa@utf-8.jp
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.