狠狠撸

狠狠撸Share a Scribd company logo
Copyright?2013 JPCERT/CC All rights reserved.
「Javaアプリケーション脆弱性事例調査資料」について
この資料は、Javaプログラマである皆様に、脆弱性を身
近な問題として感じてもらい、セキュアコーディングの
重要性を認識していただくことを目指して作成していま
す。
「Javaセキュアコーディングスタンダード
CERT/Oracle版」と合わせて、セキュアコーディングに
関する理解を深めるためにご利用ください。
JPCERTコーディネーションセンター
セキュアコーディングプロジェクト
secure-coding@jpcert.or.jp
1
Japan Computer Emergency Response Team
Coordination Center
電子署名者 : Japan Computer Emergency Response Team Coordination Center
DN : c=JP, st=Tokyo, l=Chiyoda-ku, email=office@jpcert.or.jp, o=Japan
Computer Emergency Response Team Coordination Center, cn=Japan
Computer Emergency Response Team Coordination Center
日付 : 2013.09.30 16:17:37 +09'00'
Apache CommonsのHttpClientに
おけるSSLサーバ証明書検証不備
CVE-2012-5783
JVNDB-2012-005217
2
Copyright?2013 JPCERT/CC All rights reserved.
Apache Commons とは
主に Apache 関連製品で用いられる、再利用可能な Java
コンポーネントをまとめているプロジェクト
現時点で 30 以上のサブプロジェクトが存在
…etc
※1 HttpClient は 2013.06 現在 HTTP Components プロジェクトに移行されて
いる
3
カテゴリ 主なサブプロジェクト名
Web関連 FileUpload, HttpClient※1, Net …
XML関連 Betwixt, Designer, Jelly, JXPath …
ユーティリティ BeanUtils, Configuration, Logging …
Copyright?2013 JPCERT/CC All rights reserved.
HttpClient とは
HTTPクライアントを開発するためのクラスライ
ブラリ
HTTP通信に関わる基本的な処理がライブラリ化
されている
HttpClientを利用することでHTTP通信を行うア
プリケーション(ブラウザ等)を効率よく開発する
ことができる
4
GUI/CUI デザイン
文字コード処理
HTTP プロトコル
TCP 通信
ブラウザの機能
HttpClientでライブラ
リ化されている機能
Copyright?2013 JPCERT/CC All rights reserved.
脆弱性の概要
HttpClientがSSL通信を行う際に、接続先サーバのサーバ
証明書の検証が行われていなかった
そのため、HttpClientを使用したアプリケーションは、正
規の証明書を持たないサーバへのSSL通信をエラーなし
で許可してしまった
5
※本ドキュメントは、脆弱性を内包する Apache Commons 2.0.1 を対象に記載している。
(脆弱性は Apache Commons 2.0.1 以降に存在)
Copyright?2013 JPCERT/CC All rights reserved.
SSL通信における証明書認証
SSL通信では以下のようなやりとりが行われる
6
① サーバにアクセス
サーバクライアント
② サーバ証明書の提示
③ サーバ証明書の検証
サーバ証明書
Server
Server
④ クライアント証
明書の提示
⑥ 暗号化アルゴリズムの
決定、暗号化キーの交換
クライアント証明書
Client
⑤ クライアント証
明書の検証
Client
SSL通信(暗号化通信)の開始
④、⑤はサーバ側でク
ライアントを認証する
際に行われるため、必
須ではない
Copyright?2013 JPCERT/CC All rights reserved.
サーバ証明書の検証
クライアント-サーバ間でSSL通信(暗号化通信)をするこ
とで、盗聴による情報漏えいを防ぐことができる
ただし、接続先サーバが不正なホストに入れ替わってし
まうとSSL通信(暗号化通信)の意味がない
そこで、SSL通信開始時にサーバ証明書を検証すること
で、接続先サーバの身元を確認する
7
偽の www.jpcert.or.jp サーバ
証明書がおかしい!
見るのをやめよう。
クライアント
偽サーバの
サーバ証明書
本物の www.jpcert.or.jp サーバ
Copyright?2013 JPCERT/CC All rights reserved.
サーバ証明書検証に関する情報
8
■RFC5280: Internet X.509 Public Key Infrastructure Certificate and
Certificate Revocation List (CRL) Profile
(http://tools.ietf.org/html/rfc5280)
SSL証明書の検証内容として以下のような項目を挙げ、
検証に関するアルゴリズムを定義している。
(Section6. Certification Path Validation)
1.発行元の認証機関(CA)が信頼されているCAであることを確認する
2.現在の日付が有効期間内にあるかどうかを確認する
3.現時点において、証明書が失効していないことを確認する
4.発行元CAの公開キーにより、送信者のデジタル署名を検証する
5.サーバーの証明書のドメイン名がサーバー自体のドメイン名と一致
するかどうかを確認する
この資料では、5. のドメイン名(ホスト名)を
検証する処理を中心に見ていく。
注意!!
Copyright?2013 JPCERT/CC All rights reserved.
サーバ証明書の記載内容
サーバ証明書には、以下のような情報が含まれる。
9
項目名 記載内容
CN サーバ名(ドメイン含む) www.jpcert.or.jp
OU 運営団体の部署名 System Administration Group
O 運営団体名 Japan Computer Emergency Response Team Coordination Center
L 運営団体の所在(市区町村) Chiyoda-ku
ST 運営団体の所在(都道府県) Tokyo
C 運営団体の所在(国名) Japan
—証明書の有効期間
—証明書を発行した証明機関(CA)のパス
※CNには1つのホストしか記述できないため、複数ホスト(バーチャルホス
ト)運用を想定した拡張フィールド subjectAltName も用意されており、
CNフィールドよりも優先される。
Copyright?2013 JPCERT/CC All rights reserved.
中間者による攻撃を予防するために、クライアントは、これをサーバーの
証明書メッセージ中に示されたサーバーの身元に照らしてチェックしなけ
ればなりません(MUST)。
(中略)
証明書の Subject フィールドにある(最も具体的)な Common Name フィー
ルドを使用しなければなりません(MUST)。
the client MUST check it against the server's identity as presented in the
server's Certificate message, in order to prevent man-in-the-middle attacks.
(中略)
the (most specific) Common Name field in the Subject field of the certificate
MUST be used.
サーバ証明書の検証内容
10
RFC 2818 「HTTP Over TLS」 では以下のように記載されている。
English
日本語
RFC では「証明書のCN(またはsubjectAltName)の値」と
「ホスト名」の一致を検証することが必須、とされている。
Copyright?2013 JPCERT/CC All rights reserved.
脆弱性が悪用された場合のリスク
SSLサーバの成りすましが可能
それによりSSL通信の中間者攻撃(Man-In-The-
Middle 攻撃)が可能
—SSL通信内容の傍受、改ざんが可能。
11
Copyright?2013 JPCERT/CC All rights reserved.
脆弱性の悪用例(Man-In-The-Middle攻撃)
クライアントを、本来接続するサーバとは異なる不正な
サーバに接続させる
不正なサーバでは、クライアントに代わって正規のサー
バと通信し、クライアントに対しては正規のサーバとし
てふるまう
不正なサーバ上で通信情報の傍受や改ざんが可能となる
12
中継
偽サーバの
サーバ証明書
本来接続したい
正規のサーバクライアント
不正なサーバ
情報の搾取?改ざん
Copyright?2013 JPCERT/CC All rights reserved.
HTTPSアクセス時の実行フロー
13
クライアント
アプリケーション HttpClient
SSLSocketFactory
Java NativeHttpClient::executeMethod()
SSLSocketFactory::
createSocket()
接続処理
サーバ証明書
SSL接続
SSLSocket
オブジェクト
結果返却
呼出し
呼出し
接続結果
リクエスト送信
クライアントアプリケーションには接続後のリクエスト送信結果のみが返される。
※サーバ証明書情報を含むSSLSocketオブジェクトは返されない
結果返却
結果返却
呼出し
リクエスト送信
HTTPリクエスト
サーバ
クライアント
接続結果
サーバ証明書を含む
SSLSocketオブジェクトを
受け取り、HttpClientクラス
内で管理する
Copyright?2013 JPCERT/CC All rights reserved.
ソースコード解説
14
① クライアントアプリケーションがHttpClientライブラリの
executeMethodメソッドを呼び出す。
② executeMethodメソッドからjavax.net.ssl.SSLSocketFactory ク
ラスのcreateSocketメソッドが呼び出され 、サーバとのSSL 接
続が確立する。
③ HttpClientライブラリにコネクションオブジェクト(SSLSocketオ
ブジェクト)が返却される。
④ HttpClientがSSLSocketを使用してHTTPリクエストを送信する。
⑤ サーバからHTTPレスポンスを受け取ってクライアントアプリ
ケーションに返却する。
Copyright?2013 JPCERT/CC All rights reserved.
①クライアントアプリケーションがHttpClientのexecuteMethodメ
ソッドを呼び出す
15
public class SimpleClient {
public static void main(String[] args) {
try {
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod(“https://www.jpcert.or.jp/”);
try {
int statusCode = httpclient.executeMethod(httpget);
if (statusCode != HttpStatus.SC_OK) {
// Error handling here
}
byte[] response = httpget.getResponseBody();
} finally {
httpget.releaseConnection();
}
:
SimpleClient.java
接続処理
HttpClient インスタンスを作成、Get
メソッドパラメータを構成し
executeMethodを呼び出す。
Copyright?2013 JPCERT/CC All rights reserved.
② executeMethod内でSSLSocketFactoryクラスのcreateSocketメ
ソッドが呼び出され、サーバとのSSL接続が確立する。
16
public class SSLProtocolSocketFactory implements SecureProtocolSocketFactory {
:
public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
throws IOException, UnknownHostException {
return SSLSocketFactory.getDefault().createSocket(host, port, clientHost, clientPort);
}
SSLProtocolSocketFactory.java
public class HttpConnection {
public void open() throws IOException {
:
this.socket = socketFactory.createSocket(
host, port,
localAddress, 0,
this.params);
}
:
HttpConnection.java (HttpClient.executeMethod >> HttpConnection.open)
executeMethodから呼
び出される処理
CALL
接続処理
接続処理
Copyright?2013 JPCERT/CC All rights reserved.
③HttpClientライブラリにコネクションオブジェクト(SSLSocketオブ
ジェクト)が返却される。
17
public class HttpConnection {
public void open() throws IOException {
:
this.socket = socketFactory.createSocket(
host, port,
localAddress, 0,
this.params);
}
:
}
HttpConnection.java (HttpClient.executeMethod >> HttpConnection.open)
HttpClientライブラリのHttpConnectionクラスの
内部に、SSLSocketオブジェクトを格納する。
public class SSLProtocolSocketFactory implements SecureProtocolSocketFactory {
:
public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
throws IOException, UnknownHostException {
return SSLSocketFactory.getDefault().createSocket(host, port, clientHost, clientPort);
}
SSLProtocolSocketFactory.java
SSLSocketFactory::createSocketメソッドは
SSLSocketオブジェクトを返却する
Return
Copyright?2013 JPCERT/CC All rights reserved.
④ HttpClientがSSLSocketを使用してHTTPリクエストを送信する。
18
private void executeWithRetry(final HttpMethod method)
throws IOException, HttpException {
:
this.conn.open();
:
applyConnectionParams(method);
method.execute(state, this.conn);
HttpMethodDirector.java (HttpClient.executeMethod > HttpMethodDirector.executeWithRetry)
その後、HttpClientライブラリ内に保持したSSLSocket
オブジェクトを利用してリクエスト送信が行われる。
リクエスト送信処理
Copyright?2013 JPCERT/CC All rights reserved.
⑤ サーバからHTTPレスポンスを受け取りクライアントアプリケーショ
ンに返却する。
19
public class SimpleClient {
public static void main(String[] args) {
try {
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod(“https://www.jpcert.or.jp/”);
try {
int statusCode = httpclient.executeMethod(httpget);
if (statusCode != HttpStatus.SC_OK) {
// Error handling here
}
byte[] response = httpget.getResponseBody();
} finally {
httpget.releaseConnection();
}
:
SimpleClient.java
executeMethodを呼び出した結果
(送信したリクエストに対するレス
ポンス)をクライアントアプリケー
ションに返却する
レスポンス返却
Copyright?2013 JPCERT/CC All rights reserved.
問題点とその対策
? 今回のアプリケーションにおける具体的な問題点
前述の RFC 2818「HTTP Over TLS」に沿っていない!
サーバへ接続後、SSLSocket がサーバ証明書を取得して
いるが、その検証を一切行っていなかったため、サーバ名
(CNやsubjectAltName)が異なるサーバでも正常に繋がっ
てしまった。
? 問題点に対してどうすべきだったか
サーバ証明書の検証を実施する。不正なサーバ証明書であ
ることが判明したら、エラー状態として扱う。
20
(証明書の検証方法として、)証明書の Subject フィールドにある(最も具体的)な
Common Name フィールドを使用しなければなりません(MUST) 。
Copyright?2013 JPCERT/CC All rights reserved.
HTTPSアクセス時の実行フローにおける問題点
21
クライアント
アプリケーション HttpClient
SSLSocketFactory
Java NativeHttpClient::executeMethod()
SSLSocketFactory::
createSocket()
接続処理
サーバ証明書
SSL接続
SSLSocket
オブジェクト
結果返却
呼出し
呼出し
接続結果
リクエスト送信
結果返却
結果返却
呼出し
リクエスト送信
HTTPリクエスト
サーバ
クライアント
接続結果
HttpClientはSSL接
続時にサーバ証明書
の検証を行っておら
ず、サーバの正当性
を確認していない!!
クライアントアプリケーションでは、
サーバ証明書情報を含むSSLSocketオ
ブジェクトを受け取れないため、証明書
の検証はできない!!
Copyright?2013 JPCERT/CC All rights reserved.22
「 ③HttpClientライブラリにコネクションオブジェクト(SSLSocket
オブジェクト)が返却される。」のコードに問題がある。
public class SSLProtocolSocketFactory implements SecureProtocolSocketFactory {
:
public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
throws IOException, UnknownHostException {
return SSLSocketFactory.getDefault().createSocket(host, port, clientHost, clientPort);
}
SSLProtocolSocketFactory.java
HTTPSアクセス時の実行フローにおける問題点
createSocket を呼び出した後、返却される Socket 型オブジェクトの
内容を全く検証せず呼び出し元に返却している。
Copyright?2013 JPCERT/CC All rights reserved.
サーバ接続時のフローに証明書検証処理 ③’ が追加された。
修正版コード
23
① クライアントアプリケーションがサーバへの接続処理において
HttpClientライブラリのexecuteMethodメソッドを呼び出す。
② executeMethodメソッドからjavax.net.ssl.SSLSocketFactory クラスの
createSocketメソッドが呼び出され、サーバとのSSL接続が確立する。
③ HttpClientライブラリにコネクションオブジェクト(SSLSocketオブ
ジェクト)が返却される。
③’ SSLSocketオブジェクトに含まれるサーバ証明書を検証する
④ HttpClientがSSLSocketを使用してHTTPリクエストを送信する。
⑤ サーバからHTTPレスポンスを受け取ってクライアントアプリケー
ションに返却する。
Copyright?2013 JPCERT/CC All rights reserved.
ソケット情報から証明書情報を取得し、ホスト名検証
を行う。
修正版コード
24
※ SSLException は IOException の派生クラス
返却されたソケット情報(SSLSocket)を sslSocket に格納し、ホスト
名を検証するメソッド verifyHostName() に渡すように修正。
ホスト名が一致しなかった場合は、SSLException がスローされ、接
続処理が異常終了するようになった。
接続処理
ホスト名検証処理
public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
throws IOException, UnknownHostException {
Socket sslSocket = SSLSocketFactory.getDefault().createSocket(host, port, clientHost, clientPort);
verifyHostName(host, (SSLSocket) sslSocket);
return sslSocket;
}
SSLProtocolSocketFactory.java
Copyright?2013 JPCERT/CC All rights reserved.
補足:ホスト名検証処理
25
Certificate[] c erts = session.getPeerCertificates();
verifyHostName(host.trim().toLowerCase(Locale.US), (X509Certificate) certs[0]);
SSLProtoclSocketFactory.java > verifyHostName(SSLSocket)
証明書配列取得
サーバの証明書での検証処理
String cn = getCN(cert);
…
verifyHostName (host, cn.toLowerCase(Locale.US), subjectAlts);
SSLProtoclSocketFactory.java >…> verifyHostName(X509Certificate)
CN名取得(cn)
host と cn の検証処理
1)SSL接続されたセッション情報から証明書情報取得 証明書配列の取得
接続先サーバの署名を渡す
[0]
2)証明書情報から CN(subjectAltName) エントリを取得し比較
※ 2) で呼び出される verifyHostName 内にて、適切にワイルドカードが使われてい
るCNも併せて解決され、接続しようとしているホスト(host)と証明書のCNレコー
ド(cn)が一致するかチェックされる。
Copyright?2013 JPCERT/CC All rights reserved.
サーバ証明書検証に関する参考情報(1)
26
■RFC5280: Internet X.509 Public Key Infrastructure Certificate and
Certificate Revocation List (CRL) Profile
(http://tools.ietf.org/html/rfc5280)
SSL証明書の検証内容として以下のような項目を挙げ、
検証に関するアルゴリズムを定義している。
(Section6. Certification Path Validation)
1.発行元の認証機関(CA)が信頼されているCAであることを確認する
2.現在の日付が有効期間内にあるかどうかを確認する
3.現時点において、証明書が失効していないことを確認する
4.発行元CAの公開キーにより、送信者のデジタル署名を検証する
5.サーバーの証明書のドメイン名がサーバー自体のドメイン名と一致
するかどうかを確認する
(再掲)
Copyright?2013 JPCERT/CC All rights reserved.27
■Microsoft「SSL ハンドシェイクでのサーバー認証プロセスに関する説明」より
http://support.microsoft.com/kb/257587/ja
SSL を有効にしたクライアントでは、以下の手順を実行してサーバーの身元を認証します。
1. 現在の日付が有効期間内にあるかどうかを確認します。
2. 発行元の認証機関(CA)が信頼されている CA であることを確認します。
3. 発行元 CA の公開キーにより、送信者のデジタル署名を検証します。
4. サーバー証明書のドメイン名がサーバー自体のドメイン名と一致するかどうかを確認し
ます。
■Google「Browser Security Handbook」より
http://code.google.com/p/browsersec/wiki/Part2
ここでは以下を不正な証明書として扱っている。
? 信頼される機関によってサインされていない
? 期限切れ
? ドメイン名と合致しない
(引用、原文そのまま)
invalid certificates (not signed by a trusted entity, expired, not matching the
current domain, or suffering from any other malady)
サーバ証明書検証に関する参考情報(2)
Copyright?2013 JPCERT/CC All rights reserved.
CWE: Common Weakness Enumeration
28
? CWE-295: Improper Certificate Validation
?全般的な話、証明書を正しく検証していない
? CWE-296: Improper Following of a Certificate's Chain of Trust
?証明書チェーンを正しく検証していない
?CWE-298: Improper Validation of Certificate Expiration
?期限が切れているかを正しく検証していない
?CWE-299: Improper Check for Certificate Revocation
?証明書が無効になっていないかを正しく検証していない
http://cwe.mitre.org/
Copyright?2013 JPCERT/CC All rights reserved.
著作権?引用や二次利用について
本資料の著作権はJPCERT/CCに帰属します。
本資料あるいはその一部を引用?転載?再配布する際は、引用元名、資料名および URL の明示を
お願いします。
記載例
引用元:一般社団法人JPCERTコーディネーションセンター
Java アプリケーション脆弱性事例解説資料
Apache Commons の HttpClient における SSL サーバ証明書検証不備
https://www.jpcert.or.jp/securecoding/2012/No.07_Apache_Commons.pdf
本資料を引用?転載?再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ
ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡
により取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポ
リシー」に則って取り扱います。
本資料の利用方法等に関するお問い合わせ
JPCERTコーディネーションセンター
広報担当
E-mail:office@jpcert.or.jp
本資料の技術的な内容に関するお問い合わせ
JPCERTコーディネーションセンター
セキュアコーディング担当
E-mail:secure-coding@jpcert.or.jp
29
Ad

Recommended

MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
JPCERT Coordination Center
?
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
JPCERT Coordination Center
?
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
JPCERT Coordination Center
?
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
JPCERT Coordination Center
?
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JPCERT Coordination Center
?
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性
JPCERT Coordination Center
?
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
JPCERT Coordination Center
?
厂迟谤耻迟蝉2を始めよう!
厂迟谤耻迟蝉2を始めよう!
Shinpei Ohtani
?
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
JPCERT Coordination Center
?
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
JPCERT Coordination Center
?
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
JPCERT Coordination Center
?
クロスサイトリクエストフォージェリ(颁厂搁贵)とその対策
クロスサイトリクエストフォージェリ(颁厂搁贵)とその対策
JPCERT Coordination Center
?
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
JPCERT Coordination Center
?
摆デブサミ2012闭趣味と実益の脆弱性発见
摆デブサミ2012闭趣味と実益の脆弱性発见
Yosuke HASEGAWA
?
Spring fest2020 spring-security
Spring fest2020 spring-security
土岐 孝平
?
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JPCERT Coordination Center
?
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
Hiroshi Tokumaru
?
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
Norito Agetsuma
?
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
Uehara Junji
?
碍别测肠濒辞补办拡张入门
碍别测肠濒辞补办拡张入门
Hiroyuki Wada
?
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
JPCERT Coordination Center
?
碍别测肠濒辞补办入门
碍别测肠濒辞补办入门
Hiroyuki Wada
?
Synthesijer jjug 201504_01
Synthesijer jjug 201504_01
Takefumi MIYOSHI
?
安全な奥别产アプリケーションの作り方2018
安全な奥别产アプリケーションの作り方2018
Hiroshi Tokumaru
?
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
Norito Agetsuma
?
Keycloak & midPoint の紹介
Keycloak & midPoint の紹介
Hiroyuki Wada
?
OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCON
Jun Matsumoto
?
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
JPCERT Coordination Center
?
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
JPCERT Coordination Center
?

More Related Content

What's hot (19)

厂迟谤耻迟蝉2を始めよう!
厂迟谤耻迟蝉2を始めよう!
Shinpei Ohtani
?
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
JPCERT Coordination Center
?
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
JPCERT Coordination Center
?
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
JPCERT Coordination Center
?
クロスサイトリクエストフォージェリ(颁厂搁贵)とその対策
クロスサイトリクエストフォージェリ(颁厂搁贵)とその対策
JPCERT Coordination Center
?
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
JPCERT Coordination Center
?
摆デブサミ2012闭趣味と実益の脆弱性発见
摆デブサミ2012闭趣味と実益の脆弱性発见
Yosuke HASEGAWA
?
Spring fest2020 spring-security
Spring fest2020 spring-security
土岐 孝平
?
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JPCERT Coordination Center
?
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
Hiroshi Tokumaru
?
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
Norito Agetsuma
?
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
Uehara Junji
?
碍别测肠濒辞补办拡张入门
碍别测肠濒辞补办拡张入门
Hiroyuki Wada
?
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
JPCERT Coordination Center
?
碍别测肠濒辞补办入门
碍别测肠濒辞补办入门
Hiroyuki Wada
?
Synthesijer jjug 201504_01
Synthesijer jjug 201504_01
Takefumi MIYOSHI
?
安全な奥别产アプリケーションの作り方2018
安全な奥别产アプリケーションの作り方2018
Hiroshi Tokumaru
?
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
Norito Agetsuma
?
Keycloak & midPoint の紹介
Keycloak & midPoint の紹介
Hiroyuki Wada
?
厂迟谤耻迟蝉2を始めよう!
厂迟谤耻迟蝉2を始めよう!
Shinpei Ohtani
?
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
JPCERT Coordination Center
?
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
JPCERT Coordination Center
?
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
JPCERT Coordination Center
?
クロスサイトリクエストフォージェリ(颁厂搁贵)とその対策
クロスサイトリクエストフォージェリ(颁厂搁贵)とその対策
JPCERT Coordination Center
?
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
JPCERT Coordination Center
?
摆デブサミ2012闭趣味と実益の脆弱性発见
摆デブサミ2012闭趣味と実益の脆弱性発见
Yosuke HASEGAWA
?
Spring fest2020 spring-security
Spring fest2020 spring-security
土岐 孝平
?
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JPCERT Coordination Center
?
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
Hiroshi Tokumaru
?
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
Norito Agetsuma
?
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
Uehara Junji
?
碍别测肠濒辞补办拡张入门
碍别测肠濒辞补办拡张入门
Hiroyuki Wada
?
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
JPCERT Coordination Center
?
碍别测肠濒辞补办入门
碍别测肠濒辞补办入门
Hiroyuki Wada
?
安全な奥别产アプリケーションの作り方2018
安全な奥别产アプリケーションの作り方2018
Hiroshi Tokumaru
?
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
Norito Agetsuma
?
Keycloak & midPoint の紹介
Keycloak & midPoint の紹介
Hiroyuki Wada
?

Viewers also liked (14)

OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCON
Jun Matsumoto
?
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
JPCERT Coordination Center
?
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
JPCERT Coordination Center
?
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
JPCERT Coordination Center
?
脆弱性情报はこうしてやってくる
脆弱性情报はこうしてやってくる
JPCERT Coordination Center
?
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
JPCERT Coordination Center
?
自分よりも技术力の高い会社に入社して感し?たこと
自分よりも技术力の高い会社に入社して感し?たこと
Suzuki Masayuki
?
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Akio Doi
?
とある诊断员と色々厄介な脆弱性达
とある诊断员と色々厄介な脆弱性达
zaki4649
?
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
teapipin
?
世界一简単な骋颈迟丑耻产入门(驳颈迟丑耻产は无料で使用する场合、全てのファイルが公开されていることにご注意ください)
世界一简単な骋颈迟丑耻产入门(驳颈迟丑耻产は无料で使用する场合、全てのファイルが公开されていることにご注意ください)
Shinichi Hirauchi
?
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
Muneaki Nishimura
?
Android Secure Coding
Android Secure Coding
JPCERT Coordination Center
?
フーリエ変换と画像圧缩の仕组み
フーリエ変换と画像圧缩の仕组み
yuichi takeda
?
OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCON
Jun Matsumoto
?
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
JPCERT Coordination Center
?
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
JPCERT Coordination Center
?
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
JPCERT Coordination Center
?
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
JPCERT Coordination Center
?
自分よりも技术力の高い会社に入社して感し?たこと
自分よりも技术力の高い会社に入社して感し?たこと
Suzuki Masayuki
?
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Devsumi2015_20E1 エンジニアが知っておきたいお金の話
Akio Doi
?
とある诊断员と色々厄介な脆弱性达
とある诊断员と色々厄介な脆弱性达
zaki4649
?
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack
teapipin
?
世界一简単な骋颈迟丑耻产入门(驳颈迟丑耻产は无料で使用する场合、全てのファイルが公开されていることにご注意ください)
世界一简単な骋颈迟丑耻产入门(驳颈迟丑耻产は无料で使用する场合、全てのファイルが公开されていることにご注意ください)
Shinichi Hirauchi
?
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
OWASP Testing Guide からはじめよう - セキュリティ診断技術の共有、そして横展開
Muneaki Nishimura
?
フーリエ変换と画像圧缩の仕组み
フーリエ変换と画像圧缩の仕组み
yuichi takeda
?
Ad

Similar to Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783) (20)

Apache Torqueについて
Apache Torqueについて
tako pons
?
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
Hiroyuki Ohnaka
?
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
Masaki Kubo
?
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
Yuta Kawadai
?
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
Yuji Kubota
?
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
Akio Katayama
?
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
Takanori Suzuki
?
WebRTC meetup Tokyo 1
WebRTC meetup Tokyo 1
mganeko
?
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
Toshiaki Maki
?
SAStruts Seminar In Tripodworks
SAStruts Seminar In Tripodworks
tripodworks
?
闯补惫补の进化にともなう运用性の向上はシステム设计にどういう変化をもたらすのか
闯补惫补の进化にともなう运用性の向上はシステム设计にどういう変化をもたらすのか
Yoshitaka Kawashima
?
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
hiroya
?
いよいよ始められる Java EEて?のWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEて?のWebSocket #jjug #jjug_ccc #ccc_r21
Takakiyo Tanaka
?
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
?
ネットワーク第5回
ネットワーク第5回
Yukiko Kato
?
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部
haruki ueno
?
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma
?
Apache Torqueについて
Apache Torqueについて
tako pons
?
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
Hiroyuki Ohnaka
?
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
Masaki Kubo
?
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
Yuta Kawadai
?
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
Yuji Kubota
?
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
Akio Katayama
?
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
Takanori Suzuki
?
WebRTC meetup Tokyo 1
WebRTC meetup Tokyo 1
mganeko
?
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
Toshiaki Maki
?
SAStruts Seminar In Tripodworks
SAStruts Seminar In Tripodworks
tripodworks
?
闯补惫补の进化にともなう运用性の向上はシステム设计にどういう変化をもたらすのか
闯补惫补の进化にともなう运用性の向上はシステム设计にどういう変化をもたらすのか
Yoshitaka Kawashima
?
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
hiroya
?
いよいよ始められる Java EEて?のWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEて?のWebSocket #jjug #jjug_ccc #ccc_r21
Takakiyo Tanaka
?
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
?
ネットワーク第5回
ネットワーク第5回
Yukiko Kato
?
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部
haruki ueno
?
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma
?
Ad

More from JPCERT Coordination Center (9)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
JPCERT Coordination Center
?
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
JPCERT Coordination Center
?
顿尝尝読み込みの问题を読み解く
顿尝尝読み込みの问题を読み解く
JPCERT Coordination Center
?
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
JPCERT Coordination Center
?
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
JPCERT Coordination Center
?
闯补惫补セキュアコーディングセミナー东京第2回演习の解説
闯补惫补セキュアコーディングセミナー东京第2回演习の解説
JPCERT Coordination Center
?
闯补惫补セキュアコーディングセミナー东京第4回演习の解説
闯补惫补セキュアコーディングセミナー东京第4回演习の解説
JPCERT Coordination Center
?
闯补惫补セキュアコーディングセミナー东京第4回讲义
闯补惫补セキュアコーディングセミナー东京第4回讲义
JPCERT Coordination Center
?
闯补惫补セキュアコーディングセミナー东京第3回演习
闯补惫补セキュアコーディングセミナー东京第3回演习
JPCERT Coordination Center
?
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
JPCERT Coordination Center
?
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
JPCERT Coordination Center
?
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
JPCERT Coordination Center
?
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
JPCERT Coordination Center
?
闯补惫补セキュアコーディングセミナー东京第2回演习の解説
闯补惫补セキュアコーディングセミナー东京第2回演习の解説
JPCERT Coordination Center
?
闯补惫补セキュアコーディングセミナー东京第4回演习の解説
闯补惫补セキュアコーディングセミナー东京第4回演习の解説
JPCERT Coordination Center
?
闯补惫补セキュアコーディングセミナー东京第4回讲义
闯补惫补セキュアコーディングセミナー东京第4回讲义
JPCERT Coordination Center
?
闯补惫补セキュアコーディングセミナー东京第3回演习
闯补惫补セキュアコーディングセミナー东京第3回演习
JPCERT Coordination Center
?

Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)

  • 1. Copyright?2013 JPCERT/CC All rights reserved. 「Javaアプリケーション脆弱性事例調査資料」について この資料は、Javaプログラマである皆様に、脆弱性を身 近な問題として感じてもらい、セキュアコーディングの 重要性を認識していただくことを目指して作成していま す。 「Javaセキュアコーディングスタンダード CERT/Oracle版」と合わせて、セキュアコーディングに 関する理解を深めるためにご利用ください。 JPCERTコーディネーションセンター セキュアコーディングプロジェクト secure-coding@jpcert.or.jp 1 Japan Computer Emergency Response Team Coordination Center 電子署名者 : Japan Computer Emergency Response Team Coordination Center DN : c=JP, st=Tokyo, l=Chiyoda-ku, email=office@jpcert.or.jp, o=Japan Computer Emergency Response Team Coordination Center, cn=Japan Computer Emergency Response Team Coordination Center 日付 : 2013.09.30 16:17:37 +09'00'
  • 3. Copyright?2013 JPCERT/CC All rights reserved. Apache Commons とは 主に Apache 関連製品で用いられる、再利用可能な Java コンポーネントをまとめているプロジェクト 現時点で 30 以上のサブプロジェクトが存在 …etc ※1 HttpClient は 2013.06 現在 HTTP Components プロジェクトに移行されて いる 3 カテゴリ 主なサブプロジェクト名 Web関連 FileUpload, HttpClient※1, Net … XML関連 Betwixt, Designer, Jelly, JXPath … ユーティリティ BeanUtils, Configuration, Logging …
  • 4. Copyright?2013 JPCERT/CC All rights reserved. HttpClient とは HTTPクライアントを開発するためのクラスライ ブラリ HTTP通信に関わる基本的な処理がライブラリ化 されている HttpClientを利用することでHTTP通信を行うア プリケーション(ブラウザ等)を効率よく開発する ことができる 4 GUI/CUI デザイン 文字コード処理 HTTP プロトコル TCP 通信 ブラウザの機能 HttpClientでライブラ リ化されている機能
  • 5. Copyright?2013 JPCERT/CC All rights reserved. 脆弱性の概要 HttpClientがSSL通信を行う際に、接続先サーバのサーバ 証明書の検証が行われていなかった そのため、HttpClientを使用したアプリケーションは、正 規の証明書を持たないサーバへのSSL通信をエラーなし で許可してしまった 5 ※本ドキュメントは、脆弱性を内包する Apache Commons 2.0.1 を対象に記載している。 (脆弱性は Apache Commons 2.0.1 以降に存在)
  • 6. Copyright?2013 JPCERT/CC All rights reserved. SSL通信における証明書認証 SSL通信では以下のようなやりとりが行われる 6 ① サーバにアクセス サーバクライアント ② サーバ証明書の提示 ③ サーバ証明書の検証 サーバ証明書 Server Server ④ クライアント証 明書の提示 ⑥ 暗号化アルゴリズムの 決定、暗号化キーの交換 クライアント証明書 Client ⑤ クライアント証 明書の検証 Client SSL通信(暗号化通信)の開始 ④、⑤はサーバ側でク ライアントを認証する 際に行われるため、必 須ではない
  • 7. Copyright?2013 JPCERT/CC All rights reserved. サーバ証明書の検証 クライアント-サーバ間でSSL通信(暗号化通信)をするこ とで、盗聴による情報漏えいを防ぐことができる ただし、接続先サーバが不正なホストに入れ替わってし まうとSSL通信(暗号化通信)の意味がない そこで、SSL通信開始時にサーバ証明書を検証すること で、接続先サーバの身元を確認する 7 偽の www.jpcert.or.jp サーバ 証明書がおかしい! 見るのをやめよう。 クライアント 偽サーバの サーバ証明書 本物の www.jpcert.or.jp サーバ
  • 8. Copyright?2013 JPCERT/CC All rights reserved. サーバ証明書検証に関する情報 8 ■RFC5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile (http://tools.ietf.org/html/rfc5280) SSL証明書の検証内容として以下のような項目を挙げ、 検証に関するアルゴリズムを定義している。 (Section6. Certification Path Validation) 1.発行元の認証機関(CA)が信頼されているCAであることを確認する 2.現在の日付が有効期間内にあるかどうかを確認する 3.現時点において、証明書が失効していないことを確認する 4.発行元CAの公開キーにより、送信者のデジタル署名を検証する 5.サーバーの証明書のドメイン名がサーバー自体のドメイン名と一致 するかどうかを確認する この資料では、5. のドメイン名(ホスト名)を 検証する処理を中心に見ていく。 注意!!
  • 9. Copyright?2013 JPCERT/CC All rights reserved. サーバ証明書の記載内容 サーバ証明書には、以下のような情報が含まれる。 9 項目名 記載内容 CN サーバ名(ドメイン含む) www.jpcert.or.jp OU 運営団体の部署名 System Administration Group O 運営団体名 Japan Computer Emergency Response Team Coordination Center L 運営団体の所在(市区町村) Chiyoda-ku ST 運営団体の所在(都道府県) Tokyo C 運営団体の所在(国名) Japan —証明書の有効期間 —証明書を発行した証明機関(CA)のパス ※CNには1つのホストしか記述できないため、複数ホスト(バーチャルホス ト)運用を想定した拡張フィールド subjectAltName も用意されており、 CNフィールドよりも優先される。
  • 10. Copyright?2013 JPCERT/CC All rights reserved. 中間者による攻撃を予防するために、クライアントは、これをサーバーの 証明書メッセージ中に示されたサーバーの身元に照らしてチェックしなけ ればなりません(MUST)。 (中略) 証明書の Subject フィールドにある(最も具体的)な Common Name フィー ルドを使用しなければなりません(MUST)。 the client MUST check it against the server's identity as presented in the server's Certificate message, in order to prevent man-in-the-middle attacks. (中略) the (most specific) Common Name field in the Subject field of the certificate MUST be used. サーバ証明書の検証内容 10 RFC 2818 「HTTP Over TLS」 では以下のように記載されている。 English 日本語 RFC では「証明書のCN(またはsubjectAltName)の値」と 「ホスト名」の一致を検証することが必須、とされている。
  • 11. Copyright?2013 JPCERT/CC All rights reserved. 脆弱性が悪用された場合のリスク SSLサーバの成りすましが可能 それによりSSL通信の中間者攻撃(Man-In-The- Middle 攻撃)が可能 —SSL通信内容の傍受、改ざんが可能。 11
  • 12. Copyright?2013 JPCERT/CC All rights reserved. 脆弱性の悪用例(Man-In-The-Middle攻撃) クライアントを、本来接続するサーバとは異なる不正な サーバに接続させる 不正なサーバでは、クライアントに代わって正規のサー バと通信し、クライアントに対しては正規のサーバとし てふるまう 不正なサーバ上で通信情報の傍受や改ざんが可能となる 12 中継 偽サーバの サーバ証明書 本来接続したい 正規のサーバクライアント 不正なサーバ 情報の搾取?改ざん
  • 13. Copyright?2013 JPCERT/CC All rights reserved. HTTPSアクセス時の実行フロー 13 クライアント アプリケーション HttpClient SSLSocketFactory Java NativeHttpClient::executeMethod() SSLSocketFactory:: createSocket() 接続処理 サーバ証明書 SSL接続 SSLSocket オブジェクト 結果返却 呼出し 呼出し 接続結果 リクエスト送信 クライアントアプリケーションには接続後のリクエスト送信結果のみが返される。 ※サーバ証明書情報を含むSSLSocketオブジェクトは返されない 結果返却 結果返却 呼出し リクエスト送信 HTTPリクエスト サーバ クライアント 接続結果 サーバ証明書を含む SSLSocketオブジェクトを 受け取り、HttpClientクラス 内で管理する
  • 14. Copyright?2013 JPCERT/CC All rights reserved. ソースコード解説 14 ① クライアントアプリケーションがHttpClientライブラリの executeMethodメソッドを呼び出す。 ② executeMethodメソッドからjavax.net.ssl.SSLSocketFactory ク ラスのcreateSocketメソッドが呼び出され 、サーバとのSSL 接 続が確立する。 ③ HttpClientライブラリにコネクションオブジェクト(SSLSocketオ ブジェクト)が返却される。 ④ HttpClientがSSLSocketを使用してHTTPリクエストを送信する。 ⑤ サーバからHTTPレスポンスを受け取ってクライアントアプリ ケーションに返却する。
  • 15. Copyright?2013 JPCERT/CC All rights reserved. ①クライアントアプリケーションがHttpClientのexecuteMethodメ ソッドを呼び出す 15 public class SimpleClient { public static void main(String[] args) { try { HttpClient httpclient = new HttpClient(); GetMethod httpget = new GetMethod(“https://www.jpcert.or.jp/”); try { int statusCode = httpclient.executeMethod(httpget); if (statusCode != HttpStatus.SC_OK) { // Error handling here } byte[] response = httpget.getResponseBody(); } finally { httpget.releaseConnection(); } : SimpleClient.java 接続処理 HttpClient インスタンスを作成、Get メソッドパラメータを構成し executeMethodを呼び出す。
  • 16. Copyright?2013 JPCERT/CC All rights reserved. ② executeMethod内でSSLSocketFactoryクラスのcreateSocketメ ソッドが呼び出され、サーバとのSSL接続が確立する。 16 public class SSLProtocolSocketFactory implements SecureProtocolSocketFactory { : public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException { return SSLSocketFactory.getDefault().createSocket(host, port, clientHost, clientPort); } SSLProtocolSocketFactory.java public class HttpConnection { public void open() throws IOException { : this.socket = socketFactory.createSocket( host, port, localAddress, 0, this.params); } : HttpConnection.java (HttpClient.executeMethod >> HttpConnection.open) executeMethodから呼 び出される処理 CALL 接続処理 接続処理
  • 17. Copyright?2013 JPCERT/CC All rights reserved. ③HttpClientライブラリにコネクションオブジェクト(SSLSocketオブ ジェクト)が返却される。 17 public class HttpConnection { public void open() throws IOException { : this.socket = socketFactory.createSocket( host, port, localAddress, 0, this.params); } : } HttpConnection.java (HttpClient.executeMethod >> HttpConnection.open) HttpClientライブラリのHttpConnectionクラスの 内部に、SSLSocketオブジェクトを格納する。 public class SSLProtocolSocketFactory implements SecureProtocolSocketFactory { : public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException { return SSLSocketFactory.getDefault().createSocket(host, port, clientHost, clientPort); } SSLProtocolSocketFactory.java SSLSocketFactory::createSocketメソッドは SSLSocketオブジェクトを返却する Return
  • 18. Copyright?2013 JPCERT/CC All rights reserved. ④ HttpClientがSSLSocketを使用してHTTPリクエストを送信する。 18 private void executeWithRetry(final HttpMethod method) throws IOException, HttpException { : this.conn.open(); : applyConnectionParams(method); method.execute(state, this.conn); HttpMethodDirector.java (HttpClient.executeMethod > HttpMethodDirector.executeWithRetry) その後、HttpClientライブラリ内に保持したSSLSocket オブジェクトを利用してリクエスト送信が行われる。 リクエスト送信処理
  • 19. Copyright?2013 JPCERT/CC All rights reserved. ⑤ サーバからHTTPレスポンスを受け取りクライアントアプリケーショ ンに返却する。 19 public class SimpleClient { public static void main(String[] args) { try { HttpClient httpclient = new HttpClient(); GetMethod httpget = new GetMethod(“https://www.jpcert.or.jp/”); try { int statusCode = httpclient.executeMethod(httpget); if (statusCode != HttpStatus.SC_OK) { // Error handling here } byte[] response = httpget.getResponseBody(); } finally { httpget.releaseConnection(); } : SimpleClient.java executeMethodを呼び出した結果 (送信したリクエストに対するレス ポンス)をクライアントアプリケー ションに返却する レスポンス返却
  • 20. Copyright?2013 JPCERT/CC All rights reserved. 問題点とその対策 ? 今回のアプリケーションにおける具体的な問題点 前述の RFC 2818「HTTP Over TLS」に沿っていない! サーバへ接続後、SSLSocket がサーバ証明書を取得して いるが、その検証を一切行っていなかったため、サーバ名 (CNやsubjectAltName)が異なるサーバでも正常に繋がっ てしまった。 ? 問題点に対してどうすべきだったか サーバ証明書の検証を実施する。不正なサーバ証明書であ ることが判明したら、エラー状態として扱う。 20 (証明書の検証方法として、)証明書の Subject フィールドにある(最も具体的)な Common Name フィールドを使用しなければなりません(MUST) 。
  • 21. Copyright?2013 JPCERT/CC All rights reserved. HTTPSアクセス時の実行フローにおける問題点 21 クライアント アプリケーション HttpClient SSLSocketFactory Java NativeHttpClient::executeMethod() SSLSocketFactory:: createSocket() 接続処理 サーバ証明書 SSL接続 SSLSocket オブジェクト 結果返却 呼出し 呼出し 接続結果 リクエスト送信 結果返却 結果返却 呼出し リクエスト送信 HTTPリクエスト サーバ クライアント 接続結果 HttpClientはSSL接 続時にサーバ証明書 の検証を行っておら ず、サーバの正当性 を確認していない!! クライアントアプリケーションでは、 サーバ証明書情報を含むSSLSocketオ ブジェクトを受け取れないため、証明書 の検証はできない!!
  • 22. Copyright?2013 JPCERT/CC All rights reserved.22 「 ③HttpClientライブラリにコネクションオブジェクト(SSLSocket オブジェクト)が返却される。」のコードに問題がある。 public class SSLProtocolSocketFactory implements SecureProtocolSocketFactory { : public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException { return SSLSocketFactory.getDefault().createSocket(host, port, clientHost, clientPort); } SSLProtocolSocketFactory.java HTTPSアクセス時の実行フローにおける問題点 createSocket を呼び出した後、返却される Socket 型オブジェクトの 内容を全く検証せず呼び出し元に返却している。
  • 23. Copyright?2013 JPCERT/CC All rights reserved. サーバ接続時のフローに証明書検証処理 ③’ が追加された。 修正版コード 23 ① クライアントアプリケーションがサーバへの接続処理において HttpClientライブラリのexecuteMethodメソッドを呼び出す。 ② executeMethodメソッドからjavax.net.ssl.SSLSocketFactory クラスの createSocketメソッドが呼び出され、サーバとのSSL接続が確立する。 ③ HttpClientライブラリにコネクションオブジェクト(SSLSocketオブ ジェクト)が返却される。 ③’ SSLSocketオブジェクトに含まれるサーバ証明書を検証する ④ HttpClientがSSLSocketを使用してHTTPリクエストを送信する。 ⑤ サーバからHTTPレスポンスを受け取ってクライアントアプリケー ションに返却する。
  • 24. Copyright?2013 JPCERT/CC All rights reserved. ソケット情報から証明書情報を取得し、ホスト名検証 を行う。 修正版コード 24 ※ SSLException は IOException の派生クラス 返却されたソケット情報(SSLSocket)を sslSocket に格納し、ホスト 名を検証するメソッド verifyHostName() に渡すように修正。 ホスト名が一致しなかった場合は、SSLException がスローされ、接 続処理が異常終了するようになった。 接続処理 ホスト名検証処理 public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException { Socket sslSocket = SSLSocketFactory.getDefault().createSocket(host, port, clientHost, clientPort); verifyHostName(host, (SSLSocket) sslSocket); return sslSocket; } SSLProtocolSocketFactory.java
  • 25. Copyright?2013 JPCERT/CC All rights reserved. 補足:ホスト名検証処理 25 Certificate[] c erts = session.getPeerCertificates(); verifyHostName(host.trim().toLowerCase(Locale.US), (X509Certificate) certs[0]); SSLProtoclSocketFactory.java > verifyHostName(SSLSocket) 証明書配列取得 サーバの証明書での検証処理 String cn = getCN(cert); … verifyHostName (host, cn.toLowerCase(Locale.US), subjectAlts); SSLProtoclSocketFactory.java >…> verifyHostName(X509Certificate) CN名取得(cn) host と cn の検証処理 1)SSL接続されたセッション情報から証明書情報取得 証明書配列の取得 接続先サーバの署名を渡す [0] 2)証明書情報から CN(subjectAltName) エントリを取得し比較 ※ 2) で呼び出される verifyHostName 内にて、適切にワイルドカードが使われてい るCNも併せて解決され、接続しようとしているホスト(host)と証明書のCNレコー ド(cn)が一致するかチェックされる。
  • 26. Copyright?2013 JPCERT/CC All rights reserved. サーバ証明書検証に関する参考情報(1) 26 ■RFC5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile (http://tools.ietf.org/html/rfc5280) SSL証明書の検証内容として以下のような項目を挙げ、 検証に関するアルゴリズムを定義している。 (Section6. Certification Path Validation) 1.発行元の認証機関(CA)が信頼されているCAであることを確認する 2.現在の日付が有効期間内にあるかどうかを確認する 3.現時点において、証明書が失効していないことを確認する 4.発行元CAの公開キーにより、送信者のデジタル署名を検証する 5.サーバーの証明書のドメイン名がサーバー自体のドメイン名と一致 するかどうかを確認する (再掲)
  • 27. Copyright?2013 JPCERT/CC All rights reserved.27 ■Microsoft「SSL ハンドシェイクでのサーバー認証プロセスに関する説明」より http://support.microsoft.com/kb/257587/ja SSL を有効にしたクライアントでは、以下の手順を実行してサーバーの身元を認証します。 1. 現在の日付が有効期間内にあるかどうかを確認します。 2. 発行元の認証機関(CA)が信頼されている CA であることを確認します。 3. 発行元 CA の公開キーにより、送信者のデジタル署名を検証します。 4. サーバー証明書のドメイン名がサーバー自体のドメイン名と一致するかどうかを確認し ます。 ■Google「Browser Security Handbook」より http://code.google.com/p/browsersec/wiki/Part2 ここでは以下を不正な証明書として扱っている。 ? 信頼される機関によってサインされていない ? 期限切れ ? ドメイン名と合致しない (引用、原文そのまま) invalid certificates (not signed by a trusted entity, expired, not matching the current domain, or suffering from any other malady) サーバ証明書検証に関する参考情報(2)
  • 28. Copyright?2013 JPCERT/CC All rights reserved. CWE: Common Weakness Enumeration 28 ? CWE-295: Improper Certificate Validation ?全般的な話、証明書を正しく検証していない ? CWE-296: Improper Following of a Certificate's Chain of Trust ?証明書チェーンを正しく検証していない ?CWE-298: Improper Validation of Certificate Expiration ?期限が切れているかを正しく検証していない ?CWE-299: Improper Check for Certificate Revocation ?証明書が無効になっていないかを正しく検証していない http://cwe.mitre.org/
  • 29. Copyright?2013 JPCERT/CC All rights reserved. 著作権?引用や二次利用について 本資料の著作権はJPCERT/CCに帰属します。 本資料あるいはその一部を引用?転載?再配布する際は、引用元名、資料名および URL の明示を お願いします。 記載例 引用元:一般社団法人JPCERTコーディネーションセンター Java アプリケーション脆弱性事例解説資料 Apache Commons の HttpClient における SSL サーバ証明書検証不備 https://www.jpcert.or.jp/securecoding/2012/No.07_Apache_Commons.pdf 本資料を引用?転載?再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡 により取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポ リシー」に則って取り扱います。 本資料の利用方法等に関するお問い合わせ JPCERTコーディネーションセンター 広報担当 E-mail:office@jpcert.or.jp 本資料の技術的な内容に関するお問い合わせ JPCERTコーディネーションセンター セキュアコーディング担当 E-mail:secure-coding@jpcert.or.jp 29