• Joe Conway's avatar
    Plug RLS related information leak in pg_stats view. · 7b4bfc87
    Joe Conway authored
    The pg_stats view is supposed to be restricted to only show rows
    about tables the user can read. However, it sometimes can leak
    information which could not otherwise be seen when row level security
    is enabled. Fix that by not showing pg_stats rows to users that would
    be subject to RLS on the table the row is related to. This is done
    by creating/using the newly introduced SQL visible function,
    row_security_active().
    
    Along the way, clean up three call sites of check_enable_rls(). The second
    argument of that function should only be specified as other than
    InvalidOid when we are checking as a different user than the current one,
    as in when querying through a view. These sites were passing GetUserId()
    instead of InvalidOid, which can cause the function to return incorrect
    results if the current user has the BYPASSRLS privilege and row_security
    has been set to OFF.
    
    Additionally fix a bug causing RI Trigger error messages to unintentionally
    leak information when RLS is enabled, and other minor cleanup and
    improvements. Also add WITH (security_barrier) to the definition of pg_stats.
    
    Bumped CATVERSION due to new SQL functions and pg_stats view definition.
    
    Back-patch to 9.5 where RLS was introduced. Reported by Yaroslav.
    Patch by Joe Conway and Dean Rasheed with review and input by
    Michael Paquier and Stephen Frost.
    7b4bfc87
rules.out 108 KB