postgres.git / summary / log / commit / refs

commit    993b3e50845134e863968bcdaf148ff3e576c74a
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Thu Feb 23 20:39:14 2012 +0000
First released in: 9.2.0, 8.3.18, 8.4.11, 9.0.7, 9.1.3

    Require execute permission on the trigger function for CREATE TRIGGER.
    
    This check was overlooked when we added function execute permissions to the
    system years ago.  For an ordinary trigger function it's not a big deal,
    since trigger functions execute with the permissions of the table owner,
    so they couldn't do anything the user issuing the CREATE TRIGGER couldn't
    have done anyway.  However, if a trigger function is SECURITY DEFINER,
    that is not the case.  The lack of checking would allow another user to
    install it on his own table and then invoke it with, essentially, forged
    input data; which the trigger function is unlikely to realize, so it might
    do something undesirable, for instance insert false entries in an audit log
    table.
    
    Reported by Dinesh Kumar, patch by Robert Haas
    
    Security: CVE-2012-0866


doc/src/sgml/ref/create_trigger.sgml | 3 ++- src/backend/commands/trigger.c | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/create_trigger.sgml b/doc/src/sgml/ref/create_trigger.sgml index 8d7574319f9..ecb1f56cbfe 100644 --- a/doc/src/sgml/ref/create_trigger.sgml +++ b/doc/src/sgml/ref/create_trigger.sgml @@ -183,7 +183,8 @@ CREATE TRIGGER <replaceable class="PARAMETER">name</replaceable> { BEFORE | AFTE <para> To create a trigger on a table, the user must have the - <literal>TRIGGER</literal> privilege on the table. + <literal>TRIGGER</literal> privilege on the table. The user must + also have <literal>EXECUTE</literal> privilege on the trigger function. </para> <para> diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index e3c771a933f..cadca5c01b0 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -161,6 +161,10 @@ CreateTrigger(CreateTrigStmt *stmt, Oid constraintOid, bool checkPermissions) * Find and validate the trigger function. */ funcoid = LookupFuncName(stmt->funcname, 0, fargtypes, false); + aclresult = pg_proc_aclcheck(funcoid, GetUserId(), ACL_EXECUTE); + if (aclresult != ACLCHECK_OK) + aclcheck_error(aclresult, ACL_KIND_PROC, + NameListToString(stmt->funcname)); funcrettype = get_func_rettype(funcoid); if (funcrettype != TRIGGEROID) { [parent: 94e2495ded97]