mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Improve RLS handling in copy.c
To avoid a race condition where the relation being COPY'd could be changed into a view or otherwise modified, keep the original lock on the relation. Further, fully qualify the relation when building the query up. Also remove the poorly thought-out Assert() and check the entire relationOids list as, post-RLS, there can certainly be multiple relations involved and the planner does not guarantee their ordering. Per discussion with Noah and Andres. Back-patch to 9.5 where RLS was introduced.
This commit is contained in:
@ -2672,7 +2672,7 @@ COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok
|
||||
6,1679091c5a880faf6fb5e6087eb1b2dc
|
||||
8,c9f0f895fb98ab9159f51fd0297e236d
|
||||
10,d3d9446802a44259755d38e6d163e820
|
||||
-- Check COPY TO as user without permissions.SET row_security TO OFF;
|
||||
-- Check COPY TO as user without permissions. SET row_security TO OFF;
|
||||
SET SESSION AUTHORIZATION rls_regress_user2;
|
||||
SET row_security TO OFF;
|
||||
COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - insufficient to bypass rls
|
||||
@ -2683,6 +2683,53 @@ ERROR: permission denied for relation copy_t
|
||||
SET row_security TO FORCE;
|
||||
COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - permission denied
|
||||
ERROR: permission denied for relation copy_t
|
||||
-- Check COPY relation TO; keep it just one row to avoid reordering issues
|
||||
RESET SESSION AUTHORIZATION;
|
||||
SET row_security TO ON;
|
||||
CREATE TABLE copy_rel_to (a integer, b text);
|
||||
CREATE POLICY p1 ON copy_rel_to USING (a % 2 = 0);
|
||||
ALTER TABLE copy_rel_to ENABLE ROW LEVEL SECURITY;
|
||||
GRANT ALL ON copy_rel_to TO rls_regress_user1, rls_regress_exempt_user;
|
||||
INSERT INTO copy_rel_to VALUES (1, md5('1'));
|
||||
-- Check COPY TO as Superuser/owner.
|
||||
RESET SESSION AUTHORIZATION;
|
||||
SET row_security TO OFF;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ',';
|
||||
1,c4ca4238a0b923820dcc509a6f75849b
|
||||
SET row_security TO ON;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ',';
|
||||
1,c4ca4238a0b923820dcc509a6f75849b
|
||||
SET row_security TO FORCE;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ',';
|
||||
-- Check COPY TO as user with permissions.
|
||||
SET SESSION AUTHORIZATION rls_regress_user1;
|
||||
SET row_security TO OFF;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - insufficient to bypass rls
|
||||
ERROR: insufficient privilege to bypass row security.
|
||||
SET row_security TO ON;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
SET row_security TO FORCE;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
-- Check COPY TO as user with permissions and BYPASSRLS
|
||||
SET SESSION AUTHORIZATION rls_regress_exempt_user;
|
||||
SET row_security TO OFF;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
1,c4ca4238a0b923820dcc509a6f75849b
|
||||
SET row_security TO ON;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
SET row_security TO FORCE;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
-- Check COPY TO as user without permissions. SET row_security TO OFF;
|
||||
SET SESSION AUTHORIZATION rls_regress_user2;
|
||||
SET row_security TO OFF;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied
|
||||
ERROR: permission denied for relation copy_rel_to
|
||||
SET row_security TO ON;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied
|
||||
ERROR: permission denied for relation copy_rel_to
|
||||
SET row_security TO FORCE;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied
|
||||
ERROR: permission denied for relation copy_rel_to
|
||||
-- Check COPY FROM as Superuser/owner.
|
||||
RESET SESSION AUTHORIZATION;
|
||||
SET row_security TO OFF;
|
||||
@ -2731,6 +2778,7 @@ COPY copy_t FROM STDIN; --fail - permission denied.
|
||||
ERROR: permission denied for relation copy_t
|
||||
RESET SESSION AUTHORIZATION;
|
||||
DROP TABLE copy_t;
|
||||
DROP TABLE copy_rel_to CASCADE;
|
||||
-- Check WHERE CURRENT OF
|
||||
SET SESSION AUTHORIZATION rls_regress_user0;
|
||||
CREATE TABLE current_check (currentid int, payload text, rlsuser text);
|
||||
|
@ -1028,7 +1028,7 @@ COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok
|
||||
SET row_security TO FORCE;
|
||||
COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --ok
|
||||
|
||||
-- Check COPY TO as user without permissions.SET row_security TO OFF;
|
||||
-- Check COPY TO as user without permissions. SET row_security TO OFF;
|
||||
SET SESSION AUTHORIZATION rls_regress_user2;
|
||||
SET row_security TO OFF;
|
||||
COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - insufficient to bypass rls
|
||||
@ -1037,6 +1037,54 @@ COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail
|
||||
SET row_security TO FORCE;
|
||||
COPY (SELECT * FROM copy_t ORDER BY a ASC) TO STDOUT WITH DELIMITER ','; --fail - permission denied
|
||||
|
||||
-- Check COPY relation TO; keep it just one row to avoid reordering issues
|
||||
RESET SESSION AUTHORIZATION;
|
||||
SET row_security TO ON;
|
||||
CREATE TABLE copy_rel_to (a integer, b text);
|
||||
CREATE POLICY p1 ON copy_rel_to USING (a % 2 = 0);
|
||||
|
||||
ALTER TABLE copy_rel_to ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
GRANT ALL ON copy_rel_to TO rls_regress_user1, rls_regress_exempt_user;
|
||||
|
||||
INSERT INTO copy_rel_to VALUES (1, md5('1'));
|
||||
|
||||
-- Check COPY TO as Superuser/owner.
|
||||
RESET SESSION AUTHORIZATION;
|
||||
SET row_security TO OFF;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ',';
|
||||
SET row_security TO ON;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ',';
|
||||
SET row_security TO FORCE;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ',';
|
||||
|
||||
-- Check COPY TO as user with permissions.
|
||||
SET SESSION AUTHORIZATION rls_regress_user1;
|
||||
SET row_security TO OFF;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - insufficient to bypass rls
|
||||
SET row_security TO ON;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
SET row_security TO FORCE;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
|
||||
-- Check COPY TO as user with permissions and BYPASSRLS
|
||||
SET SESSION AUTHORIZATION rls_regress_exempt_user;
|
||||
SET row_security TO OFF;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
SET row_security TO ON;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
SET row_security TO FORCE;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --ok
|
||||
|
||||
-- Check COPY TO as user without permissions. SET row_security TO OFF;
|
||||
SET SESSION AUTHORIZATION rls_regress_user2;
|
||||
SET row_security TO OFF;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied
|
||||
SET row_security TO ON;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied
|
||||
SET row_security TO FORCE;
|
||||
COPY copy_rel_to TO STDOUT WITH DELIMITER ','; --fail - permission denied
|
||||
|
||||
-- Check COPY FROM as Superuser/owner.
|
||||
RESET SESSION AUTHORIZATION;
|
||||
SET row_security TO OFF;
|
||||
@ -1090,6 +1138,7 @@ COPY copy_t FROM STDIN; --fail - permission denied.
|
||||
|
||||
RESET SESSION AUTHORIZATION;
|
||||
DROP TABLE copy_t;
|
||||
DROP TABLE copy_rel_to CASCADE;
|
||||
|
||||
-- Check WHERE CURRENT OF
|
||||
SET SESSION AUTHORIZATION rls_regress_user0;
|
||||
|
Reference in New Issue
Block a user