Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit04e5606

Browse files
committed
Handle RLS dependencies in inlined set-returning functions properly.
If an SRF in the FROM clause references a table having row-levelsecurity policies, and we inline that SRF into the calling query,we neglected to mark the plan as potentially dependent on whichrole is executing it. This could lead to later executions in thesame session returning or hiding rows that should have been hiddenor returned instead.Our thanks to Wolfgang Walther for reporting this problem.Stephen Frost and Tom LaneSecurity:CVE-2023-2455
1 parentdbd5795 commit04e5606

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

‎src/backend/optimizer/util/clauses.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5143,6 +5143,13 @@ inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte)
51435143
*/
51445144
record_plan_function_dependency(root,func_oid);
51455145

5146+
/*
5147+
* We must also notice if the inserted query adds a dependency on the
5148+
* calling role due to RLS quals.
5149+
*/
5150+
if (querytree->hasRowSecurity)
5151+
root->glob->dependsOnRole= true;
5152+
51465153
returnquerytree;
51475154

51485155
/* Here if func is not inlinable: release temp memory and return NULL */

‎src/test/regress/expected/rowsecurity.out

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4455,6 +4455,33 @@ SELECT * FROM rls_tbl;
44554455

44564456
DROP TABLE rls_tbl;
44574457
RESET SESSION AUTHORIZATION;
4458+
-- CVE-2023-2455: inlining an SRF may introduce an RLS dependency
4459+
create table rls_t (c text);
4460+
insert into rls_t values ('invisible to bob');
4461+
alter table rls_t enable row level security;
4462+
grant select on rls_t to regress_rls_alice, regress_rls_bob;
4463+
create policy p1 on rls_t for select to regress_rls_alice using (true);
4464+
create policy p2 on rls_t for select to regress_rls_bob using (false);
4465+
create function rls_f () returns setof rls_t
4466+
stable language sql
4467+
as $$ select * from rls_t $$;
4468+
prepare q as select current_user, * from rls_f();
4469+
set role regress_rls_alice;
4470+
execute q;
4471+
current_user | c
4472+
-------------------+------------------
4473+
regress_rls_alice | invisible to bob
4474+
(1 row)
4475+
4476+
set role regress_rls_bob;
4477+
execute q;
4478+
current_user | c
4479+
--------------+---
4480+
(0 rows)
4481+
4482+
RESET ROLE;
4483+
DROP FUNCTION rls_f();
4484+
DROP TABLE rls_t;
44584485
--
44594486
-- Clean up objects
44604487
--

‎src/test/regress/sql/rowsecurity.sql

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2151,6 +2151,26 @@ SELECT * FROM rls_tbl;
21512151
DROPTABLE rls_tbl;
21522152
RESET SESSION AUTHORIZATION;
21532153

2154+
-- CVE-2023-2455: inlining an SRF may introduce an RLS dependency
2155+
createtablerls_t (ctext);
2156+
insert into rls_tvalues ('invisible to bob');
2157+
altertable rls_t enable row level security;
2158+
grantselecton rls_t to regress_rls_alice, regress_rls_bob;
2159+
create policy p1on rls_t forselect to regress_rls_alice using (true);
2160+
create policy p2on rls_t forselect to regress_rls_bob using (false);
2161+
createfunctionrls_f () returns setof rls_t
2162+
stable language sql
2163+
as $$select*from rls_t $$;
2164+
prepare qasselectcurrent_user,*from rls_f();
2165+
set role regress_rls_alice;
2166+
execute q;
2167+
set role regress_rls_bob;
2168+
execute q;
2169+
2170+
RESET ROLE;
2171+
DROPFUNCTION rls_f();
2172+
DROPTABLE rls_t;
2173+
21542174
--
21552175
-- Clean up objects
21562176
--

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp