1 / 76

Web アプリケーションセキュリティ

Web アプリケーションセキュリティ. ネットエージェント株式会社 研究開発部 はせがわよすうけ hasegawa@utf-8.jp. 悪用厳禁. 自身が管理する以外のコンピュータに対して攻撃等の行為を行った場合 不正アクセス行為の禁止等に関する法律 電子計算機損壊等業務妨害罪 電磁的記録不正作出罪 その他の関連法規等に従い罰せられる可能性があります。. 自己紹介. はせがわようすけ ネットエージェント株式会社研究開発部 Microsoft MVP for Client Operating System

shel
Download Presentation

Web アプリケーションセキュリティ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Webアプリケーションセキュリティ ネットエージェント株式会社 研究開発部 はせがわよすうけ hasegawa@utf-8.jp

  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 2009 07: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 2009 07:37:27 GMT tent-Type: text/html; charset=UTF-8 y: Accept-Encoding tent-Length: 12644

  6. Introduction はじめに

  7. 文字コードと セキュリティ 何が関係あるの?

  8. 文字コードとセキュリティ 何が関係あるの? • レガシーな文字コードからUnicodeへの移行 • EUC-JPやShift_JISと、Unicodeの混在 • Webブラウザはテキストパーサ • HTMLやXMLなどのテキストデータを処理 • 視覚的な効果 • 視覚的に似た文字など、攻撃者の強力な道具

  9. 文字列の比較検出 text text text text • 文字列の比較検出 • セキュリティのための基本処理 入力 検査 次の処理へ 1101100110010 0010001110110 1000010100110 0101011011110 • 「安全な文字列の確認」「危険な文字列の検出」

  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:// 攻撃者 http://example.com/ ?item="><script>... GET /?item="><script>... Webサーバ メタ文字のエスケープ <input type="text" value=""><script>... 被害者

  12. 文字コードとセキュリティ 何が関係あるの? • 文字列の比較・検出はセキュリティのための要 • 攻撃者は比較・検出を迂回する方法を編み出している

  13. 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

  14. 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

  15. 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)

  16. UTF-8の冗長なエンコーディング 正しい表現 不正な表現 • UTF-8の非最小形式 • 伝統的な攻撃手法のひとつ 0x2F 0xC0 0xAF U+002F 0xE0 0x80 0xAF 0xF0 0x80 0x80 0xAF /

  17. UTF-8の冗長なエンコーディング • IISに対するMS00-057が有名 • もはや化石のような攻撃手法

  18. ほんとに化石?

  19. UTF-8の冗長なエンコーディング • CVE-2008-2938Apache Tomcat UTF-8 Directory Traversal Vulnerability • Published: Aug 12 2008 • いまでも存在する「生きた化石」

  20. UTF-8の冗長なエンコーディング • 対策はどうしたらいいの? • 自前でUTF-8のデコードをしない信頼できるライブラリ/フレームワークに任せる • 処理前にUTF-16などに変換するのもひとつの手

  21. 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

  22. 多対一の変換 • Unicodeから他の文字コードへの変換は多対一で行われる \ 0x5C U+005C U+00A5 U+20A9 ¥ ₩

  23. 多対一の変換 Unicodeでの 文字列の入力 ¥..¥..¥ U+00A5 フィルタの すり抜け 入力値の検査 他のエンコーディングに変換 〵..〵..〵 0x5C パストラバーサルなど 次の処理

  24. 多対一の変換 • "..\" and "..\..\Windows" がC:\tempフォルダに存在 • ファイル名をANSIで扱うとパストラバーサル

  25. 多対一の変換 DEMO

  26. 多対一の変換 • 多数の文字が「多対一」で変換される ¡ ! U+00A1 0xA5 ¦ | U+00A6 0x7C À Á Â Ã Ä Å Æ A U+00C0 U+00C1 U+00C2 U+00C3 U+00C4 U+00C6 0x41 U+00C5

  27. 多対一の変換 • 対策はどうしたらいいの? • 文字列をUnicodeの扱い、他のエンコーディングに変換しない • (変換するとしても)検査後には変換しない

  28. 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

  29. 大文字と小文字 • 大文字、小文字同一視の定義は、言語や文化によって異なる • 大文字・小文字を同一視した文字列の比較は実は難しい • 独自の基準で比較 • Unicodeに従って比較

  30. 大文字と小文字 大文字と小文字の比較 「Windowsプログラミングの極意」,株式会社アスキー,ISBN978-4-7561-5000-4,P.340より

  31. 大文字と小文字 • 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

  32. 大文字と小文字 • 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

  33. 大文字と小文字 • 対策はどうしたらいいの? • 大文字、小文字の差でセキュリティ上の分界点をつくらない • 大文字、小文字の比較・変換機能は十分動作を確認・把握する

  34. 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

  35. Unicodeの正規化 • Unicodeは文字の分解・合成をサポート • 見た目は同じでもバイト列が異なる表現 が か ゛ U+304C U+304B U+3099 合成済み文字 基底文字 結合文字

  36. Unicodeの正規化 • Unicodeでは4種類の正規化方法を規定 • NFC Normalization Form Canonical Composition正規合成 • NFD Normalization Form Canonical Decomposition正規分解 • NFKC Normalization Form Compatibility Composition互換合成 • NFKD Normalization Form Compatibility Decomposition互換分解 • 正規化した結果からは元のバイト列の復元はできない

  37. Unicodeの正規化 • 正規化処理により意味の異なるバイト列に変化する ‥ . . U+2025 U+002E U+002E ① 1 U+2473 U+0031 NFKC,NFKD

  38. Unicodeの正規化 Unicodeでの 文字列の入力 〵‥〵‥〵 U+2025 フィルタの すり抜け 入力値の検査 正規化処理 〵..〵..〵 U+002E パストラバーサルなど 次の処理

  39. Unicodeの正規化 • 対策はどうしたらいいの? • 文字列の検査後に正規化処理を行わない

  40. 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

  41. 不正なバイト列の埋め込み • 処理系によっては不正なバイト列が無視されたり、想定外の文字に変換されることがある

  42. 不正なバイト列の埋め込み • Firefox2.0.0.12以前のバージョンはShift_JISのときに0x80を無視する <s[0x80]c[0x80]r[0x80]ipt> alert(1) </s[0x80]c[0x80]r[0x80]ipt>

  43. 不正なバイト列の埋め込み • IEは0x00を無視する <s[0x00]c[0x00]r[0x00]ipt> alert(1) </s[0x00]c[0x00]r[0x00]ipt>

  44. 不正なバイト列の埋め込み • IEは0x0Bと0x0Cを区切り文字とみなす <script[0x0B]> alert(1) </script> <input type=text value=a[0x0C]onmouseover=alert(1)>

  45. 不正なバイト列の埋め込み • 他にもいろいろある!? • 対策はどうしたらいいの? • ホワイトリストを用いて安全な文字列のみ生成する。

  46. 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

  47. 先行バイトの埋め込み • マルチバイト文字の先行バイトを注入することでフィルタを回避

  48. 先行バイトの埋め込み name: <input type=text value="[0x82]"> e-mail: <input type=text value=" onmouseover=...//"> • Shift_JISの先行バイトである0x82でダブルクォートを無効にする(IE / Firefox / Opera)

  49. 先行バイトの埋め込み 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 も回避

  50. 先行バイトの埋め込み • 対策はどうしたらいいの? • 文字単位で検証 • 他の文字コードにいったん変換…

More Related