SV.ECV.TRUSTMANAGER

接口 X509TrustManager 的不安全实现

当 X509TrustManager 的实现不对证书的有效性进行控制(即不会引发异常)时,Klocwork 会报告 SV.ECV.TRUSTMANAGER 缺陷。

漏洞与风险

通常借由创建 X509TrustManager 接口的空实现来禁用证书验证,这反过来会使代码容易受到中间人攻击。

缓解与预防

验证 X.509 证书对于创建不容易受到中间人攻击的安全 SSL/TLS 会话至关重要。

通过使用证书链验证,提供适当的信任存储区。证书链验证包含以下条件:

  • 证书的颁发者必须是其父证书颁发机构或受系统信任的根 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 缺陷。