SV.ECV.TRUSTMANAGER
X509TrustManager インターフェイスの実装が安全ではありません
X509TrustManager の実装によって証明書の有効性が制御されない (つまり、例外が呼び出されない) 場合、Klocwork は SV.ECV.TRUSTMANAGER 欠陥を報告します。
脆弱性とリスク
X509TrustManager インターフェイスの空の実装は、多くの場合、証明書の検証を無効にするために使用され、中間者攻撃に対するコードの脆弱性をもたらします。
軽減と防止
X.509 証明書の検証は、中間者攻撃に対する脆弱性がないセキュアな SSL/TLS セッションを作成するために不可欠です。
証明書チェーンの検証を使用することで、適切なトラストストアを提供してください。証明書チェーンの検証には、次の条件が含まれます。
-
証明書が、その親の証明機関 (CA)、またはシステムで信頼されているルート 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 欠陥を報告しません。
外部参考資料
- CWE-295: 不適切な証明書検証
- OWASP A6:2017 不適切なセキュリティ設定
- OWASP A2:2021 暗号化の失敗
- OWASP A5:2021 セキュリティ構成エラー
- OWASP A7:2021 識別と認証の失敗
- V-222550 (APSC-DV-001810): アプリケーションは、PKI ベースの認証を利用するときに、受理されたトラストアンカーへの証明書パス (ステータス情報を含む) を構築することで、証明書を検証する必要がある
- V-222555 (APSC-DV-001860): アプリケーションは、暗号化モジュールに適用できる、連邦法、大統領令、指令、ポリシー、規制、標準、および認証に関するガイダンスの要件を満たすメカニズムを使用する必要があります。
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。