Your SlideShare is downloading. ×
Tomcatのセキュリティについて
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Tomcatのセキュリティについて

2,047
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,047
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. - Tomcatのセキュリティに関して -
  • 2. ■ 自己紹介 twitter:abend セキュリティエンジニアをやってます。(得意科目はアルコール) メインは、Webアプリケーションセキュリティ。仕事なのか趣味なのか 分からないところで、いろいろなことに首を突っ込んでます。 好きな脆弱性は、MS08-067。 2
  • 3. ■ で、今日の内容は 「Tomcatのセキュリティに関して」 なんで、TomcatなのかというとTomcatで脆弱性の検証サイトを 作っていたが、特定の脆弱性だけ発現しなかった。 動け、動け、動いてよ!今、動かなきゃ、何にもならないんだ。 ということで、調査することにした。 3
  • 4. ■ HTTPレスポンススプリッティング① なりすましやHTTPキャッシュ汚染をさせる攻撃。 メールやページ 書込みによるリン ク 攻撃者 キャッシュが 一般利用者 脆弱なサイト 汚染される Proxy Server 被害 ・ ログイン情報(Cookie)の奪取 → XSSと同等またはそれ以上 ・ ページ改竄によるフィッシング 4
  • 5. ■ HTTPレスポンススプリッティング② 攻撃手法 罠サイトから対象サイトへ 罠サイト 偽装されたコンテンツ 本来のコンテンツ 入力値: beer%0a%0d<html><body>・・・ 改行を意味する原因:ユーザからの入力値の改行コードがそのままレスポンスヘッダ内に出力されている。対策:改行コードを無害化する 5
  • 6. ■ HTTPレスポンススプリッティング③ <入力> sato4@abend.dip.jp%0a%0d%0a%0d<html><body>・・・・・ 脆弱性がある箇所に入力 HTTP/1.1 200 OK Date: Mon, 09 Jul 2012 11:12:25 GMT Set-Cookie: loginnm=abend@abend.dip.jp 偽装されたコンテンツ <html><body>・・・・・ </body></html> (キャッシュされる) Content-Type: text/html;charset=utf-8 Vary: Accept-Encoding Keep-Alive: timeout=15, max=98RFC2616 6 レスポンス Transfer-Encoding: chunked Proxy-Connection: Keep-Aliveリクエストメッセージを受信・解釈した後、サーバは HTTP レスポンスメッ 本来のコンテンツセージを返す。 <html>Response = Status-Line ; Section 6.1 <body> *(( general-header ; Section 4.5 ******** 以下、略 ******** | response-header ; Section 6.2 | entity-header ) CRLF) ; Section 7.1 6
  • 7. ■ソースコードを見てみた① バージョン:6.0.26 ファイル数:1,734 ファイルサイズ:約20Mバージョン:7.0.27ファイル数:2,361ファイルサイズ:約25M ハンパなく多い 7
  • 8. ■ソースコードを見てみた②まずは、6.0.26。ファイル数が、非常に多いので、テキトーに 検索 した。キーワードは、『Cookie』。 8
  • 9. ■ソースコードを見てみた③いろいろと見た結果、org.apache.tomcat.util.httpパッケージのServerCookie.javaにたどり着いた。 Cookieを作成する際にappendCookieValue関数が呼ばれる。appendCookieValue関 数 は下記のmaybeQuote2関数、 containsCTL関数を呼び出す。 392 public static int maybeQuote2 (int version, StringBuffer buf, String value, String literals, boolean allowVersionSwitch) { 393 if (value==null || value.length()==0) { 394 buf.append(""""); 395 }else if (containsCTL(value,version)) 396 throw new IllegalArgumentException("Control character in cookie value, consider BASE64 encoding your value"); 397 else if (alreadyQuoted(value)) { 398 buf.append("); 399 buf.append(escapeDoubleQuotes(value,1,value.length()-1)); 400 buf.append("); 401 } else if (allowVersionSwitch && (!STRICT_SERVLET_COMPLIANCE) && version==0 && !isToken2(value, literals)) { 402 buf.append("); containsCTL関数がTrueとなった場合、 403 buf.append(escapeDoubleQuotes(value,0,value.length())); 404 buf.append("); IllegalArgumentExceptionが発生する。 405 version = 1; 406 } else if (version==0 && !isToken(value,literals)) { 407 buf.append("); 408 buf.append(escapeDoubleQuotes(value,0,value.length())); 409 buf.append("); 410 } else if (version==1 && !isToken2(value,literals)) { 411 buf.append("); 412 buf.append(escapeDoubleQuotes(value,0,value.length())); 413 buf.append("); 414 }else { 415 buf.append(value); 416 } 417 return version; 418 } 9
  • 10. ■ソースコードを見てみた④ containsCTL関数は、Asciiコードが0x09以外の0x20未満か0x7f以上の場合にTrue (Exceptionが発生する)となる。 194 public static boolean containsCTL(String value, int version) { 195 if( value==null) return false; 196 int len = value.length(); 197 for (int i = 0; i < len; i++) { 198 char c = value.charAt(i); 199 if (c < 0x20 || c >= 0x7f) { 200 if (c == 0x09) 201 continue; //allow horizontal tabs 202 return true; 203 } 204 } 205 return false; 206 }改行は、0x0a、0x0dなのでTrueになる。ちなみに。0x09は、水平タブ。0x7fは、DEL。 10
  • 11. ■ソースコードを見てみた⑤ (結論) <結論> Tomcat6.0.26では、Cookieの値に改行コードを含めることは出来ない。 →Set-Cookieのタイミングで、HTTPレスポンススプリッティングは発現しない。 →Tomcat5.5.23でも同様だった。 6.0系、5.5系ともにすべてのバージョンを確認したわけではないが、多分、対応 できているはず。5.0系や4.0系などは不明。また、7.0.27では、 maybeQuote2関数 は、存在しない。 では、7.0系は、どうなっているのか。 Set-Cookie以外のHeaderは?? 11
  • 12. ■ソースコードをもう一度見てみた⑥ 7.0.27のorg.apache.tomcat.util.httpパッケージのServerCookie.java には、appendCookieValue関数は存在し、maybeQuote関数が呼び出されている。 285 private static void maybeQuote (StringBuffer buf, String value) { 286 if (value==null || value.length()==0) { 287 buf.append(""""); 288 } else if (CookieSupport.alreadyQuoted(value)) { 289 buf.append("); 290 buf.append(escapeDoubleQuotes(value,1,value.length()-1)); 291 buf.append("); 292 } else if (CookieSupport.isHttpToken(value) && 293 !CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 || 294 CookieSupport.isV0Token(value) && 295 CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0) { 296 buf.append("); 297 buf.append(escapeDoubleQuotes(value,0,value.length())); 298 buf.append("); 299 } else { 300 buf.append(value); 301 } 302 } ただ、Asciiコードのチェックはしておらず、ダブルクォートのチェックのみと なっている。 containsCTL関数は、いない。 12
  • 13. ■ソースコードを見てみた⑦ 本当に、いろいろと見てみた。 結果、org.apache.coyote.http11のAbstractOutputBufferにあるwrite関数にたどり ついた。 483 protected void write(CharChunk cc) { 484 485 int start = cc.getStart(); 486 int end = cc.getEnd(); 487 char[] cbuf = cc.getBuffer(); 488 for (int i = start; i < end; i++) { 489 char c = cbuf[i]; 490 // Note: This is clearly incorrect for many strings, 491 // but is the only consistent approach within the current 492 // servlet framework. It must suffice until servlet output 493 // streams properly encode their output. 494 if ((c <= 31) && (c != 9)) { 495 c = ; 496 } else if (c == 127) { 497 c = ; 498 } 499 buf[pos++] = (byte) c; 500 } 501 502 } 0x0a(10)、0x0d(13)は、半角スペースに置換されるのでどうやら、こ れっぽい。 なぜか、10進数での比較になっている。 13
  • 14. ■実際に試してみた① 7.0.27では、改行コードのチェックがされていない可能性があったため 脆弱性を含むサイトを作成し、実際に試してみた。 ログイン押下後に、「ログイン名」で入力された値をSet-Cookieする仕様。 14
  • 15. ■実際に試してみた② やってみた ************** リクエスト ************************ POST http://127.0.0.1:8080/WithUS/MainController HTTP/1.1 改行コードと任意の Host: 127.0.0.1:8080 Content-Length: 88 ヘッダの挿入を試み User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 る。 Content-Type: application/x-www-form-urlencoded Cookie: JSESSIONID=55BC3ACFF90BDEBEA2C388E042FF680B; cart="" Cmd=login_process&RetAct=top&LoginNm=abend%40abend.dip.jp%0a%0dtest:test&Passwd=sato ************** レスポンス ************************ HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: loginnm="sato4@abend.dip.jp test:test"; Version=1; Path=/ Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked 半角スペース2つに置 <html> き換わっていた。 以下、略 %0a%0dが半角スペースに置換されている。 7.0.27もSet-Cookieするところに、HTTPレスポンススプリッティングの可能性 がない。 appendCookieValue関数以外のところで、置換処理がされている。。。 15
  • 16. ■実際に試してみた③ Locationヘッダのパターンもやってみた ************** リクエスト ************************ POST http://127.0.0.1:8080/WithUS/MainController HTTP/1.1 パラメータ「RetAct」の値にリダイレクト Referer: http://127.0.0.1:8080/WithUS/MainController されるつくりになってる。 User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) Content-Type: application/x-www-form-urlencoded http://127.0.0.1:8080/WithUS/MainController Host: 127.0.0.1:8080 改行test:testを入力。 Content-Length: 144 Cookie: JSESSIONID=AEA39838FD41B9AC543F6C24FC5F8EDE; cart="" Cmd=login_process&RetAct=http%3A%2F%2F127.0.0.1%3A8080%2FWithUS%2FMainConroller%0a%0dtest:test&LoginNm=abend%40ab end.dip.jp&Passwd=satoogawa ************** レスポンス ************************ HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Set-Cookie: loginnm=“abend@abend.dip.jp"; Version=1; Path=/WithUS Location: http://127.0.0.1:8080/WithUS/MainConroller test:test Content-Length: 0 半角スペース2つに置換 改行コードは、半角スペースに置換されており、脆弱性は存在しない。 16
  • 17. ■結論 HTTPレスポンススプリッティングは、Tomcatでは発現しない。 なので、改行コードの除外はしなくても問題なし。 とはならない。改行コードは、出力される箇所に合わせて取り除く必要がある。 例として、入力されたパラメータをメール本文に出力する場合(会員登録完了 メールなどで入力された住所をメールに記載するアプリなど)に、大量の改行 コードが入力され本来のメッセージが下のほうに追いやられてしまい、フィッシ ングサイトへの誘導などに悪用される可能性があるため。 メール本文 こんにちはXXさん 罠URLはこちら 改行をスルーパスしてしまうと 改行 意図しない利用方法(悪用) 改行 改行 されてしまう可能性がある。 改行 アプリケーションに応じて、取 改行 改行 り 改行 除く必要がある。 改行 本来のメール本文 17
  • 18. ■追記 RFC2616やRFC2965には、Cookieで改行コードの取り扱いに関して特に言及されて いない。実装方式はベンダに依存するため、ヘッダインジェクションの可能性は 無限大。 ただ、Tomcatは血迷うことがないか、新たな手法じゃない限り、起きないと思う。 いや、起きないと信じたい。 18
  • 19. ■(参考)Tomcatの脆弱性 様々な脆弱性 CVE-2011-4858 Tomcatのハッシュテーブルの実装に脆弱性が存在しており、リモート攻撃 者によりサービス提供妨害を引き起こされる可能性がある。 CVE-2009-2901 undeployコマンドを失敗させることによりローカルの攻撃者により、ア クセスが制限されているappBaseフォルダ内のファイルが参照されてしま う可能性があります。 CVE-2007-2449 JSPのサンプルプログラムに、クロスサイトスクリプティングの脆弱性が 存在します。リモートの攻撃者は罠などに誘導し、クライアント上で任 意のコードを実行することが可能です。 CVEとは? Common Vulnerabilities and Exposures Numberの略で、脆弱性情報の データベース。脆弱性ごとに固有のCVE番号が割り振られる。 19