Skip to content

Commit 94a70b9

Browse files
committed
Merge branch 'PHP-5.6'
* PHP-5.6: Fixed bug #68879 (IP Address fields in subjectAltNames not used) Fix broken test Conflicts: ext/openssl/xp_ssl.c
2 parents 792630b + 5dcace0 commit 94a70b9

File tree

3 files changed

+105
-20
lines changed

3 files changed

+105
-20
lines changed

ext/openssl/tests/bug68879.pem

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
-----BEGIN ENCRYPTED PRIVATE KEY-----
2+
MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIuw/AFD7RWcMCAggA
3+
MBQGCCqGSIb3DQMHBAh98F6GmaGn1ASCAoBpzaFxyttEhyh4dhMjarJIqTz24DjO
4+
yZnp1K5qthejSYx2P28uUsh+gQOh6F2jbVAq++eAWkTBGuc4pWhhoT7nY8vhf0Y0
5+
6yTlVrTxuI/8MNo/lfa0xE/+ZD4B5zp0hQxfij4GTd8l6V/kpXMgiYD1JmIXArm7
6+
sucn+9XV3RucsTBpeIJ1nLEDfpbyEWqNfhoyskQ+S3I6HkMgELI9JpsO6OR9fh1Q
7+
ttdoYxBU+YjoDYcSWRGkTGrJFeGGhTQzz+L2ijgoqNWDSfrLBoQR1bqNVUuw6gcE
8+
9PpA/vpRlxcHbUNNkOWft+4e0tV3I2EqscEcsYeNbd2Ta4yu7f6pk4/Kxn40wrQ8
9+
6Ss9GZylghaFth2xppL/vpmGaCC7FqpZRh+NKqjlcBobIkwyRcsQrPHB0CYLPHA4
10+
yak/dNTY8L5K8Rtd5XG3+E41CoDF6ssNY0Kw7l9kAn/neDVh+WnQkWIiWPmq210a
11+
p4L/uiXRK7aYi+UqKJ5+svayNw2w1dkqpbeejwLq2F1+ek/447JFPVJcvP8Nm7sr
12+
04Mcg+ZHusZdjiWEv4W6CBq8o6eF2JdhfpSDgPkHwiZ/EarHfx0vcYIMJhlEQBmk
13+
a/XsZPk2wnamKSPfJautO3MIus0M6SniWF6eDA4/AZzSjXV8Vc0unb6lc+Nc8tJa
14+
6MU1soTsmki/YraCmQswqpL+kXFZVeHuLowOC5oH+CimQoscmiZ9tBvpnYo6XwEZ
15+
S9jZRIBQ77oMku+rlMPfz2FURgVXZpEfrGmxKvA5Vt3ojrYfTwwD2YqZHVcm39zy
16+
iKqA1qVt7A2A90ILMAzYnN0VRE4SO3yIDN1ZBp5OOY61AduPrhpaHl81
17+
-----END ENCRYPTED PRIVATE KEY-----
18+
-----BEGIN CERTIFICATE-----
19+
MIICkTCCAfqgAwIBAgIJAPbIVRT31Al1MA0GCSqGSIb3DQEBCwUAMFgxCzAJBgNV
20+
BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
21+
Q29tcGFueSBMdGQxFDASBgNVBAMMC3BocCB0ZXN0IGNhMB4XDTE1MDMwNTA0NTQx
22+
NVoXDTI1MDMwMjA0NTQxNVowUjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAlNDMRUw
23+
EwYDVQQHDAxNeXJ0bGUgQmVhY2gxDDAKBgNVBAsMA1BIUDERMA8GA1UEAwwIdGVz
24+
dC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKp5gxUbKvY5eFwZJti0
25+
6d6YBo400Or6M+bLfIMnz5C1WQ7dMfiQpeFLpSIlOIaFqyrqkeeR9k5dsx1K9FOu
26+
PAJ4+lmWA4R93RpdJFz8kmQoNu3P59JMATXi8wvNBIrN/Vc08NT0wBRImeyQSVHd
27+
UcFIXBEbBM0dQsPKQ1k8n5WDAgMBAAGjaTBnMAkGA1UdEwQCMAAwCwYDVR0PBAQD
28+
AgXgME0GA1UdEQRGMESCCHRlc3QuY29tggx3d3cudGVzdC5jb22CEnN1YmRvbWFp
29+
bi50ZXN0LmNvbYcQAAAAAAAAAAAAAP//CgIAAYcECgIAATANBgkqhkiG9w0BAQsF
30+
AAOBgQBZ4TptNXV85gNj3wcB5feWFcwKO8cN4hwnhrbqiHN280r9O/g1CQiLmB4K
31+
2txrJt06UNCnvWse7CdvsN14wu6rRGRk/+7M36NBw5ERkAzp5HXgZUWVdMl3YltB
32+
PpqbLhGGrkVn7/jW2FdAxfax7qaGDYgC3qcQNfiK6K92SPxV7Q==
33+
-----END CERTIFICATE-----

