From 97f8d26ba4732e7d2bc67b53c329bd70e5116639 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 17 May 2022 12:59:23 +0200 Subject: [PATCH 1/3] Fix #81720: Uninitialized array in pg_query_params() leading to RCE We must not free parameters which we haven't initialized yet. We also fix the not directly related issue, that we checked for the wrong value being `NULL`, potentially causing a segfault. (cherry picked from commit 55f6895f4b4c677272fd4ee1113acdbd99c4b5ab) (cherry picked from commit 6f979c832c861fb32e2dbad5e0cc29edcee7c500) (cherry picked from commit 310b17f5c8938389b1dbd7d8ff5a8144bfb9a351) (cherry picked from commit 9e7d6a2a1e8f43bdb86a0b6c1199f938f6ba78f5) (cherry picked from commit f8b8096675156bb0560256af790532e2a810311e) --- ext/pgsql/pgsql.c | 4 ++-- ext/pgsql/tests/bug81720.phpt | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 ext/pgsql/tests/bug81720.phpt diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index b746595250..d37bde7d1f 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -1983,7 +1983,7 @@ PHP_FUNCTION(pg_query_params) if (Z_TYPE(tmp_val) != IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error converting parameter"); zval_dtor(&tmp_val); - _php_pgsql_free_params(params, num_params); + _php_pgsql_free_params(params, i); RETURN_FALSE; } params[i] = estrndup(Z_STRVAL(tmp_val), Z_STRLEN(tmp_val)); @@ -5132,7 +5132,7 @@ PHP_FUNCTION(pg_send_execute) if (Z_TYPE(tmp_val) != IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error converting parameter"); zval_dtor(&tmp_val); - _php_pgsql_free_params(params, num_params); + _php_pgsql_free_params(params, i); RETURN_FALSE; } params[i] = estrndup(Z_STRVAL(tmp_val), Z_STRLEN(tmp_val)); diff --git a/ext/pgsql/tests/bug81720.phpt b/ext/pgsql/tests/bug81720.phpt new file mode 100644 index 0000000000..d79f1fcdd6 --- /dev/null +++ b/ext/pgsql/tests/bug81720.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #81720 (Uninitialized array in pg_query_params() leading to RCE) +--SKIPIF-- + +--FILE-- +getMessage(), PHP_EOL; +} + +try { + pg_send_prepare($conn, "my_query", 'SELECT $1, $2'); + pg_get_result($conn); + pg_send_execute($conn, "my_query", [1, new stdClass()]); +} catch (Throwable $ex) { + echo $ex->getMessage(), PHP_EOL; +} +?> +--EXPECT-- +Object of class stdClass could not be converted to string +Object of class stdClass could not be converted to string -- 2.35.3