]> git.ipfire.org Git - thirdparty/postgresql.git/commit
Block environment variable mutations from trusted PL/Perl.
authorNoah Misch <noah@leadboat.com>
Mon, 11 Nov 2024 14:23:43 +0000 (06:23 -0800)
committerNoah Misch <noah@leadboat.com>
Mon, 11 Nov 2024 14:23:48 +0000 (06:23 -0800)
commit2ab12d860e51e468703a2777b3759b7a61639df2
tree945d4af076b5ed6be3455167496669dfee4a8b3a
parent2af79da563d36fb23492bf271637dc9012e98e37
Block environment variable mutations from trusted PL/Perl.

Many process environment variables (e.g. PATH), bypass the containment
expected of a trusted PL.  Hence, trusted PLs must not offer features
that achieve setenv().  Otherwise, an attacker having USAGE privilege on
the language often can achieve arbitrary code execution, even if the
attacker lacks a database server operating system user.

To fix PL/Perl, replace trusted PL/Perl %ENV with a tied hash that just
replaces each modification attempt with a warning.  Sites that reach
these warnings should evaluate the application-specific implications of
proceeding without the environment modification:

  Can the application reasonably proceed without the modification?

    If no, switch to plperlu or another approach.

    If yes, the application should change the code to stop attempting
    environment modifications.  If that's too difficult, add "untie
    %main::ENV" in any code executed before the warning.  For example,
    one might add it to the start of the affected function or even to
    the plperl.on_plperl_init setting.

In passing, link to Perl's guidance about the Perl features behind the
security posture of PL/Perl.

Back-patch to v12 (all supported versions).

Andrew Dunstan and Noah Misch

Security: CVE-2024-10979
doc/src/sgml/plperl.sgml
src/pl/plperl/GNUmakefile
src/pl/plperl/input/plperl_env.source [new file with mode: 0644]
src/pl/plperl/output/plperl_env.source [new file with mode: 0644]
src/pl/plperl/plc_trusted.pl
src/test/regress/regress.c