diff options
| author | Remi Collet <remi@remirepo.net> | 2020-09-29 10:26:56 +0200 | 
|---|---|---|
| committer | Remi Collet <remi@remirepo.net> | 2020-09-29 10:26:56 +0200 | 
| commit | df79e9327223857efd2dbe8505dc3c32f6c36df0 (patch) | |
| tree | 629d23b3d7e2f3cd62d2245e28730823beeb1a7c | |
| parent | ec4295e9dcc8d8d7c07e31adbe7893650a4cb541 (diff) | |
Core:
  Fix #79699 PHP parses encoded cookie names so malicious `__Host-` cookies can be sent
  CVE-2020-7070
OpenSSL:
  Fix #79601 Wrong ciphertext/tag in AES-CCM encryption for a 12 bytes IV
  CVE-2020-7069
  Fix bug #78079 openssl_encrypt_ccm.phpt fails with OpenSSL 1.1.1c
| -rw-r--r-- | php-bug79601.patch | 217 | ||||
| -rw-r--r-- | php-bug79699.patch | 148 | ||||
| -rw-r--r-- | php.spec | 20 | 
3 files changed, 379 insertions, 6 deletions
| diff --git a/php-bug79601.patch b/php-bug79601.patch new file mode 100644 index 0000000..b377887 --- /dev/null +++ b/php-bug79601.patch @@ -0,0 +1,217 @@ +From 3528f51fe33944ba7bab263a47c49dd1d7dd12e3 Mon Sep 17 00:00:00 2001 +From: Stanislav Malyshev <stas@php.net> +Date: Sat, 26 Sep 2020 22:08:52 -0700 +Subject: [PATCH] Fix bug #79601 (Wrong ciphertext/tag in AES-CCM encryption + for a 12 bytes IV) + +(cherry picked from commit 0216630ea2815a5789a24279a1211ac398d4de79) +--- + ext/openssl/openssl.c                      | 10 ++++----- + ext/openssl/tests/cipher_tests.inc         | 21 +++++++++++++++++ + ext/openssl/tests/openssl_decrypt_ccm.phpt | 22 +++++++++++------- + ext/openssl/tests/openssl_encrypt_ccm.phpt | 26 ++++++++++++++-------- + 4 files changed, 57 insertions(+), 22 deletions(-) + +diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c +index 39b6a20473..21c5367f72 100644 +--- a/ext/openssl/openssl.c ++++ b/ext/openssl/openssl.c +@@ -6216,11 +6216,6 @@ static int php_openssl_validate_iv(char **piv, size_t *piv_len, size_t iv_requir + { + 	char *iv_new; +  +-	/* Best case scenario, user behaved */ +-	if (*piv_len == iv_required_len) { +-		return SUCCESS; +-	} +- + 	if (mode->is_aead) { + 		if (EVP_CIPHER_CTX_ctrl(cipher_ctx, mode->aead_ivlen_flag, *piv_len, NULL) != 1) { + 			php_error_docref(NULL, E_WARNING, "Setting of IV length for AEAD mode failed"); +@@ -6229,6 +6224,11 @@ static int php_openssl_validate_iv(char **piv, size_t *piv_len, size_t iv_requir + 		return SUCCESS; + 	} +  ++	/* Best case scenario, user behaved */ ++	if (*piv_len == iv_required_len) { ++		return SUCCESS; ++	} ++ + 	iv_new = ecalloc(1, iv_required_len + 1); +  + 	if (*piv_len == 0) { +diff --git a/ext/openssl/tests/cipher_tests.inc b/ext/openssl/tests/cipher_tests.inc +index b1e46b411e..779bfa8515 100644 +--- a/ext/openssl/tests/cipher_tests.inc ++++ b/ext/openssl/tests/cipher_tests.inc +@@ -1,5 +1,26 @@ + <?php + $php_openssl_cipher_tests = array( ++    'aes-128-ccm' => array( ++        array( ++            'key' => '404142434445464748494a4b4c4d4e4f', ++            'iv'  => '1011121314151617', ++            'aad' => '000102030405060708090a0b0c0d0e0f', ++            'tag' => '1fc64fbfaccd', ++            'pt'  => '202122232425262728292a2b2c2d2e2f', ++            'ct'  => 'd2a1f0e051ea5f62081a7792073d593d', ++        ), ++        array( ++            'key' => '404142434445464748494a4b4c4d4e4f', ++            'iv'  => '101112131415161718191a1b', ++            'aad' => '000102030405060708090a0b0c0d0e0f' . ++                     '10111213', ++            'tag' => '484392fbc1b09951', ++            'pt'  => '202122232425262728292a2b2c2d2e2f' . ++                     '3031323334353637', ++            'ct'  => 'e3b201a9f5b71a7a9b1ceaeccd97e70b' . ++                     '6176aad9a4428aa5', ++        ), ++    ), +     'aes-256-ccm' => array( +         array( +             'key' => '1bde3251d41a8b5ea013c195ae128b21' . +diff --git a/ext/openssl/tests/openssl_decrypt_ccm.phpt b/ext/openssl/tests/openssl_decrypt_ccm.phpt +index 87b6d4b264..479114719a 100644 +--- a/ext/openssl/tests/openssl_decrypt_ccm.phpt ++++ b/ext/openssl/tests/openssl_decrypt_ccm.phpt +@@ -10,14 +10,16 @@ if (!in_array('aes-256-ccm', openssl_get_cipher_methods())) + --FILE-- + <?php + require_once __DIR__ . "/cipher_tests.inc"; +-$method = 'aes-256-ccm'; +-$tests = openssl_get_cipher_tests($method); ++$methods = ['aes-128-ccm', 'aes-256-ccm']; +  +-foreach ($tests as $idx => $test) { +-    echo "TEST $idx\n"; +-    $pt = openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA, +-        $test['iv'], $test['tag'], $test['aad']); +-    var_dump($test['pt'] === $pt); ++foreach ($methods as $method) { ++    $tests = openssl_get_cipher_tests($method); ++    foreach ($tests as $idx => $test) { ++        echo "$method - TEST $idx\n"; ++        $pt = openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA, ++            $test['iv'], $test['tag'], $test['aad']); ++        var_dump($test['pt'] === $pt); ++    } + } +  + // no IV +@@ -32,7 +34,11 @@ var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA, +  + ?> + --EXPECTF-- +-TEST 0 ++aes-128-ccm - TEST 0 ++bool(true) ++aes-128-ccm - TEST 1 ++bool(true) ++aes-256-ccm - TEST 0 + bool(true) +  + Warning: openssl_decrypt(): Setting of IV length for AEAD mode failed in %s on line %d +diff --git a/ext/openssl/tests/openssl_encrypt_ccm.phpt b/ext/openssl/tests/openssl_encrypt_ccm.phpt +index c8610bc96b..64a3b758e2 100644 +--- a/ext/openssl/tests/openssl_encrypt_ccm.phpt ++++ b/ext/openssl/tests/openssl_encrypt_ccm.phpt +@@ -10,15 +10,17 @@ if (!in_array('aes-256-ccm', openssl_get_cipher_methods())) + --FILE-- + <?php + require_once __DIR__ . "/cipher_tests.inc"; +-$method = 'aes-256-ccm'; +-$tests = openssl_get_cipher_tests($method); ++$methods = ['aes-128-ccm', 'aes-256-ccm']; +  +-foreach ($tests as $idx => $test) { +-    echo "TEST $idx\n"; +-    $ct = openssl_encrypt($test['pt'], $method, $test['key'], OPENSSL_RAW_DATA, +-        $test['iv'], $tag, $test['aad'], strlen($test['tag'])); +-    var_dump($test['ct'] === $ct); +-    var_dump($test['tag'] === $tag); ++foreach ($methods as $method) { ++    $tests = openssl_get_cipher_tests($method); ++    foreach ($tests as $idx => $test) { ++        echo "$method - TEST $idx\n"; ++        $ct = openssl_encrypt($test['pt'], $method, $test['key'], OPENSSL_RAW_DATA, ++            $test['iv'], $tag, $test['aad'], strlen($test['tag'])); ++        var_dump($test['ct'] === $ct); ++        var_dump($test['tag'] === $tag); ++    } + } +  + // Empty IV error +@@ -29,7 +31,13 @@ var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 10), $t + var_dump(strlen($tag)); + ?> + --EXPECTF-- +-TEST 0 ++aes-128-ccm - TEST 0 ++bool(true) ++bool(true) ++aes-128-ccm - TEST 1 ++bool(true) ++bool(true) ++aes-256-ccm - TEST 0 + bool(true) + bool(true) +  +From 74495ac743e1896c3b33c954fcef54b412f87ac9 Mon Sep 17 00:00:00 2001 +From: Jakub Zelenka <bukka@php.net> +Date: Sun, 2 Jun 2019 19:10:56 +0100 +Subject: [PATCH] Fix bug #78079 (openssl_encrypt_ccm.phpt fails with OpenSSL + 1.1.1c) + +It also fixes invalid setting of tag length + +(cherry picked from commit 2e025794745e09f7d0c72822ad0238bf6d67b2e8) +--- + ext/openssl/openssl.c                      |  5 ++++- + ext/openssl/tests/openssl_encrypt_ccm.phpt | 12 +++++++++--- + 2 files changed, 13 insertions(+), 4 deletions(-) + +diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c +index 21c5367f72..72db9941d4 100644 +--- a/ext/openssl/openssl.c ++++ b/ext/openssl/openssl.c +@@ -6289,7 +6289,10 @@ static int php_openssl_cipher_init(const EVP_CIPHER *cipher_type, + 		return FAILURE; + 	} + 	if (mode->is_single_run_aead && enc) { +-		EVP_CIPHER_CTX_ctrl(cipher_ctx, mode->aead_set_tag_flag, tag_len, NULL); ++		if (!EVP_CIPHER_CTX_ctrl(cipher_ctx, mode->aead_set_tag_flag, tag_len, NULL)) { ++			php_error_docref(NULL, E_WARNING, "Setting tag length for AEAD cipher failed"); ++			return FAILURE; ++		} + 	} else if (!enc && tag && tag_len > 0) { + 		if (!mode->is_aead) { + 			php_error_docref(NULL, E_WARNING, "The tag cannot be used because the cipher method does not support AEAD"); +diff --git a/ext/openssl/tests/openssl_encrypt_ccm.phpt b/ext/openssl/tests/openssl_encrypt_ccm.phpt +index 64a3b758e2..8c4c41f818 100644 +--- a/ext/openssl/tests/openssl_encrypt_ccm.phpt ++++ b/ext/openssl/tests/openssl_encrypt_ccm.phpt +@@ -26,9 +26,12 @@ foreach ($methods as $method) { + // Empty IV error + var_dump(openssl_encrypt('data', $method, 'password', 0, NULL, $tag, '')); +  +-// Test setting different IV length and unlimeted tag +-var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 10), $tag, '', 1024)); ++// Test setting different IV length and tag length ++var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 10), $tag, '', 14)); + var_dump(strlen($tag)); ++ ++// Test setting invalid tag length ++var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 16), $tag, '', 1024)); + ?> + --EXPECTF-- + aes-128-ccm - TEST 0 +@@ -44,4 +47,7 @@ bool(true) + Warning: openssl_encrypt(): Setting of IV length for AEAD mode failed in %s on line %d + bool(false) + string(8) "p/lvgA==" +-int(1024) ++int(14) ++ ++Warning: openssl_encrypt(): Setting of IV length for AEAD mode failed in %s on line %d ++bool(false) diff --git a/php-bug79699.patch b/php-bug79699.patch new file mode 100644 index 0000000..88e7bba --- /dev/null +++ b/php-bug79699.patch @@ -0,0 +1,148 @@ +From 72f993acb5de39ca5f01146ff33ff63dc110b8b4 Mon Sep 17 00:00:00 2001 +From: Stanislav Malyshev <stas@php.net> +Date: Sun, 20 Sep 2020 18:08:55 -0700 +Subject: [PATCH] Do not decode cookie names anymore + +(cherry picked from commit 6559fe912661ca5ce5f0eeeb591d928451428ed0) +--- + main/php_variables.c      |  8 ++++++-- + tests/basic/022.phpt      | 10 +++++++--- + tests/basic/023.phpt      |  4 +++- + tests/basic/bug79699.phpt | 22 ++++++++++++++++++++++ + 4 files changed, 38 insertions(+), 6 deletions(-) + create mode 100644 tests/basic/bug79699.phpt + +diff --git a/main/php_variables.c b/main/php_variables.c +index c56d23003c..d0223df44a 100644 +--- a/main/php_variables.c ++++ b/main/php_variables.c +@@ -484,7 +484,9 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data) + 			size_t new_val_len; +  + 			*val++ = '\0'; +-			php_url_decode(var, strlen(var)); ++			if (arg != PARSE_COOKIE) { ++				php_url_decode(var, strlen(var)); ++			} + 			val_len = php_url_decode(val, strlen(val)); + 			val = estrndup(val, val_len); + 			if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) { +@@ -495,7 +497,9 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data) + 			size_t val_len; + 			size_t new_val_len; +  +-			php_url_decode(var, strlen(var)); ++			if (arg != PARSE_COOKIE) { ++				php_url_decode(var, strlen(var)); ++			} + 			val_len = 0; + 			val = estrndup("", val_len); + 			if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) { +diff --git a/tests/basic/022.phpt b/tests/basic/022.phpt +index 0ab70d4be7..bd1db13701 100644 +--- a/tests/basic/022.phpt ++++ b/tests/basic/022.phpt +@@ -10,7 +10,7 @@ cookie1=val1  ; cookie2=val2%20; cookie3=val 3.; cookie 4= value 4 %3B; cookie1= + var_dump($_COOKIE); + ?> + --EXPECT-- +-array(10) { ++array(12) { +   ["cookie1"]=> +   string(6) "val1  " +   ["cookie2"]=> +@@ -19,11 +19,15 @@ array(10) { +   string(6) "val 3." +   ["cookie_4"]=> +   string(10) " value 4 ;" ++  ["%20cookie1"]=> ++  string(6) "ignore" ++  ["+cookie1"]=> ++  string(6) "ignore" +   ["cookie__5"]=> +   string(7) "  value" +-  ["cookie_6"]=> ++  ["cookie%206"]=> +   string(3) "þæö" +-  ["cookie_7"]=> ++  ["cookie+7"]=> +   string(0) "" +   ["$cookie_8"]=> +   string(0) "" +diff --git a/tests/basic/023.phpt b/tests/basic/023.phpt +index ca5f1dcfbb..0e2e0ac669 100644 +--- a/tests/basic/023.phpt ++++ b/tests/basic/023.phpt +@@ -10,9 +10,11 @@ c o o k i e=value; c o o k i e= v a l u e ;;c%20o+o k+i%20e=v;name="value","valu + var_dump($_COOKIE); + ?> + --EXPECT-- +-array(3) { ++array(4) { +   ["c_o_o_k_i_e"]=> +   string(5) "value" ++  ["c%20o+o_k+i%20e"]=> ++  string(1) "v" +   ["name"]=> +   string(24) ""value","value",UEhQIQ==" +   ["UEhQIQ"]=> +diff --git a/tests/basic/bug79699.phpt b/tests/basic/bug79699.phpt +new file mode 100644 +index 0000000000..fc3d3fedb0 +--- /dev/null ++++ b/tests/basic/bug79699.phpt +@@ -0,0 +1,22 @@ ++--TEST-- ++Cookies Security Bug ++--INI-- ++max_input_vars=1000 ++filter.default=unsafe_raw ++--COOKIE-- ++__%48ost-evil=evil; __Host-evil=good; %66oo=baz;foo=bar ++--FILE-- ++<?php ++var_dump($_COOKIE); ++?> ++--EXPECT-- ++array(4) { ++  ["__%48ost-evil"]=> ++  string(4) "evil" ++  ["__Host-evil"]=> ++  string(4) "good" ++  ["%66oo"]=> ++  string(3) "baz" ++  ["foo"]=> ++  string(3) "bar" ++} +From ff5acd41c3498c1bf78f2803bbef89f006cbffb8 Mon Sep 17 00:00:00 2001 +From: Remi Collet <remi@remirepo.net> +Date: Tue, 29 Sep 2020 08:53:26 +0200 +Subject: [PATCH] NEWS + +--- + NEWS | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/NEWS b/NEWS +index 2c340eb648..bc49257774 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,6 +1,18 @@ + PHP                                                                        NEWS + ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +  ++Backported from 7.2.34 ++ ++- Core: ++  . Fixed bug #79699 (PHP parses encoded cookie names so malicious `__Host-` ++    cookies can be sent). (CVE-2020-7070) (Stas) ++ ++- OpenSSL: ++  . Fixed bug #79601 (Wrong ciphertext/tag in AES-CCM encryption for a 12 ++    bytes IV). (CVE-2020-7069) (Jakub Zelenka) ++  . Fixed bug #78079 (openssl_encrypt_ccm.phpt fails with OpenSSL 1.1.1c). ++    (Jakub Zelenka) ++ + Backported from 7.2.33 +  + - Core: @@ -86,12 +86,7 @@  # Optional components; pass "--with mssql" etc to rpmbuild.  %global with_oci8      %{?_with_oci8:1}%{!?_with_oci8:0}  %global with_imap      1 -# until firebird available in EPEL -%if 0%{?rhel} == 8 -%global with_interbase 0 -%else  %global with_interbase 1 -%endif  %global with_mcrypt    1  %global with_freetds   1  %global with_tidy      1 @@ -145,7 +140,7 @@  Summary: PHP scripting language for creating dynamic web sites  Name: %{?scl_prefix}php  Version: %{upver}%{?rcver:~%{rcver}} -Release: 9%{?dist} +Release: 10%{?dist}  # All files licensed under PHP version 3.01, except  # Zend is licensed under Zend  # TSRM is licensed under BSD @@ -225,6 +220,8 @@ Patch216: php-bug78875.patch  Patch217: php-bug78876.patch  Patch218: php-bug79797.patch  Patch219: php-bug79877.patch +Patch220: php-bug79601.patch +Patch221: php-bug79699.patch  # Fixes for tests (300+)  # Factory is droped from system tzdata @@ -975,6 +972,8 @@ sed -e 's/php-devel/%{?scl_prefix}php-devel/' -i scripts/phpize.in  %patch217 -p1 -b .bug78876  %patch218 -p1 -b .bug79797  %patch219 -p1 -b .bug79877 +%patch220 -p1 -b .bug79601 +%patch221 -p1 -b .bug79699  # Fixes for tests  %patch300 -p1 -b .datetests @@ -1939,6 +1938,15 @@ EOF  %changelog +* Tue Sep 29 2020 Remi Collet <remi@remirepo.net> - 7.1.33-10 +- Core: +  Fix #79699 PHP parses encoded cookie names so malicious `__Host-` cookies can be sent +  CVE-2020-7070 +- OpenSSL: +  Fix #79601 Wrong ciphertext/tag in AES-CCM encryption for a 12 bytes IV +  CVE-2020-7069 +  Fix bug #78079 openssl_encrypt_ccm.phpt fails with OpenSSL 1.1.1c +  * Tue Aug  4 2020 Remi Collet <remi@remirepo.net> - 7.1.33-9  - Core:    Fix #79877 getimagesize function silently truncates after a null byte | 
