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 缺陷。