Usertags: origin-ubuntu intrepid ubuntu-patch Attached is a patch that Ubuntu plans to use to address this bug. Please note that you will need to adjust the depends on openssl-blacklist to (>> 0.4). This version was just uploaded today.
This is also: https://bugs.launchpad.net/ubuntu/+source/openvpn/+bug/230197 Jamie Strandboge
diff -u openvpn-2.1~rc7/init.c openvpn-2.1~rc7/init.c --- openvpn-2.1~rc7/init.c +++ openvpn-2.1~rc7/init.c @@ -1430,6 +1430,7 @@ do_init_crypto_tls_c1 (struct context *c) { const struct options *options = &c->options; + SSL *ssl; if (!c->c1.ks.ssl_ctx) { @@ -1466,6 +1467,59 @@ options->ciphername_defined, options->authname, options->authname_defined, options->keysize, true, true); + /* CVE-2008-0166 (Debian weak key checks) + * Obtain the modulus and bits from the certificate that was initialized, + * and send that to openssl-vulnkey. + */ + ssl = SSL_new(c->c1.ks.ssl_ctx); + if (ssl != NULL) + { + X509* cert = NULL; + char *bn; + int bits; + + cert = SSL_get_certificate(ssl); + if (cert != NULL) + { + EVP_PKEY *pkey = X509_get_pubkey (cert); + if (pkey != NULL) + { + if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL + && pkey->pkey.rsa->n != NULL) + { + bits = BN_num_bits(pkey->pkey.rsa->n); + bn = BN_bn2hex(pkey->pkey.rsa->n); + } + else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL + && pkey->pkey.dsa->p != NULL) + { + bits = BN_num_bits(pkey->pkey.dsa->p); + bn = BN_bn2hex(pkey->pkey.dsa->p); + } + if (bn != NULL) + { + int size = strlen(bn) + 256; + char *command_line = NULL; + + command_line = malloc(size); + check_malloc_return(command_line); + + openvpn_snprintf(command_line, size, "/usr/bin/openssl-vulnkey -q -b %d -m %s", bits, bn); + msg (M_INFO, "/usr/bin/openssl-vulnkey -q -b %d -m <modulus omitted>", bits); + if (openvpn_system (command_line, NULL, S_FATAL) != 0) + { + msg (M_FATAL, "ERROR: '%s' is a known vulnerable key. See 'man openssl-vulnkey' for details.", options->priv_key_file); + } + + OPENSSL_free(bn); + free(command_line); + } + EVP_PKEY_free (pkey); + } + } + SSL_free(ssl); + } + /* TLS handshake authentication (--tls-auth) */ if (options->tls_auth_file) { @@ -1506,25 +1560,10 @@ const struct options *options = &c->options; struct tls_options to; bool packet_id_long_form; - char command_line[256]; ASSERT (options->tls_server || options->tls_client); ASSERT (!options->test_crypto); - /* CVE-2008-0166 (Debian weak key checks) */ - /* Only check if we can actually read the key file. This will fail if we - * already chroot()ed/set[ug]id()'ed. An ENOENT at program start is already - * handled further down, so we can ignore it here. */ - if (options->priv_key_file && access (options->priv_key_file, R_OK) == 0) - { - openvpn_snprintf(command_line, sizeof (command_line), "/usr/sbin/openssl-vulnkey -q %s", options->priv_key_file); - msg (M_INFO, "%s", command_line); - if (openvpn_system (command_line, NULL, S_FATAL) != 0) - { - msg (M_FATAL, "ERROR: '%s' is a known vulnerable key. See 'man openssl-vulnkey' for details.", options->priv_key_file); - } - } - init_crypto_pre (c, flags); /* Make sure we are either a TLS client or server but not both */
signature.asc
Description: Digital signature