]> git.pld-linux.org Git - packages/php.git/blame - CVE-2013-4073.patch
- make it possible to coinstall phpXY-pdo-pgsql
[packages/php.git] / CVE-2013-4073.patch
CommitLineData
b16376f6
ER
1From: Stanislav Malyshev <stas@php.net>
2Date: Wed, 14 Aug 2013 05:20:33 +0000 (-0700)
3Subject: Fix CVE-2013-4073 - handling of certs with null bytes
4X-Git-Tag: php-5.3.28~3
5X-Git-Url: http://git.php.net/?p=php-src.git;a=commitdiff;h=dcea4ec698dcae39b7bba6f6aa08933cbfee6755
6
7Fix CVE-2013-4073 - handling of certs with null bytes
8---
9
10- Openssl:
11 . Fixed handling null bytes in subjectAltName (CVE-2013-4073).
12 (Christian Heimes)
13diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
14index 15696be..c7a9f5c 100644
15--- a/ext/openssl/openssl.c
16+++ b/ext/openssl/openssl.c
17@@ -1326,6 +1326,74 @@ PHP_FUNCTION(openssl_x509_check_private_key)
18 }
19 /* }}} */
20
21+/* Special handling of subjectAltName, see CVE-2013-4073
22+ * Christian Heimes
23+ */
24+
25+static int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension)
26+{
27+ GENERAL_NAMES *names;
28+ const X509V3_EXT_METHOD *method = NULL;
29+ long i, length, num;
30+ const unsigned char *p;
31+
32+ method = X509V3_EXT_get(extension);
33+ if (method == NULL) {
34+ return -1;
35+ }
36+
37+ p = extension->value->data;
38+ length = extension->value->length;
39+ if (method->it) {
40+ names = (GENERAL_NAMES*)(ASN1_item_d2i(NULL, &p, length,
41+ ASN1_ITEM_ptr(method->it)));
42+ } else {
43+ names = (GENERAL_NAMES*)(method->d2i(NULL, &p, length));
44+ }
45+ if (names == NULL) {
46+ return -1;
47+ }
48+
49+ num = sk_GENERAL_NAME_num(names);
50+ for (i = 0; i < num; i++) {
51+ GENERAL_NAME *name;
52+ ASN1_STRING *as;
53+ name = sk_GENERAL_NAME_value(names, i);
54+ switch (name->type) {
55+ case GEN_EMAIL:
56+ BIO_puts(bio, "email:");
57+ as = name->d.rfc822Name;
58+ BIO_write(bio, ASN1_STRING_data(as),
59+ ASN1_STRING_length(as));
60+ break;
61+ case GEN_DNS:
62+ BIO_puts(bio, "DNS:");
63+ as = name->d.dNSName;
64+ BIO_write(bio, ASN1_STRING_data(as),
65+ ASN1_STRING_length(as));
66+ break;
67+ case GEN_URI:
68+ BIO_puts(bio, "URI:");
69+ as = name->d.uniformResourceIdentifier;
70+ BIO_write(bio, ASN1_STRING_data(as),
71+ ASN1_STRING_length(as));
72+ break;
73+ default:
74+ /* use builtin print for GEN_OTHERNAME, GEN_X400,
75+ * GEN_EDIPARTY, GEN_DIRNAME, GEN_IPADD and GEN_RID
76+ */
77+ GENERAL_NAME_print(bio, name);
78+ }
79+ /* trailing ', ' except for last element */
80+ if (i < (num - 1)) {
81+ BIO_puts(bio, ", ");
82+ }
83+ }
84+ sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
85+
86+ return 0;
87+}
88+
89 /* {{{ proto array openssl_x509_parse(mixed x509 [, bool shortnames=true])
90 Returns an array of the fields/values of the CERT */
91 PHP_FUNCTION(openssl_x509_parse)
92@@ -1422,15 +1490,29 @@ PHP_FUNCTION(openssl_x509_parse)
93
94
95 for (i = 0; i < X509_get_ext_count(cert); i++) {
96+ int nid;
97 extension = X509_get_ext(cert, i);
98- if (OBJ_obj2nid(X509_EXTENSION_get_object(extension)) != NID_undef) {
99+ nid = OBJ_obj2nid(X509_EXTENSION_get_object(extension));
100+ if (nid != NID_undef) {
101 extname = (char *)OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(extension)));
102 } else {
103 OBJ_obj2txt(buf, sizeof(buf)-1, X509_EXTENSION_get_object(extension), 1);
104 extname = buf;
105 }
106 bio_out = BIO_new(BIO_s_mem());
107- if (X509V3_EXT_print(bio_out, extension, 0, 0)) {
108+ if (nid == NID_subject_alt_name) {
109+ if (openssl_x509v3_subjectAltName(bio_out, extension) == 0) {
110+ add_assoc_stringl(subitem, extname, bio_buf->data, bio_buf->length, 1);
111+ } else {
112+ zval_dtor(return_value);
113+ if (certresource == -1 && cert) {
114+ X509_free(cert);
115+ }
116+ BIO_free(bio_out);
117+ RETURN_FALSE;
118+ }
119+ }
120+ else if (X509V3_EXT_print(bio_out, extension, 0, 0)) {
121 BIO_get_mem_ptr(bio_out, &bio_buf);
122 add_assoc_stringl(subitem, extname, bio_buf->data, bio_buf->length, 1);
123 } else {
124diff --git a/ext/openssl/tests/cve2013_4073.pem b/ext/openssl/tests/cve2013_4073.pem
125new file mode 100644
126index 0000000..7ebb994
127--- /dev/null
128+++ b/ext/openssl/tests/cve2013_4073.pem
129@@ -0,0 +1,28 @@
130+-----BEGIN CERTIFICATE-----
131+MIIE2DCCA8CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBxTELMAkGA1UEBhMCVVMx
132+DzANBgNVBAgMBk9yZWdvbjESMBAGA1UEBwwJQmVhdmVydG9uMSMwIQYDVQQKDBpQ
133+eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjEgMB4GA1UECwwXUHl0aG9uIENvcmUg
134+RGV2ZWxvcG1lbnQxJDAiBgNVBAMMG251bGwucHl0aG9uLm9yZwBleGFtcGxlLm9y
135+ZzEkMCIGCSqGSIb3DQEJARYVcHl0aG9uLWRldkBweXRob24ub3JnMB4XDTEzMDgw
136+NzEzMTE1MloXDTEzMDgwNzEzMTI1MlowgcUxCzAJBgNVBAYTAlVTMQ8wDQYDVQQI
137+DAZPcmVnb24xEjAQBgNVBAcMCUJlYXZlcnRvbjEjMCEGA1UECgwaUHl0aG9uIFNv
138+ZnR3YXJlIEZvdW5kYXRpb24xIDAeBgNVBAsMF1B5dGhvbiBDb3JlIERldmVsb3Bt
139+ZW50MSQwIgYDVQQDDBtudWxsLnB5dGhvbi5vcmcAZXhhbXBsZS5vcmcxJDAiBgkq
140+hkiG9w0BCQEWFXB5dGhvbi1kZXZAcHl0aG9uLm9yZzCCASIwDQYJKoZIhvcNAQEB
141+BQADggEPADCCAQoCggEBALXq7cn7Rn1vO3aA3TrzA5QLp6bb7B3f/yN0CJ2XFj+j
142+pHs+Gw6WWSUDpybiiKnPec33BFawq3kyblnBMjBU61ioy5HwQqVkJ8vUVjGIUq3P
143+vX/wBmQfzCe4o4uM89gpHyUL9UYGG8oCRa17dgqcv7u5rg0Wq2B1rgY+nHwx3JIv
144+KRrgSwyRkGzpN8WQ1yrXlxWjgI9de0mPVDDUlywcWze1q2kwaEPTM3hLAmD1PESA
145+oY/n8A/RXoeeRs9i/Pm/DGUS8ZPINXk/yOzsR/XvvkTVroIeLZqfmFpnZeF0cHzL
146+08LODkVJJ9zjLdT7SA4vnne4FEbAxDbKAq5qkYzaL4UCAwEAAaOB0DCBzTAMBgNV
147+HRMBAf8EAjAAMB0GA1UdDgQWBBSIWlXAUv9hzVKjNQ/qWpwkOCL3XDALBgNVHQ8E
148+BAMCBeAwgZAGA1UdEQSBiDCBhYIeYWx0bnVsbC5weXRob24ub3JnAGV4YW1wbGUu
149+Y29tgSBudWxsQHB5dGhvbi5vcmcAdXNlckBleGFtcGxlLm9yZ4YpaHR0cDovL251
150+bGwucHl0aG9uLm9yZwBodHRwOi8vZXhhbXBsZS5vcmeHBMAAAgGHECABDbgAAAAA
151+AAAAAAAAAAEwDQYJKoZIhvcNAQEFBQADggEBAKxPRe99SaghcI6IWT7UNkJw9aO9
152+i9eo0Fj2MUqxpKbdb9noRDy2CnHWf7EIYZ1gznXPdwzSN4YCjV5d+Q9xtBaowT0j
153+HPERs1ZuytCNNJTmhyqZ8q6uzMLoht4IqH/FBfpvgaeC5tBTnTT0rD5A/olXeimk
154+kX4LxlEx5RAvpGB2zZVRGr6LobD9rVK91xuHYNIxxxfEGE8tCCWjp0+3ksri9SXx
155+VHWBnbM9YaL32u3hxm8sYB/Yb8WSBavJCWJJqRStVRHM1koZlJmXNx2BX4vPo6iW
156+RFEIPQsFZRLrtnCAiEhyT8bC2s/Njlu6ly9gtJZWSV46Q3ZjBL4q9sHKqZQ=
157+-----END CERTIFICATE-----
158diff --git a/ext/openssl/tests/cve2013_4073.phpt b/ext/openssl/tests/cve2013_4073.phpt
159new file mode 100644
160index 0000000..e676ddf
161--- /dev/null
162+++ b/ext/openssl/tests/cve2013_4073.phpt
163@@ -0,0 +1,19 @@
164+--TEST--
165+CVE 2013-4073: Null-byte certificate handling
166+--SKIPIF--
167+<?php
168+if (!extension_loaded("openssl")) die("skip");
169+--FILE--
170+<?php
171+$cert = file_get_contents(__DIR__ . '/cve2013_4073.pem');
172+$info = openssl_x509_parse($cert);
173+var_export($info['extensions']);
174+
175+--EXPECTF--
176+array (
177+ 'basicConstraints' => 'CA:FALSE',
178+ 'subjectKeyIdentifier' => '88:5A:55:C0:52:FF:61:CD:52:A3:35:0F:EA:5A:9C:24:38:22:F7:5C',
179+ 'keyUsage' => 'Digital Signature, Non Repudiation, Key Encipherment',
180+ 'subjectAltName' => 'DNS:altnull.python.org' . "\0" . 'example.com, email:null@python.org' . "\0" . 'user@example.org, URI:http://null.python.org' . "\0" . 'http://example.org, IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1
181+',
182+)
This page took 0.053863 seconds and 4 git commands to generate.