From 19e17d3807e6cc0b1ba9443ec5facbd33a61f8fe Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sat, 12 Oct 2019 15:56:16 +0100 Subject: [PATCH] Fix bug #78599 (env_path_info underflow can lead to RCE) (CVE-2019-11043) (cherry picked from commit ab061f95ca966731b1c84cf5b7b20155c0a1c06a) --- NEWS | 2 + sapi/fpm/fpm/fpm_main.c | 4 +- .../tests/bug78599-path-info-underflow.phpt | 61 +++++++++++++++++++ sapi/fpm/tests/tester.inc | 11 +++- 4 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 sapi/fpm/tests/bug78599-path-info-underflow.phpt diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 483fabe9d850..dfc0d8f7413c 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1148,8 +1148,8 @@ static void init_request_info(void) path_info = script_path_translated + ptlen; tflag = (slen != 0 && (!orig_path_info || strcmp(orig_path_info, path_info) != 0)); } else { - path_info = env_path_info ? env_path_info + pilen - slen : NULL; - tflag = (orig_path_info != path_info); + path_info = (env_path_info && pilen > slen) ? env_path_info + pilen - slen : NULL; + tflag = path_info && (orig_path_info != path_info); } if (tflag) { diff --git a/sapi/fpm/tests/bug78599-path-info-underflow.phpt b/sapi/fpm/tests/bug78599-path-info-underflow.phpt new file mode 100644 index 000000000000..edd4e0d49699 --- /dev/null +++ b/sapi/fpm/tests/bug78599-path-info-underflow.phpt @@ -0,0 +1,61 @@ +--TEST-- +FPM: bug78599 - env_path_info underflow - CVE-2019-11043 +--SKIPIF-- + +--FILE-- +start(); +$tester->expectLogStartNotices(); +$uri = $tester->makeSourceFile(); +$tester + ->request( + '', + [ + 'SCRIPT_FILENAME' => $uri . "/" . str_repeat('A', 35), + 'PATH_INFO' => '', + 'HTTP_HUI' => str_repeat('PTEST', 1000), + ], + $uri + ) + ->expectBody( + [ + 'Test Start', + 'string(0) ""', + 'Test End' + ] + ); +$tester->terminate(); +$tester->close(); + +?> +Done +--EXPECT-- +Done +--CLEAN-- + diff --git a/sapi/fpm/tests/tester.inc b/sapi/fpm/tests/tester.inc index 001b7d6a54ea..188fd4885943 100644 --- a/sapi/fpm/tests/tester.inc +++ b/sapi/fpm/tests/tester.inc @@ -513,7 +513,7 @@ class Tester return new Response(null, true); } if (is_null($uri)) { - $uri = $this->makeFile('src.php', $this->code); + $uri = $this->makeSourceFile(); } $params = array_merge( @@ -538,7 +538,6 @@ class Tester ], $headers ); - try { $this->response = new Response( $this->getClient($address, $connKeepAlive)->request_data($params, false) @@ -944,6 +943,14 @@ class Tester return $filePath; } + /** + * @return string + */ + public function makeSourceFile() + { + return $this->makeFile('src.php', $this->code); + } + /** * @param string|null $msg */