diff options
author | Noah Misch <noah@leadboat.com> | 2014-02-17 09:33:31 -0500 |
---|---|---|
committer | Noah Misch <noah@leadboat.com> | 2014-02-17 09:33:33 -0500 |
commit | 1d701d28a796ea2d1a4d2be9e9ee06209eaea040 (patch) | |
tree | 539b23c188cada8390ff3fbfd5b6577eb457fd27 /src/pl | |
parent | 15a8f97b9d16aaf659f58c981242b9da591cf24c (diff) | |
download | postgresql-1d701d28a796ea2d1a4d2be9e9ee06209eaea040.tar.gz postgresql-1d701d28a796ea2d1a4d2be9e9ee06209eaea040.zip |
Prevent privilege escalation in explicit calls to PL validators.
The primary role of PL validators is to be called implicitly during
CREATE FUNCTION, but they are also normal functions that a user can call
explicitly. Add a permissions check to each validator to ensure that a
user cannot use explicit validator calls to achieve things he could not
otherwise achieve. Back-patch to 8.4 (all supported versions).
Non-core procedural language extensions ought to make the same two-line
change to their own validators.
Andres Freund, reviewed by Tom Lane and Noah Misch.
Security: CVE-2014-0061
Diffstat (limited to 'src/pl')
-rw-r--r-- | src/pl/plperl/plperl.c | 4 | ||||
-rw-r--r-- | src/pl/plpgsql/src/pl_handler.c | 3 | ||||
-rw-r--r-- | src/pl/plpython/plpy_main.c | 4 |
3 files changed, 11 insertions, 0 deletions
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 7c2aee97896..49d50c44c36 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1847,6 +1847,9 @@ plperl_validator(PG_FUNCTION_ARGS) bool istrigger = false; int i; + if (!CheckFunctionValidatorAccess(fcinfo->flinfo->fn_oid, funcoid)) + PG_RETURN_VOID(); + /* Get the new function's pg_proc entry */ tuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcoid)); if (!HeapTupleIsValid(tuple)) @@ -1926,6 +1929,7 @@ PG_FUNCTION_INFO_V1(plperlu_validator); Datum plperlu_validator(PG_FUNCTION_ARGS) { + /* call plperl validator with our fcinfo so it gets our oid */ return plperl_validator(fcinfo); } diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c index 022ec3f334c..00b1a6f676f 100644 --- a/src/pl/plpgsql/src/pl_handler.c +++ b/src/pl/plpgsql/src/pl_handler.c @@ -227,6 +227,9 @@ plpgsql_validator(PG_FUNCTION_ARGS) bool istrigger = false; int i; + if (!CheckFunctionValidatorAccess(fcinfo->flinfo->fn_oid, funcoid)) + PG_RETURN_VOID(); + /* Get the new function's pg_proc entry */ tuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcoid)); if (!HeapTupleIsValid(tuple)) diff --git a/src/pl/plpython/plpy_main.c b/src/pl/plpython/plpy_main.c index c4de7622a85..384784796cc 100644 --- a/src/pl/plpython/plpy_main.c +++ b/src/pl/plpython/plpy_main.c @@ -159,6 +159,9 @@ plpython_validator(PG_FUNCTION_ARGS) Form_pg_proc procStruct; bool is_trigger; + if (!CheckFunctionValidatorAccess(fcinfo->flinfo->fn_oid, funcoid)) + PG_RETURN_VOID(); + if (!check_function_bodies) { PG_RETURN_VOID(); @@ -184,6 +187,7 @@ plpython_validator(PG_FUNCTION_ARGS) Datum plpython2_validator(PG_FUNCTION_ARGS) { + /* call plpython validator with our fcinfo so it gets our oid */ return plpython_validator(fcinfo); } #endif /* PY_MAJOR_VERSION < 3 */ |