SV.ECV
このチェッカーは、空の SSL 証明書検証のケースを検出します。
SV.ECVの欠陥は、org.apache.http.conn.ssl.X509HostnameVerifier インターフェースの「検証」方法を自明に実装しているクラスで報告されています。
脆弱性とリスク
証明書検証が空の場合は、すべての SSL 証明書が有効であるとみなされます。これは中間者攻撃の余地を与えることになり、侵入者が保護データにアクセスできるようになります。
軽減と防止
この指摘を防ぐため、X509HostnameVerifier インターフェイスを実装するクラスの “verify” メソッドで実際に検証を実行しなければなりません。証明書検証が空であったり、単一の return ステートメントから構成されるものであってはなりません。証明書のホスト名ごとのデータがサーバーのホスト名と一致することが確認されるように、HostnameVerifier.verify()
が適切にオーバーライドされるようにすることをお勧めします。
脆弱コード例
コピー
private static X509HostnameVerifier ACCEPT_ALL_HOSTNAMES =
new X509HostnameVerifier() {
public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {
}
public void verify(String host, X509Certificate cert) throws SSLException {
}
public void verify(String host, SSLSocket ssl) throws IOException {
}
public boolean verify(String host, SSLSession session) {
return true;
}
};
この例では、すべてのホスト名を受け入れるように X509HostnameVerifier が設定されています。
脆弱コード例 2
コピー
import javax.net.ssl.*;
import java.security.cert.*;
class Host {
private static void disableSSLVerification(HttpsURLConnection connection) {
connection.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
}
}
Klocwork が 8 行目で SV.ECV 欠陥を報告し、「メソッドの検証で何も実行されません」と通知します。
修正コード例 2
コピー
import javax.net.ssl.*;
import java.security.cert.*;
class Host {
private static void retrieve() {
HttpsURLConnection uc = (HttpsURLConnection) u.openConnection();
uc.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
boolean valid = false;
try {
String expectedHostname = hostname.toLowerCase();
//...
} catch (Exception ex) {
}
}
});
}
}
HostnameVerifier.verify()
を "false" として指定し、正しいホスト名を指定すると、指摘が報告されなくなります。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。