SV.ECV.TRUSTMANAGER

X509TrustManager インターフェイスの実装が安全ではありません

X509TrustManager の実装によって証明書の有効性が制御されない (つまり、例外が呼び出されない) 場合、Klocwork は SV.ECV.TRUSTMANAGER 欠陥を報告します。

脆弱性とリスク

X509TrustManager インターフェイスの空の実装は、多くの場合、証明書の検証を無効にするために使用され、中間者攻撃に対するコードの脆弱性をもたらします。

軽減と防止

X.509 証明書の検証は、中間者攻撃に対する脆弱性がないセキュアな SSL/TLS セッションを作成するために不可欠です。

証明書チェーンの検証を使用することで、適切なトラストストアを提供してください。証明書チェーンの検証には、次の条件が含まれます。

  • 証明書が、その親の証明機関 (CA)、またはシステムで信頼されているルート CA によって発行されている。

  • 各証明機関が証明書の発行を許可されている。

  • チェーン内の各証明書が期限切れになっていない。

脆弱コード例

コピー
import javax.net.ssl.*;
import java.security.cert.*;
 
import javax.net.ssl.*;
import java.security.cert.*;
 
class TrustAll implements X509TrustManager {
 
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {  // Noncompliant, nothing means trust any client
    }
 
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException { // Noncompliant
        System.out.println("error message");
    }
 
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

Klocwork が 8 行目で SV.ECV.TRUSTMANAGER 欠陥を報告し、「メソッド '{0}' で何も実行されません」と通知します。クラスでオーバーライドされる checkServerTrusted メソッドで、サーバーが提示した証明書が有効ではない場合は必ず CertificateException と IllegalArgumentException のどちらかが呼び出されるかどうか確認してください。

修正コード例

コピー
import javax.net.ssl.*;
import java.security.cert.*;
 
class TrustAllManager implements X509TrustManager {
    private X509TrustManager standardTrustManager = null;
 
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        throw CertificateException();
    }
 
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        if ((chain != null) && (chain.length == 1)) {
            chain[0].checkValidity();
        } else {
            System.out.print("");
        }
    }
 
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        X509Certificate[] certs = this.standardTrustManager.getAcceptedIssuers();
        return certs;
    }
}

この訂正例では、Klocwork は SV.ECV.TRUSTMANAGER 欠陥を報告しません。