SV.CERT.INVALID
証明書は、証明書パスを構築することで、検証する必要があります。
X509 証明書が検証されずに、Trust Anchors を使用することで生成された場合、Klocwork は SV.CERT.INVALID 欠陥を報告します。
脆弱性とリスク
情報に基づく信頼の決定には、パス検証が必要です。証明書が提示されたときに、パス検証がなければ、提示された側はその証明書を信頼できません。
トラストアンカーは、公開鍵とそれに関連するデータを介して示される信頼できるエンティティです。トラストアンカーは、公開鍵のインフラストラクチャ、X.509 デジタル証明書、および DNSSEC のコンテキストで使用されます。一般に、信頼チェーンがある場合、信頼される最上位のエンティティがトラスアンカーになります。
たとえば、証明機関 (CA) はトラストアンカーになる可能性があります。証明書パスは、サブジェクト証明書から始まり、いくつかの中間証明書を経て、(通常は信頼できる CA が発行する) 信頼できるルート証明書に達します。
軽減と防止
証明書パスを構築することで証明書が検証される必要があるという要件により、受理されたトラストアンカーへの証明書パスが証明書の検証のために使用されること、また証明書パスにステータス情報が含まれていることが保証されます。証明書パスのステータス情報には、証明書失効リストまたはオンライン証明書ステータスプロトコル応答が含まれます。
脆弱コード例
import java.security.cert.*;
import java.io.*;
public class Test {
public static void generateClientCertificate(final byte[] certEncoded) throws CertificateException{
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate x509Cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(certEncoded));
}
}
Klocwork は、6 行目で「PKI ベースの認証を利用するときに、アプリケーションは、証明書パスを構築することで、証明書を検証する必要があります」という、SV.IL.SESSION.CLIENT 欠陥を報告します。
修正コード例 1
import java.security.cert.*;
public class Test {
public static void validatePath(List<X509Certificate> certs, Set<TrustAnchor> trustAnchors) throws GeneralSecurityException {
CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
PKIXParameters params = new PKIXParameters(trustAnchors);
params.setRevocationEnabled(false);
CertificateFactory cf = CertificateFactory.getInstance("X509");
CertPath path = cf.generateCertPath(certs);
PKIXCertPathValidatorResult pkixResult = (PKIXCertPathValidatorResult) cpv.validate(path, params);
TrustAnchor ta = pkixResult.getTrustAnchor();
X509Certificate cert = ta.getTrustedCert();
}
}
検証後に Trust Anchor を使用することで証明書が生成されるため、Klockwork は欠陥を報告しなくなります。