Thread: Is this a security oversight?

Is this a security oversight?

From
Ben Tilly
Date:
As a security rule, you cannot create a cast without owning one of the types.  This was a problem for me because I wanted a cast from bool to bigint, and there isn't one.

The following code successfully creates it, not as postgres and not as a superuser.  I'm glad it works, but the ease of this eliminates most of why I think you might want a security rule like the above:

CREATE OR REPLACE FUNCTION public.to_bigint (p_bool BOOL)
    RETURNS BIGINT
language 'sql' AS $$
    SELECT p_bool::int::bigint;
$$;
do $$
    DECLARE
        v_owner TEXT;
    BEGIN
        SELECT rolname::text
        FROM pg_type t
          JOIN pg_roles r
            ON t.typowner = r.oid
        WHERE t.typname = 'bool'
        INTO v_owner;

        ALTER TYPE bool OWNER TO current_user;

        DROP CAST IF EXISTS (bool AS bigint);

        CREATE CAST (bool AS bigint)
            WITH FUNCTION public.to_bigint;

        EXECUTE 'ALTER TYPE bool OWNER TO ' || v_owner;
    END
$$;

Re: Is this a security oversight?

From
Tom Lane
Date:
Ben Tilly <btilly@gmail.com> writes:
> As a security rule, you cannot create a cast without owning one of the
> types.

Check.

> The following code successfully creates it, not as postgres and not as a
> superuser.

Really?  When I try that as an ordinary user, I get

ERROR:  must be owner of type boolean
CONTEXT:  SQL statement "ALTER TYPE bool OWNER TO current_user"
PL/pgSQL function inline_code_block line 12 at SQL statement

If there is a way where that actually does work without superuser
privileges, please send the details to security@postgresql.org.

            regards, tom lane



Re: Is this a security oversight?

From
Ben Tilly
Date:
Bizarre, I thought I had tested that by dropping superuser and trying it.  But I must not have.

In that case please modify this to a request to allow casts to be created by a superuser without having to change the ownership of the objects involved.

On Tue, Aug 10, 2021 at 11:32 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Ben Tilly <btilly@gmail.com> writes:
> As a security rule, you cannot create a cast without owning one of the
> types.

Check.

> The following code successfully creates it, not as postgres and not as a
> superuser.

Really?  When I try that as an ordinary user, I get

ERROR:  must be owner of type boolean
CONTEXT:  SQL statement "ALTER TYPE bool OWNER TO current_user"
PL/pgSQL function inline_code_block line 12 at SQL statement

If there is a way where that actually does work without superuser
privileges, please send the details to security@postgresql.org.

                        regards, tom lane

Re: Is this a security oversight?

From
Tom Lane
Date:
Ben Tilly <btilly@gmail.com> writes:
> In that case please modify this to a request to allow casts to be created
> by a superuser without having to change the ownership of the objects
> involved.

I think you're still confused.  That case does work.

            regards, tom lane