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" として指定し、正しいホスト名を指定すると、指摘が報告されなくなります。