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 は欠陥を報告しなくなります。
外部参考資料
- CERT MSC00-J: 安全なデータ交換のために Socket ではなく SSLSocket を使用する
- CWE-326: 不十分な暗号化強度
- CWE-327: 破られたまたは危険な暗号化アルゴリズムの使用
- OWASP A3:2017 機密データの漏えい
- OWASP A6:2017 不適切なセキュリティ設定
- OWASP A2:2021 暗号化の失敗
- OWASP A7:2021 識別と認証の失敗
- V-222555 (APSC-DV-001860): アプリケーションは、暗号化モジュールに適用できる、連邦法、大統領令、指令、ポリシー、規制、標準、および認証に関するガイダンスの要件を満たすメカニズムを使用する必要があります。
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。