SV.WEAK.TLS

不应使用弱 SSL/TLS 协议。

如果使用弱 TLS 协议(比如 1.0 或 1.1),Klocwork 会报告 SV.WEAK.TLS 缺陷。

漏洞与风险

安全专家普遍建议强制实施 TLS 1.2 作为最低协议版本;他们建议禁用较旧的版本,如 TLS 1.0 或 1.1。否则容易受到降级攻击,能够拦截连接的恶意行为者可能会修改请求的协议版本,并将其降级为不太安全的版本。

缓解与预防

应该使用更安全的协议,如 TLS 1.2 和更高版本。

漏洞代码示例 1

复制
import javax.net.ssl.*;
public class Test {
  public void test() throws Exception {
    SSLContext context = SSLContext.getInstance("TLSv1.1");
  }
}

Klocwork 在第 4 行报告了 SV.WEAK.TLS 缺陷,指出“建议强制实施 TLS 1.2 作为最低协议版本,并禁止使用 TLS 1.0/1.1 等旧版本,因为它们的安全性较低。”

修正代码示例 1

复制
import javax.net.ssl.*;
public class Test {
  public void test() throws Exception {
    SSLContext context = SSLContext.getInstance("TLSv1.2");
  }
}

Klocwork 不再报告缺陷,因为使用了 TLS 1.2。

漏洞代码示例 2

复制
import javax.net.ssl.*;
public class Test {
  public void test() {
    SSLSocket socket = null;
            try {
            SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            socket = (SSLSocket) factory.createSocket("abc.com", 443);
            socket.setEnabledProtocols(new String[] {"TLSv1.0"});
            socket.startHandshake();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                socket.close();
            }
        }
  }
}

Klocwork 在第 7 行报告了 SV.WEAK.TLS 缺陷,指出“建议强制实施 TLS 1.2 作为最低协议版本,并禁止使用 TLS 1.0/1.1 等旧版本,因为它们的安全性较低。”

修正代码示例 2

复制
import javax.net.ssl.*;
public class Test {
  public void test() {
    SSLSocket socket = null;
            try {
            SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            socket = (SSLSocket) factory.createSocket("abc.com", 443);
            socket.setEnabledProtocols(new String[] {"TLSv1.2"});
            socket.startHandshake();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                socket.close();
            }
        }
  }
}

Klocwork 不再报告缺陷,因为使用了 TLS 1.2。

漏洞代码示例 3

复制
import javax.net.ssl.*;
public class Test {
  public void test() {
        SSLServerSocket serverSocket = null;
           try {
           SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
           serverSocket = (SSLServerSocket) factory.createServerSocket(8980);
           SSLParameters params = new SSLParameters();
           params.setProtocols(new String[] {"TLSv1.1"});
           serverSocket.setSSLParameters(params);
           SSLSocket sslSocket = (SSLSocket) serverSocket.accept();       
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (serverSocket != null) {
                serverSocket.close();
            }
        }
  }
}

Klocwork 在第 9 行报告了 SV.WEAK.TLS 缺陷,指出“建议强制实施 TLS 1.2 作为最低协议版本,并禁止使用 TLS 1.0/1.1 等旧版本,因为它们的安全性较低。”

修正代码示例 3

复制
import javax.net.ssl.*;
public class Test {
  public void test() {
        SSLServerSocket serverSocket = null;
           try {
           SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
           serverSocket = (SSLServerSocket) factory.createServerSocket(8980);
           SSLParameters params = new SSLParameters();
           params.setProtocols(new String[] {"TLSv1.3"});
           serverSocket.setSSLParameters(params);
           SSLSocket sslSocket = (SSLSocket) serverSocket.accept();       
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (serverSocket != null) {
                serverSocket.close();
            }
        }
  }
}

Klocwork 不再报告缺陷,因为使用了 TLS 1.3。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。