[Python-modules-commits] r27186 - in packages/pyopenssl/trunk/debian (3 files)

morph at users.alioth.debian.org morph at users.alioth.debian.org
Sun Jan 12 17:36:04 UTC 2014


    Date: Sunday, January 12, 2014 @ 17:36:03
  Author: morph
Revision: 27186

Acknowledge NMU; thanks Salvatore Bonaccorso; Closes: #722055

Added:
  packages/pyopenssl/trunk/debian/patches/CVE-2013-4314.patch
Modified:
  packages/pyopenssl/trunk/debian/changelog
  packages/pyopenssl/trunk/debian/patches/series

Modified: packages/pyopenssl/trunk/debian/changelog
===================================================================
--- packages/pyopenssl/trunk/debian/changelog	2014-01-12 14:28:19 UTC (rev 27185)
+++ packages/pyopenssl/trunk/debian/changelog	2014-01-12 17:36:03 UTC (rev 27186)
@@ -1,9 +1,22 @@
 pyopenssl (0.13-4) UNRELEASED; urgency=low
 
+  [ Jakub Wilk ]
   * Use canonical URIs for Vcs-* fields.
+ 
+  [ Sandro Tosi ]
+  * Acknowledge NMU; thanks Salvatore Bonaccorso; Closes: #722055
 
- -- Jakub Wilk <jwilk at debian.org>  Sun, 05 May 2013 16:01:54 +0200
+ -- Sandro Tosi <morph at debian.org>  Sun, 12 Jan 2014 18:34:23 +0100
 
