diff options
| -rw-r--r-- | php-bug81726.patch | 151 | ||||
| -rw-r--r-- | php-bug81727.patch | 81 | ||||
| -rw-r--r-- | php56.spec | 18 | 
3 files changed, 246 insertions, 4 deletions
| diff --git a/php-bug81726.patch b/php-bug81726.patch new file mode 100644 index 0000000..c096202 --- /dev/null +++ b/php-bug81726.patch @@ -0,0 +1,151 @@ +From d8a9f171c029dd4260544c46d560e67f95f99690 Mon Sep 17 00:00:00 2001 +From: "Christoph M. Becker" <cmbecker69@gmx.de> +Date: Mon, 25 Jul 2022 15:58:59 +0200 +Subject: [PATCH 2/3] Fix #81726: phar wrapper: DOS when using quine gzip file + +The phar wrapper needs to uncompress the file; the uncompressed file +might be compressed, so the wrapper implementation loops. This raises +potential DOS issues regarding too deep or even infinite recursion (the +latter are called compressed file quines[1]). We avoid that by +introducing a recursion limit; we choose the somewhat arbitrary limit +`3`. + +This issue has been reported by real_as3617 and gPayl0ad. + +[1] <https://honno.dev/gzip-quine/> + +(cherry picked from commit 404e8bdb68350931176a5bdc86fc417b34fb583d) +(cherry picked from commit 96fda78bcddd1d793cf2d0ee463dbb49621b577f) +--- + NEWS                         |   2 ++ + ext/phar/phar.c              |  16 +++++++++++----- + ext/phar/tests/bug81726.gz   | Bin 0 -> 204 bytes + ext/phar/tests/bug81726.phpt |  14 ++++++++++++++ + 4 files changed, 27 insertions(+), 5 deletions(-) + create mode 100644 ext/phar/tests/bug81726.gz + create mode 100644 ext/phar/tests/bug81726.phpt + +diff --git a/NEWS b/NEWS +index 6b14f93031..4b6fcd65e0 100644 +--- a/NEWS ++++ b/NEWS +@@ -4,6 +4,8 @@ PHP                                                                        NEWS + Backported from 7.4.31 +  + - Core: ++  . Fixed bug #81726: phar wrapper: DOS when using quine gzip file. ++    (CVE-2022-31628). (cmb) +   . Fixed bug #81727: Don't mangle HTTP variable names that clash with ones +     that have a specific semantic meaning. (CVE-2022-31629). (Derick) +  +diff --git a/ext/phar/phar.c b/ext/phar/phar.c +index 850a6e6c46..a7f776efa4 100644 +--- a/ext/phar/phar.c ++++ b/ext/phar/phar.c +@@ -1579,7 +1579,8 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a + 	const char zip_magic[] = "PK\x03\x04"; + 	const char gz_magic[] = "\x1f\x8b\x08"; + 	const char bz_magic[] = "BZh"; +-	char *pos, test = '\0'; ++	char *pos; ++	int recursion_count = 3; // arbitrary limit to avoid too deep or even infinite recursion + 	const int window_size = 1024; + 	char buffer[1024 + sizeof(token)]; /* a 1024 byte window + the size of the halt_compiler token (moving window) */ + 	const long readsize = sizeof(buffer) - sizeof(token); +@@ -1607,8 +1608,7 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a + 			MAPPHAR_ALLOC_FAIL("internal corruption of phar \"%s\" (truncated entry)") + 		} +  +-		if (!test) { +-			test = '\1'; ++		if (recursion_count) { + 			pos = buffer+tokenlen; + 			if (!memcmp(pos, gz_magic, 3)) { + 				char err = 0; +@@ -1668,7 +1668,10 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a + 				compression = PHAR_FILE_COMPRESSED_GZ; +  + 				/* now, start over */ +-				test = '\0'; ++				if (!--recursion_count) { ++					MAPPHAR_ALLOC_FAIL("unable to decompress gzipped phar archive \"%s\""); ++					break; ++				} + 				continue; + 			} else if (!memcmp(pos, bz_magic, 3)) { + 				php_stream_filter *filter; +@@ -1706,7 +1709,10 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a + 				compression = PHAR_FILE_COMPRESSED_BZ2; +  + 				/* now, start over */ +-				test = '\0'; ++				if (!--recursion_count) { ++					MAPPHAR_ALLOC_FAIL("unable to decompress bzipped phar archive \"%s\""); ++					break; ++				} + 				continue; + 			} +  +--  +2.37.3 + +From 8ba7c1b6dbb0f34ce5087792965648779c12bddb Mon Sep 17 00:00:00 2001 +From: "Christoph M. Becker" <cmbecker69@gmx.de> +Date: Tue, 27 Sep 2022 17:43:40 +0200 +Subject: [PATCH 3/3] Fix regression introduced by fixing bug 81726 + +When a tar phar is created, `phar_open_from_fp()` is also called, but +since the file has just been created, none of the format checks can +succeed, so we continue to loop, but must not check again for the +format.  Therefore, we bring back the old `test` variable. + +Closes GH-9620. + +(cherry picked from commit 432bf196d59bcb661fcf9cb7029cea9b43f490af) +(cherry picked from commit 535c3f592d020a3a43f4ce3577e505d64297b6e8) +--- + ext/phar/phar.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/ext/phar/phar.c b/ext/phar/phar.c +index a7f776efa4..45190e22aa 100644 +--- a/ext/phar/phar.c ++++ b/ext/phar/phar.c +@@ -1579,7 +1579,7 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a + 	const char zip_magic[] = "PK\x03\x04"; + 	const char gz_magic[] = "\x1f\x8b\x08"; + 	const char bz_magic[] = "BZh"; +-	char *pos; ++	char *pos, test = '\0'; + 	int recursion_count = 3; // arbitrary limit to avoid too deep or even infinite recursion + 	const int window_size = 1024; + 	char buffer[1024 + sizeof(token)]; /* a 1024 byte window + the size of the halt_compiler token (moving window) */ +@@ -1608,7 +1608,8 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a + 			MAPPHAR_ALLOC_FAIL("internal corruption of phar \"%s\" (truncated entry)") + 		} +  +-		if (recursion_count) { ++		if (!test && recursion_count) { ++			test = '\1'; + 			pos = buffer+tokenlen; + 			if (!memcmp(pos, gz_magic, 3)) { + 				char err = 0; +@@ -1668,6 +1669,7 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a + 				compression = PHAR_FILE_COMPRESSED_GZ; +  + 				/* now, start over */ ++				test = '\0'; + 				if (!--recursion_count) { + 					MAPPHAR_ALLOC_FAIL("unable to decompress gzipped phar archive \"%s\""); + 					break; +@@ -1709,6 +1711,7 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a + 				compression = PHAR_FILE_COMPRESSED_BZ2; +  + 				/* now, start over */ ++				test = '\0'; + 				if (!--recursion_count) { + 					MAPPHAR_ALLOC_FAIL("unable to decompress bzipped phar archive \"%s\""); + 					break; +--  +2.37.3 + diff --git a/php-bug81727.patch b/php-bug81727.patch new file mode 100644 index 0000000..3c68bfc --- /dev/null +++ b/php-bug81727.patch @@ -0,0 +1,81 @@ +From 1201102c5636961c94951b2109eddcb8c3bfd640 Mon Sep 17 00:00:00 2001 +From: Derick Rethans <github@derickrethans.nl> +Date: Fri, 9 Sep 2022 16:54:03 +0100 +Subject: [PATCH 1/3] Fix #81727: Don't mangle HTTP variable names that clash + with ones that have a specific semantic meaning. + +(cherry picked from commit 0611be4e82887cee0de6c4cbae320d34eec946ca) +(cherry picked from commit 8b300e157e92b0e945ad813d608f076b5323d721) +--- + NEWS                             |  6 ++++++ + ext/standard/tests/bug81727.phpt | 15 +++++++++++++++ + main/php_variables.c             | 14 ++++++++++++++ + 3 files changed, 35 insertions(+) + create mode 100644 ext/standard/tests/bug81727.phpt + +diff --git a/NEWS b/NEWS +index 36179eec91..6b14f93031 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,6 +1,12 @@ + PHP                                                                        NEWS + ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +  ++Backported from 7.4.31 ++ ++- Core: ++  . Fixed bug #81727: Don't mangle HTTP variable names that clash with ones ++    that have a specific semantic meaning. (CVE-2022-31629). (Derick) ++ + Backported from 7.4.30 +  + - mysqlnd: +diff --git a/ext/standard/tests/bug81727.phpt b/ext/standard/tests/bug81727.phpt +new file mode 100644 +index 0000000000..71a9cb46c8 +--- /dev/null ++++ b/ext/standard/tests/bug81727.phpt +@@ -0,0 +1,15 @@ ++--TEST-- ++Bug #81727: $_COOKIE name starting with ..Host/..Secure should be discarded ++--COOKIE-- ++..Host-test=ignore; __Host-test=correct; . Secure-test=ignore; . Elephpant=Awesome; ++--FILE-- ++<?php ++var_dump($_COOKIE); ++?> ++--EXPECT-- ++array(2) { ++  ["__Host-test"]=> ++  string(7) "correct" ++  ["__Elephpant"]=> ++  string(7) "Awesome" ++} +diff --git a/main/php_variables.c b/main/php_variables.c +index 084b10fa56..fb58986f20 100644 +--- a/main/php_variables.c ++++ b/main/php_variables.c +@@ -106,6 +106,20 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars + 	} + 	var_len = p - var; +  ++	/* Discard variable if mangling made it start with __Host-, where pre-mangling it did not start with __Host- */ ++	if (strncmp(var, "__Host-", sizeof("__Host-")-1) == 0 && strncmp(var_name, "__Host-", sizeof("__Host-")-1) != 0) { ++		zval_dtor(val); ++		free_alloca(var_orig, use_heap); ++		return; ++	} ++ ++	/* Discard variable if mangling made it start with __Secure-, where pre-mangling it did not start with __Secure- */ ++	if (strncmp(var, "__Secure-", sizeof("__Secure-")-1) == 0 && strncmp(var_name, "__Secure-", sizeof("__Secure-")-1) != 0) { ++		zval_dtor(val); ++		free_alloca(var_orig, use_heap); ++		return; ++	} ++ + 	if (var_len==0) { /* empty variable name, or variable name with a space in it */ + 		zval_dtor(val); + 		free_alloca(var_orig, use_heap); +--  +2.37.3 + @@ -28,7 +28,7 @@  %global mysql_sock %(mysql_config --socket 2>/dev/null || echo /var/lib/mysql/mysql.sock) -%global oraclever 21.6 +%global oraclever 21.7  %global oraclelib 21.1  # Build for LiteSpeed Web Server (LSAPI) @@ -143,7 +143,7 @@  Summary: PHP scripting language for creating dynamic web sites  Name: php  Version: 5.6.40 -Release: 33%{?dist} +Release: 34%{?dist}  # All files licensed under PHP version 3.01, except  # Zend is licensed under Zend  # TSRM is licensed under BSD @@ -254,6 +254,8 @@ Patch253: php-bug81026.patch  Patch254: php-bug79971.patch  Patch255: php-bug81719.patch  Patch256: php-bug81720.patch +Patch257: php-bug81727.patch +Patch258: php-bug81726.patch  # Fixes for tests (300+)  # Factory is droped from system tzdata @@ -962,8 +964,8 @@ Group: System Environment/Libraries  # All files licensed under PHP version 3.01  License: PHP  Requires: php-common%{?_isa} = %{version}-%{release} -# Upstream requires 4.0, we require 50 to ensure use of libicu-last -BuildRequires: libicu-devel >= 69 +# Upstream requires 4.0, we require 69.1 to ensure use of libicu69 +BuildRequires: libicu-devel = 69.1  Obsoletes: php53-intl, php53u-intl, php54-intl, php54w-intl, php55u-intl, php55w-intl, php56u-intl, php56w-intl  %description intl @@ -1067,6 +1069,8 @@ echo CIBLE = %{name}-%{version}-%{release} oci8=%{with_oci8} libzip=%{with_libzi  %patch254 -p1 -b .bug79971  %patch255 -p1 -b .bug81719  %patch256 -p1 -b .bug81720 +%patch257 -p1 -b .bug81727 +%patch258 -p1 -b .bug81726  # Fixes for tests  %patch300 -p1 -b .datetests @@ -2123,6 +2127,12 @@ EOF  %changelog +* Tue Sep 27 2022 Remi Collet <remi@remirepo.net> - 7.0.33-35 +- phar: fix #81726 DOS when using quine gzip file. CVE-2022-31628 +- core: fix #81727 Don't mangle HTTP variable names that clash with ones +  that have a specific semantic meaning. CVE-2022-31629 +- use oracle client library version 21.7 +  * Tue Jun  7 2022 Remi Collet <remi@remirepo.net> - 5.6.40-33  - use oracle client library version 21.6  - mysqlnd: fix #81719: mysqlnd/pdo password buffer overflow. CVE-2022-31626 | 