ext/openssl/tests/bug68879.phpt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
--TEST--
2+
Bug #68879: Match IP address fields in subjectAltName checks
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded("openssl")) die("skip openssl not loaded");
6+
if (!function_exists("proc_open")) die("skip no proc_open");
7+
--FILE--
8+
<?php
9+
$serverCode = <<<'CODE'
10+
$serverUri = "ssl://127.0.0.1:64321";
11+
$serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
12+
$serverCtx = stream_context_create(['ssl' => [
13+
'local_cert' => __DIR__ . '/bug68879.pem',
14+
'passphrase' => 'elephpant',
15+
]]);
16+
17+
$server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
18+
phpt_notify();
19+
20+
stream_socket_accept($server, 30);
21+
CODE;
22+
23+
$clientCode = <<<'CODE'
24+
$serverUri = "ssl://127.0.0.1:64321";
25+
$clientFlags = STREAM_CLIENT_CONNECT;
26+
$clientCtx = stream_context_create(['ssl' => [
27+
'verify_peer' => false,
28+
'verify_peer_name' => true,
29+
'peer_name' => '10.2.0.1',
30+
]]);
31+
32+
phpt_wait();
33+
34+
var_dump(stream_socket_client($serverUri, $errno, $errstr, 30, $clientFlags, $clientCtx));
35+
CODE;
36+
37+
include 'ServerClientTestCase.inc';
38+
ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
39+
--EXPECTF--
40+
resource(%d) of type (stream)
41+

ext/openssl/xp_ssl.c

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -400,38 +400,49 @@ static zend_bool matches_wildcard_name(const char *subjectname, const char *cert
400400

401401
static zend_bool matches_san_list(X509 *peer, const char *subject_name) /* {{{ */
402402
{
403-
int i, san_name_len;
404-
zend_bool is_match = 0;
403+
int i;
405404
unsigned char *cert_name = NULL;
405+
char ipbuffer[64];
406406

407407
GENERAL_NAMES *alt_names = X509_get_ext_d2i(peer, NID_subject_alt_name, 0, 0);
408408
int alt_name_count = sk_GENERAL_NAME_num(alt_names);
409409

410410
for (i = 0; i < alt_name_count; i++) {
411411
GENERAL_NAME *san = sk_GENERAL_NAME_value(alt_names, i);
412-
if (san->type != GEN_DNS) {
413-
/* we only care about DNS names */
414-
continue;
415-
}
416-
417-
san_name_len = ASN1_STRING_length(san->d.dNSName);
418-
ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName);
419-
420-
/* prevent null byte poisoning */
421-
if (san_name_len != strlen((const char*)cert_name)) {
422-
php_error_docref(NULL, E_WARNING, "Peer SAN entry is malformed");
423-
} else {
424-
is_match = matches_wildcard_name(subject_name, (const char *)cert_name);
425-
}
426412

427-
OPENSSL_free(cert_name);
413+
if (san->type == GEN_DNS) {
414+
ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName);
415+
if (ASN1_STRING_length(san->d.dNSName) != strlen((const char*)cert_name)) {
416+
OPENSSL_free(cert_name);
417+
/* prevent null-byte poisoning*/
418+
continue;
419+
}
428420

429-
if (is_match) {
430-
break;
421+
if (matches_wildcard_name(subject_name, (const char *)cert_name)) {
422+
OPENSSL_free(cert_name);
423+
return 1;
424+
}
425+
OPENSSL_free(cert_name);
426+
} else if (san->type == GEN_IPADD) {
427+
if (san->d.iPAddress->length == 4) {
428+
sprintf(ipbuffer, "%d.%d.%d.%d",
429+
san->d.iPAddress->data[0],
430+
san->d.iPAddress->data[1],
431+
san->d.iPAddress->data[2],
432+
san->d.iPAddress->data[3]
433+
);
434+
if (strcasecmp(subject_name, (const char*)ipbuffer) == 0) {
435+
return 1;
436+
}
437+
}
438+
/* No, we aren't bothering to check IPv6 addresses. Why?
439+
* * Because IP SAN names are officially deprecated and are
440+
* * not allowed by CAs starting in 2015. Deal with it.
441+
* */
431442
}
432443
}
433444

434-
return is_match;
445+
return 0;
435446
}
436447
/* }}} */
437448

0 commit comments

Comments
 (0)