+pyopenssl (0.13-3.1) experimental; urgency=low
+
+  * Non-maintainer upload.
+  * Add CVE-2013-4314.patch patch.
+    CVE-2013-4314: Fix hostname check bypassing vulnerability with server
+    certificates that have a null byte in the subjectAltName. (Closes: #722055)
+
+ -- Salvatore Bonaccorso <carnil at debian.org>  Sun, 15 Sep 2013 16:59:07 +0200
+
 pyopenssl (0.13-3) experimental; urgency=low
 
   * debian/{control, rules}

Added: packages/pyopenssl/trunk/debian/patches/CVE-2013-4314.patch
===================================================================
--- packages/pyopenssl/trunk/debian/patches/CVE-2013-4314.patch	                        (rev 0)
+++ packages/pyopenssl/trunk/debian/patches/CVE-2013-4314.patch	2014-01-12 17:36:03 UTC (rev 27186)
@@ -0,0 +1,222 @@
+Description: Fix hostname check bypassing vulnerability
+ Fix handling of NULL bytes inside subjectAltName general names when
+ formatting an X509 extension as a string.
+ .
+ When a CA than an SSL client trusts issues a server certificate that
+ has a null byte in the subjectAltName, remote attackers can obtain a
+ certifcate for 'www.foo.org\0.example.com' from the CA to spoof
+ 'www.foo.org' and conduct man-in-the-middle attacks between the
+ pyOpenSSL-using client and SSL servers.
+ .
+ Additionally fix memory leak in get_extension().
+Origin: upstream, http://bazaar.launchpad.net/~exarkun/pyopenssl/trunk/revision/169
+Bug-Debian: http://bugs.debian.org/722055
+Bug-RedHat: https://bugzilla.redhat.com/show_bug.cgi?id=1005325
+Forwarded: not-needed
+Author: Salvatore Bonaccorso <carnil at debian.org>
+Last-Update: 2013-09-14
+Applied-Upstream: 0.13.1
+
+--- a/OpenSSL/crypto/x509.c
++++ b/OpenSSL/crypto/x509.c
+@@ -756,6 +756,7 @@
+ 
+     extobj = PyObject_New(crypto_X509ExtensionObj, &crypto_X509Extension_Type);
+     extobj->x509_extension = X509_EXTENSION_dup(ext);
++    extobj->dealloc = 1;
+ 
+     return (PyObject*)extobj;
+ }
+--- a/OpenSSL/crypto/x509ext.c
++++ b/OpenSSL/crypto/x509ext.c
+@@ -236,19 +236,92 @@
+     PyObject_Del(self);
+ }
+ 
++
++/* Special handling of subjectAltName.  OpenSSL's builtin formatter,
++ * X509V3_EXT_print, mishandles NUL bytes allowing a truncated display that
++ * does not accurately reflect what's in the extension.
++ */
++int
++crypto_X509Extension_str_subjectAltName(crypto_X509ExtensionObj *self, BIO *bio) {
++    GENERAL_NAMES *names;
++    const X509V3_EXT_METHOD *method = NULL;
++    long i, length, num;
++    const unsigned char *p;
++
++    method = X509V3_EXT_get(self->x509_extension);
++    if (method == NULL) {
++        return -1;
++    }
++
++    p = self->x509_extension->value->data;
++    length = self->x509_extension->value->length;
++    if (method->it) {
++        names = (GENERAL_NAMES*)(ASN1_item_d2i(NULL, &p, length,
++                                               ASN1_ITEM_ptr(method->it)));
++    } else {
++        names = (GENERAL_NAMES*)(method->d2i(NULL, &p, length));
++    }
++    if (names == NULL) {
++        return -1;
++    }
++
++    num = sk_GENERAL_NAME_num(names);
++    for (i = 0; i < num; i++) {
++        GENERAL_NAME *name;
++        ASN1_STRING *as;
++        name = sk_GENERAL_NAME_value(names, i);
++        switch (name->type) {
++            case GEN_EMAIL:
++                BIO_puts(bio, "email:");
++                as = name->d.rfc822Name;
++                BIO_write(bio, ASN1_STRING_data(as),
++                          ASN1_STRING_length(as));
++                break;
++            case GEN_DNS:
++                BIO_puts(bio, "DNS:");
++                as = name->d.dNSName;
++                BIO_write(bio, ASN1_STRING_data(as),
++                          ASN1_STRING_length(as));
++                break;
++            case GEN_URI:
++                BIO_puts(bio, "URI:");
++                as = name->d.uniformResourceIdentifier;
++                BIO_write(bio, ASN1_STRING_data(as),
++                          ASN1_STRING_length(as));
++                break;
++            default:
++                /* use builtin print for GEN_OTHERNAME, GEN_X400,
++                 * GEN_EDIPARTY, GEN_DIRNAME, GEN_IPADD and GEN_RID
++                 */
++                GENERAL_NAME_print(bio, name);
++        }
++        /* trailing ', ' except for last element */
++        if (i < (num - 1)) {
++            BIO_puts(bio, ", ");
++        }
++    }
++    sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
++
++    return 0;
++}
++
+ /*
+  * Print a nice text representation of the certificate request.
+  */
+ static PyObject *
+-crypto_X509Extension_str(crypto_X509ExtensionObj *self)
+-{
++crypto_X509Extension_str(crypto_X509ExtensionObj *self) {
+     int str_len;
+     char *tmp_str;
+     PyObject *str;
+     BIO *bio = BIO_new(BIO_s_mem());
+ 
+-    if (!X509V3_EXT_print(bio, self->x509_extension, 0, 0))
+-    {
++    if (OBJ_obj2nid(self->x509_extension->object) == NID_subject_alt_name) {
++        if (crypto_X509Extension_str_subjectAltName(self, bio) == -1) {
++            BIO_free(bio);
++            exception_from_error_queue(crypto_Error);
++            return NULL;
++        }
++    } else if (!X509V3_EXT_print(bio, self->x509_extension, 0, 0)) {
+         BIO_free(bio);
+         exception_from_error_queue(crypto_Error);
+         return NULL;
+@@ -267,7 +340,7 @@
+     "X509Extension",
+     sizeof(crypto_X509ExtensionObj),
+     0,
+-    (destructor)crypto_X509Extension_dealloc, 
++    (destructor)crypto_X509Extension_dealloc,
+     NULL, /* print */
+     NULL, /* getattr */
+     NULL, /* setattr  (setattrfunc)crypto_X509Name_setattr, */
+--- a/OpenSSL/test/test_crypto.py
++++ b/OpenSSL/test/test_crypto.py
+@@ -265,6 +265,37 @@
+ -----END RSA PRIVATE KEY-----
+ """)
+ 
++# certificate with NULL bytes in subjectAltName and common name
++
++nulbyteSubjectAltNamePEM = b("""-----BEGIN CERTIFICATE-----
++MIIE2DCCA8CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBxTELMAkGA1UEBhMCVVMx
++DzANBgNVBAgMBk9yZWdvbjESMBAGA1UEBwwJQmVhdmVydG9uMSMwIQYDVQQKDBpQ
++eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjEgMB4GA1UECwwXUHl0aG9uIENvcmUg
++RGV2ZWxvcG1lbnQxJDAiBgNVBAMMG251bGwucHl0aG9uLm9yZwBleGFtcGxlLm9y
++ZzEkMCIGCSqGSIb3DQEJARYVcHl0aG9uLWRldkBweXRob24ub3JnMB4XDTEzMDgw
++NzEzMTE1MloXDTEzMDgwNzEzMTI1MlowgcUxCzAJBgNVBAYTAlVTMQ8wDQYDVQQI
++DAZPcmVnb24xEjAQBgNVBAcMCUJlYXZlcnRvbjEjMCEGA1UECgwaUHl0aG9uIFNv
++ZnR3YXJlIEZvdW5kYXRpb24xIDAeBgNVBAsMF1B5dGhvbiBDb3JlIERldmVsb3Bt
++ZW50MSQwIgYDVQQDDBtudWxsLnB5dGhvbi5vcmcAZXhhbXBsZS5vcmcxJDAiBgkq
++hkiG9w0BCQEWFXB5dGhvbi1kZXZAcHl0aG9uLm9yZzCCASIwDQYJKoZIhvcNAQEB
++BQADggEPADCCAQoCggEBALXq7cn7Rn1vO3aA3TrzA5QLp6bb7B3f/yN0CJ2XFj+j
++pHs+Gw6WWSUDpybiiKnPec33BFawq3kyblnBMjBU61ioy5HwQqVkJ8vUVjGIUq3P
++vX/wBmQfzCe4o4uM89gpHyUL9UYGG8oCRa17dgqcv7u5rg0Wq2B1rgY+nHwx3JIv
++KRrgSwyRkGzpN8WQ1yrXlxWjgI9de0mPVDDUlywcWze1q2kwaEPTM3hLAmD1PESA
++oY/n8A/RXoeeRs9i/Pm/DGUS8ZPINXk/yOzsR/XvvkTVroIeLZqfmFpnZeF0cHzL
++08LODkVJJ9zjLdT7SA4vnne4FEbAxDbKAq5qkYzaL4UCAwEAAaOB0DCBzTAMBgNV
++HRMBAf8EAjAAMB0GA1UdDgQWBBSIWlXAUv9hzVKjNQ/qWpwkOCL3XDALBgNVHQ8E
++BAMCBeAwgZAGA1UdEQSBiDCBhYIeYWx0bnVsbC5weXRob24ub3JnAGV4YW1wbGUu
++Y29tgSBudWxsQHB5dGhvbi5vcmcAdXNlckBleGFtcGxlLm9yZ4YpaHR0cDovL251
++bGwucHl0aG9uLm9yZwBodHRwOi8vZXhhbXBsZS5vcmeHBMAAAgGHECABDbgAAAAA
++AAAAAAAAAAEwDQYJKoZIhvcNAQEFBQADggEBAKxPRe99SaghcI6IWT7UNkJw9aO9
++i9eo0Fj2MUqxpKbdb9noRDy2CnHWf7EIYZ1gznXPdwzSN4YCjV5d+Q9xtBaowT0j
++HPERs1ZuytCNNJTmhyqZ8q6uzMLoht4IqH/FBfpvgaeC5tBTnTT0rD5A/olXeimk
++kX4LxlEx5RAvpGB2zZVRGr6LobD9rVK91xuHYNIxxxfEGE8tCCWjp0+3ksri9SXx
++VHWBnbM9YaL32u3hxm8sYB/Yb8WSBavJCWJJqRStVRHM1koZlJmXNx2BX4vPo6iW
++RFEIPQsFZRLrtnCAiEhyT8bC2s/Njlu6ly9gtJZWSV46Q3ZjBL4q9sHKqZQ=
++-----END CERTIFICATE-----""")
++
+ 
+ class X509ExtTests(TestCase):
+     """
+@@ -856,6 +887,19 @@
+             [(b("CN"), b("foo")), (b("OU"), b("bar"))])
+ 
+ 
++    def test_load_nul_byte_attribute(self):
++        """
++        An :py:class:`OpenSSL.crypto.X509Name` from an
++        :py:class:`OpenSSL.crypto.X509` instance loaded from a file can have a
++        NUL byte in the value of one of its attributes.
++        """
++        cert = load_certificate(FILETYPE_PEM, nulbyteSubjectAltNamePEM)
++        subject = cert.get_subject()
++        self.assertEqual(
++            "null.python.org\x00example.org", subject.commonName)
++
++
++
+ class _PKeyInteractionTestsMixin:
+     """
+     Tests which involve another thing and a PKey.
+@@ -1382,6 +1426,24 @@
+         self.assertRaises(TypeError, cert.get_extension, "hello")
+ 
+ 
++    def test_nullbyte_subjectAltName(self):
++        """
++        The fields of a `subjectAltName` extension on an X509 may contain NUL
++        bytes and this value is reflected in the string representation of the
++        extension object.
++        """
++        cert = load_certificate(FILETYPE_PEM, nulbyteSubjectAltNamePEM)
++
++        ext = cert.get_extension(3)
++        self.assertEqual(ext.get_short_name(), b('subjectAltName'))
++        self.assertEqual(
++            b("DNS:altnull.python.org\x00example.com, "
++              "email:null at python.org\x00user at example.org, "
++              "URI:http://null.python.org\x00http://example.org, "
++              "IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1\n"),
++            b(str(ext)))
++
++
+     def test_invalid_digest_algorithm(self):
+         """
+         L{X509.digest} raises L{ValueError} if called with an unrecognized hash

Modified: packages/pyopenssl/trunk/debian/patches/series
===================================================================
--- packages/pyopenssl/trunk/debian/patches/series	2014-01-12 14:28:19 UTC (rev 27185)
+++ packages/pyopenssl/trunk/debian/patches/series	2014-01-12 17:36:03 UTC (rev 27186)
@@ -1,2 +1,3 @@
 10_fix_doc_buildsystem.patch
 disable_test_set_default_verify_paths.patch
+CVE-2013-4314.patch




More information about the Python-modules-commits mailing list