[gnutls-devel] SSL certificate validation bugs in GnuTLS
Suman Jana
suman at cs.utexas.edu
Tue Feb 11 11:35:19 CET 2014
Hi,
We are computer security researchers at UT Austin and UC Davis,
currently testing
several SSL/TLS implementations as part of a research project. When
testing GnuTLS,
we discovered the following security issues related to SSL/TLS
certificate validation.
Some of them may be deliberate violations of the X.509 standard, others
appear to be
bugs. As far as we know, none of them is documented.
Please let us know how you intend to address these issues. The paper
describing the
results of our analysis will appear in the 2014 IEEE Symposium on
Security and Privacy
(“Oakland”), and we would like to include a report on the current status
of all issues
we discovered.
1. v1 CA certificates should be rejected by default unless validated by
external means but
GnuTLS accepts it.
In GnuTLS, the GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT is set by default. So,
in default
settings, GnuTLS should accept only root v1 CAs but it accepts all v1 ca
certs instead of
only v1 root CA certs due to a bug in lib/x509/verify.c as described below.
unsigned int _gnutls_x509_verify_certificate(...) {
...
/* verify the certificate path (chain) */
for (i = clist_size - 1; i > 0; i--)
{
/* note that here we disable this V1 CA flag. So that no version 1
* certificates can exist in a supplied chain.
*/
if (!(flags & GNUTLS_VERIFY_ALLOW_ANY_X509_V1_CA_CRT))
flags &= ˜(GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
if ((ret = _gnutls_verify_certificate2 (...)) ==0) {
/* return error */
}
}
...
}
int _gnutls_verify_certificate2(...)
{
...
if (!(flags & GNUTLS_VERIFY_DISABLE_CA_SIGN) &&
((flags & GNUTLS_VERIFY_DO_NOT_ALLOW_X509_V1_CA_CRT)
|| issuer_version != 1))
{
if (check_if_ca (cert, issuer, flags) == 0)
{
/*return error*/
...
}
}
/*perform other checks*/
...
}
As shown in the code above, after a root v1 certificate has been
accepted, to prevent
any further v1 certificates from being accepted, GnuTLS clears the
GNUTLS_VERIFY_ALLOW
_X509_V1_CA_CRT flag before calling _gnutls_verify_certificate2. However,
the _gnutls_
verify_certificate2 function accepts v1 certificates unless a different
flag, GNUTLS_VERIFY_
DO_NOT_ALLOW_X509_V1_CA_CRT is set. But the caller
(_gnutls_x509_verify_certificate)
never sets that flag.
2. Path length constraints in CA certs should be enforced. GnuTLS
ignores Path length constraints.
3. Name constraints in CA certs should be enforced. GnuTLS ignores name
constraints.
4. keyUsage and extendedKeyUsage extensions in CA and leaf certificates
should be checked
correctly. GnuTLS does not check any of them.
5. Certificate validation must fail if unknown critical extensions are
present in the certificate
but GnuTLS accepts certificates with unknown critical extensions.
Thanks,
Suman
More information about the Gnutls-devel
mailing list