Skip to content

Commit 71daf32

Browse files
committed
Merge branch 'PHP-5.3' into PHP-5.4
* PHP-5.3: 5.3.29-dev Fix CVE-2013-6420 - memory corruption in openssl_x509_parse Conflicts: configure.in main/php_version.h
2 parents c062c18 + 8650bbc commit 71daf32

File tree

4 files changed

+66
-5
lines changed

4 files changed

+66
-5
lines changed

NEWS

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ PHP NEWS
2424
. Fixed bug #49634 (Segfault throwing an exception in a XSL registered
2525
function). (Mike)
2626

27-
?? ??? 2013, PHP 5.4.23
27+
12 Dec 2013, PHP 5.4.23
2828

2929
- Core:
3030
. Fixed bug #66094 (unregister_tick_function tries to cast a Closure to a
@@ -46,6 +46,10 @@ PHP NEWS
4646
. Fixed bug #66141 (mysqlnd quote function is wrong with NO_BACKSLASH_ESCAPES
4747
after failed query). (Andrey)
4848

49+
- Openssl:
50+
. Fixed memory corruption in openssl_x509_parse() (CVE-2013-6420).
51+
(Stefan Esser).
52+
4953
- PDO
5054
. Fixed bug 65946 (sql_parser permanently converts values bound to strings)
5155

ext/openssl/openssl.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -645,18 +645,28 @@ static time_t asn1_time_to_time_t(ASN1_UTCTIME * timestr TSRMLS_DC) /* {{{ */
645645
char * thestr;
646646
long gmadjust = 0;
647647

648-
if (timestr->length < 13) {
649-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "extension author too lazy to parse %s correctly", timestr->data);
648+
if (ASN1_STRING_type(timestr) != V_ASN1_UTCTIME) {
649+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "illegal ASN1 data type for timestamp");
650650
return (time_t)-1;
651651
}
652652

653-
strbuf = estrdup((char *)timestr->data);
653+
if (ASN1_STRING_length(timestr) != strlen(ASN1_STRING_data(timestr))) {
654+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "illegal length in timestamp");
655+
return (time_t)-1;
656+
}
657+
658+
if (ASN1_STRING_length(timestr) < 13) {
659+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to parse time string %s correctly", timestr->data);
660+
return (time_t)-1;
661+
}
662+
663+
strbuf = estrdup((char *)ASN1_STRING_data(timestr));
654664

655665
memset(&thetime, 0, sizeof(thetime));
656666

657667
/* we work backwards so that we can use atoi more easily */
658668

659-
thestr = strbuf + timestr->length - 3;
669+
thestr = strbuf + ASN1_STRING_length(timestr) - 3;
660670

661671
thetime.tm_sec = atoi(thestr);
662672
*thestr = '\0';

ext/openssl/tests/cve-2013-6420.crt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEpDCCA4ygAwIBAgIJAJzu8r6u6eBcMA0GCSqGSIb3DQEBBQUAMIHDMQswCQYD
3+
VQQGEwJERTEcMBoGA1UECAwTTm9yZHJoZWluLVdlc3RmYWxlbjEQMA4GA1UEBwwH
4+
S8ODwrZsbjEUMBIGA1UECgwLU2VrdGlvbkVpbnMxHzAdBgNVBAsMFk1hbGljaW91
5+
cyBDZXJ0IFNlY3Rpb24xITAfBgNVBAMMGG1hbGljaW91cy5zZWt0aW9uZWlucy5k
6+
ZTEqMCgGCSqGSIb3DQEJARYbc3RlZmFuLmVzc2VyQHNla3Rpb25laW5zLmRlMHUY
7+
ZDE5NzAwMTAxMDAwMDAwWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
8+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9+
AAAAAAAXDTE0MTEyODExMzkzNVowgcMxCzAJBgNVBAYTAkRFMRwwGgYDVQQIDBNO
10+
b3JkcmhlaW4tV2VzdGZhbGVuMRAwDgYDVQQHDAdLw4PCtmxuMRQwEgYDVQQKDAtT
11+
ZWt0aW9uRWluczEfMB0GA1UECwwWTWFsaWNpb3VzIENlcnQgU2VjdGlvbjEhMB8G
12+
A1UEAwwYbWFsaWNpb3VzLnNla3Rpb25laW5zLmRlMSowKAYJKoZIhvcNAQkBFhtz
13+
dGVmYW4uZXNzZXJAc2VrdGlvbmVpbnMuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
14+
DwAwggEKAoIBAQDDAf3hl7JY0XcFniyEJpSSDqn0OqBr6QP65usJPRt/8PaDoqBu
15+
wEYT/Na+6fsgPjC0uK9DZgWg2tHWWoanSblAMoz5PH6Z+S4SHRZ7e2dDIjPjdhjh
16+
0mLg2UMO5yp0V797Ggs9lNt6JRfH81MN2obXWs4NtztLMuD6egqpr8dDbr34aOs8
17+
pkdui5UawTZksy5pLPHq5cMhFGm06v65CLo0V2Pd9+KAokPrPcN5KLKebz7mLpk6
18+
SMeEXOKP4idEqxyQ7O7fBuHMedsQhu+prY3si3BUyKfQtP5CZnX2bp0wKHxX12DX
19+
1nfFIt9DbGvHTcyOuN+nZLPBm3vWxntyIIvVAgMBAAGjQjBAMAkGA1UdEwQCMAAw
20+
EQYJYIZIAYb4QgEBBAQDAgeAMAsGA1UdDwQEAwIFoDATBgNVHSUEDDAKBggrBgEF
21+
BQcDAjANBgkqhkiG9w0BAQUFAAOCAQEAG0fZYYCTbdj1XYc+1SnoaPR+vI8C8CaD
22+
8+0UYhdnyU4gga0BAcDrY9e94eEAu6ZqycF6FjLqXXdAboppWocr6T6GD1x33Ckl
23+
VArzG/KxQohGD2JeqkhIMlDomxHO7ka39+Oa8i2vWLVyjU8AZvWMAruHa4EENyG7
24+
lW2AagaFKFCr9TnXTfrdxGVEbv7KVQ6bdhg5p5SjpWH1+Mq03uR3ZXPBYdyV8319
25+
o0lVj1KFI2DCL/liWisJRoof+1cR35Ctd0wYBcpB6TZslMcOPl76dwKwJgeJo2Qg
26+
Zsfmc2vC1/qOlNuNq/0TzzkVGv8ETT3CgaU+UXe4XOVvkccebJn2dg==
27+
-----END CERTIFICATE-----
28+
29+

ext/openssl/tests/cve-2013-6420.phpt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
CVE-2013-6420
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded("openssl")) die("skip");
6+
?>
7+
--FILE--
8+
<?php
9+
$crt = substr(__FILE__, 0, -4).'.crt';
10+
$info = openssl_x509_parse("file://$crt");
11+
var_dump($info['issuer']['emailAddress'], $info["validFrom_time_t"]);
12+
?>
13+
Done
14+
--EXPECTF--
15+
%s openssl_x509_parse(): illegal ASN1 data type for timestamp in %s/cve-2013-6420.php on line 3
16+
string(27) "stefan.esser@sektioneins.de"
17+
int(-1)
18+
Done

0 commit comments

Comments
 (0)