760 likes | 819 Views
Web アプリケーションセキュリティ. ネットエージェント株式会社 研究開発部 はせがわよすうけ hasegawa@utf-8.jp. 悪用厳禁. 自身が管理する以外のコンピュータに対して攻撃等の行為を行った場合 不正アクセス行為の禁止等に関する法律 電子計算機損壊等業務妨害罪 電磁的記録不正作出罪 その他の関連法規等に従い罰せられる可能性があります。. 自己紹介. はせがわようすけ ネットエージェント株式会社研究開発部 Microsoft MVP for Client Operating System
E N D
Webアプリケーションセキュリティ ネットエージェント株式会社 研究開発部 はせがわよすうけ hasegawa@utf-8.jp
悪用厳禁 • 自身が管理する以外のコンピュータに対して攻撃等の行為を行った場合 • 不正アクセス行為の禁止等に関する法律 • 電子計算機損壊等業務妨害罪 • 電磁的記録不正作出罪 • その他の関連法規等に従い罰せられる可能性があります。
自己紹介 はせがわようすけ • ネットエージェント株式会社研究開発部 • Microsoft MVP for Client Operating System • Unicode などの文字コードが引き起こすセキュリティ上の問題点について調査・研究 • Internet Explorer、Mozilla Firefox をはじめソフトウェア製品および Webアプリケーションに関する脆弱性を多数発見
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
Introduction はじめに
文字コードと セキュリティ 何が関係あるの?
文字コードとセキュリティ 何が関係あるの? • レガシーな文字コードからUnicodeへの移行 • EUC-JPやShift_JISと、Unicodeの混在 • Webブラウザはテキストパーサ • HTMLやXMLなどのテキストデータを処理 • 視覚的な効果 • 視覚的に似た文字など、攻撃者の強力な道具
文字列の比較検出 text text text text • 文字列の比較検出 • セキュリティのための基本処理 入力 検査 次の処理へ 1101100110010 0010001110110 1000010100110 0101011011110 • 「安全な文字列の確認」「危険な文字列の検出」
SQL injection 攻撃者 エスケープ対象の文字の検出を すり抜けたときにSQLインジェクションが発生 http:// GET /?name='OR'1='1 メタ文字のエスケープ 入力値の検証 Webサーバ SELECT * FROM USERS WHERE name=''OR'1'='1' データベース ※バインド機構を使おう!
Cross Site Scripting エスケープ対象の文字の検出を すり抜けたときにXSSが発生 誘導 http:// 攻撃者 http://example.com/ ?item="><script>... GET /?item="><script>... Webサーバ メタ文字のエスケープ <input type="text" value=""><script>... 被害者
文字コードとセキュリティ 何が関係あるの? • 文字列の比較・検出はセキュリティのための要 • 攻撃者は比較・検出を迂回する方法を編み出している
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
UTF-8の冗長なエンコーディング • UTF-8とは Unicode文字範囲 UTF-8でのバイト列 U+0000~U+007F 0xxxxxxx (00~7F) U+0080~U+07FF 110xxxxx10xxxxxx (C2~DF) (80~BF) U+0800~U+FFFF 1110xxxx10xxxxxx10xxxxxx (E0~EF)(80~BF)(80~BF) U+10000~U+10FFFF 11110xxx10xxxxxx10xxxxxx 10xxxxxx (F0~F7)(80~BF)(80~BF)(80~BF)
UTF-8の冗長なエンコーディング 正しい表現 不正な表現 • UTF-8の非最小形式 • 伝統的な攻撃手法のひとつ 0x2F 0xC0 0xAF U+002F 0xE0 0x80 0xAF 0xF0 0x80 0x80 0xAF /
UTF-8の冗長なエンコーディング • IISに対するMS00-057が有名 • もはや化石のような攻撃手法
UTF-8の冗長なエンコーディング • CVE-2008-2938Apache Tomcat UTF-8 Directory Traversal Vulnerability • Published: Aug 12 2008 • いまでも存在する「生きた化石」
UTF-8の冗長なエンコーディング • 対策はどうしたらいいの? • 自前でUTF-8のデコードをしない信頼できるライブラリ/フレームワークに任せる • 処理前にUTF-16などに変換するのもひとつの手
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
多対一の変換 • Unicodeから他の文字コードへの変換は多対一で行われる \ 0x5C U+005C U+00A5 U+20A9 ¥ ₩
多対一の変換 Unicodeでの 文字列の入力 ¥..¥..¥ U+00A5 フィルタの すり抜け 入力値の検査 他のエンコーディングに変換 〵..〵..〵 0x5C パストラバーサルなど 次の処理
多対一の変換 • "..\" and "..\..\Windows" がC:\tempフォルダに存在 • ファイル名をANSIで扱うとパストラバーサル
多対一の変換 DEMO
多対一の変換 • 多数の文字が「多対一」で変換される ¡ ! U+00A1 0xA5 ¦ | U+00A6 0x7C À Á Â Ã Ä Å Æ A U+00C0 U+00C1 U+00C2 U+00C3 U+00C4 U+00C6 0x41 U+00C5
多対一の変換 • 対策はどうしたらいいの? • 文字列をUnicodeの扱い、他のエンコーディングに変換しない • (変換するとしても)検査後には変換しない
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
大文字と小文字 • 大文字、小文字同一視の定義は、言語や文化によって異なる • 大文字・小文字を同一視した文字列の比較は実は難しい • 独自の基準で比較 • Unicodeに従って比較
大文字と小文字 大文字と小文字の比較 「Windowsプログラミングの極意」,株式会社アスキー,ISBN978-4-7561-5000-4,P.340より
大文字と小文字 • Unicodeでは大文字と小文字の対応を規定 A a U+0041 U+0061 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 0061 0041 0061 0041 http://unicode.org/Public/UNIDATA/UnicodeData.txt
大文字と小文字 • Unicodeのバージョンによって大文字小文字の基準が異なることがある Ⴇ თ ? 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
大文字と小文字 • 対策はどうしたらいいの? • 大文字、小文字の差でセキュリティ上の分界点をつくらない • 大文字、小文字の比較・変換機能は十分動作を確認・把握する
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
Unicodeの正規化 • Unicodeは文字の分解・合成をサポート • 見た目は同じでもバイト列が異なる表現 が か ゛ U+304C U+304B U+3099 合成済み文字 基底文字 結合文字
Unicodeの正規化 • Unicodeでは4種類の正規化方法を規定 • NFC Normalization Form Canonical Composition正規合成 • NFD Normalization Form Canonical Decomposition正規分解 • NFKC Normalization Form Compatibility Composition互換合成 • NFKD Normalization Form Compatibility Decomposition互換分解 • 正規化した結果からは元のバイト列の復元はできない
Unicodeの正規化 • 正規化処理により意味の異なるバイト列に変化する ‥ . . U+2025 U+002E U+002E ① 1 U+2473 U+0031 NFKC,NFKD
Unicodeの正規化 Unicodeでの 文字列の入力 〵‥〵‥〵 U+2025 フィルタの すり抜け 入力値の検査 正規化処理 〵..〵..〵 U+002E パストラバーサルなど 次の処理
Unicodeの正規化 • 対策はどうしたらいいの? • 文字列の検査後に正規化処理を行わない
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
不正なバイト列の埋め込み • 処理系によっては不正なバイト列が無視されたり、想定外の文字に変換されることがある
不正なバイト列の埋め込み • Firefox2.0.0.12以前のバージョンはShift_JISのときに0x80を無視する <s[0x80]c[0x80]r[0x80]ipt> alert(1) </s[0x80]c[0x80]r[0x80]ipt>
不正なバイト列の埋め込み • IEは0x00を無視する <s[0x00]c[0x00]r[0x00]ipt> alert(1) </s[0x00]c[0x00]r[0x00]ipt>
不正なバイト列の埋め込み • IEは0x0Bと0x0Cを区切り文字とみなす <script[0x0B]> alert(1) </script> <input type=text value=a[0x0C]onmouseover=alert(1)>
不正なバイト列の埋め込み • 他にもいろいろある!? • 対策はどうしたらいいの? • ホワイトリストを用いて安全な文字列のみ生成する。
Agenda • はじめに • 比較の一致/不一致 • UTF-8の冗長なエンコーディング • 多対一の変換 • 大文字と小文字 • Unicodeの正規化 • 不正なバイト列の埋め込み • 先行バイトの埋め込み • エンコード情報の不一致 • 7ビット文字コードの解釈 • まとめ P/1.x 200 OK e: Thu, 11 Jul 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644
先行バイトの埋め込み • マルチバイト文字の先行バイトを注入することでフィルタを回避
先行バイトの埋め込み name: <input type=text value="[0x82]"> e-mail: <input type=text value=" onmouseover=...//"> • Shift_JISの先行バイトである0x82でダブルクォートを無効にする(IE / Firefox / Opera)
先行バイトの埋め込み UTF-8 http://example.com/?%3cscript%20%E2%3Ealert(1);... http://example.com/?%E2%22onmouseover=alert(1) Shift_JIS http://example.com/?%3cscript%20%81%3E%3ealert(1);... EUC-JP http://example.com/?%3cscript%20%E0%3Ealert(1);... http://example.com/?%E0%22onmouseover=alert(1) • IE8beta2 の XSS Filter も回避
先行バイトの埋め込み • 対策はどうしたらいいの? • 文字単位で検証 • 他の文字コードにいったん変換…