SV.WEAK.TLS

脆弱な SSL/TLS プロトコルは使用しないでください。

Klocwork は、1.0 や 1.1 などの脆弱な TLS プロトコルが使用されている場合、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 行目で「プロトコルバージョンとして TLS 1.2 以上の使用を徹底させ、TLS 1.0/1.1 などの古いバージョンは安全性が低いため許可しないことを推奨しています」という、SV.WEAK.TLS 欠陥を報告します。

修正コード例 1

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

TLS 1.2 が使用されているため、Klocwork は欠陥を報告しなくなります。

脆弱コード例 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 行目で「プロトコルバージョンとして TLS 1.2 以上の使用を徹底させ、TLS 1.0/1.1 などの古いバージョンは安全性が低いため許可しないことを推奨しています」という、SV.WEAK.TLS 欠陥を報告します。

修正コード例 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();
            }
        }
  }
}

TLS 1.2 が使用されているため、Klocwork は欠陥を報告しなくなります。

脆弱なコード例 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 行目で「プロトコルバージョンとして TLS 1.2 以上を徹底させ、TLS 1.0/1.1 などの古いバージョンは安全性が低いため許可しないことを推奨しています」という、SV.WEAK.TLS 欠陥を報告します。

修正コード例 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();
            }
        }
  }
}

TLS 1.3 が使用されているため、Klocwork は欠陥を報告しなくなります。