Oracle 19c是否存在权限提升漏洞?两类实验相关疑问咨询
实验1:普通DBA用户AAA执行BBB函数导致BBB获DBA权限
实验步骤(SQL代码)
-- SYS用户操作 CREATE USER AAA IDENTIFIED BY 123456789; CREATE USER BBB IDENTIFIED BY 123456789; GRANT CREATE SESSION TO AAA; GRANT CREATE SESSION TO BBB; GRANT DBA TO AAA; -- AAA用户操作 GRANT CREATE PROCEDURE TO BBB; -- BBB用户操作 CREATE OR REPLACE FUNCTION GET_DBA RETURN VARCHAR AUTHID CURRENT_USER IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE 'GRANT DBA TO BBB'; RETURN 'Granted'; EXCEPTION WHEN OTHERS THEN RETURN SQLERRM; END; / GRANT EXECUTE ON GET_DBA TO PUBLIC; -- AAA用户操作 SELECT BBB.GET_DBA() FROM DUAL;
实验结果
AAA执行BBB的函数后,BBB权限被提升至DBA。
问题解答
安全性分析:
此情况属于严重的数据库安全风险。低权限用户BBB仅拥有CREATE SESSION和CREATE PROCEDURE权限,却能借助普通DBA用户AAA的执行上下文,通过自治事务给自己授予最高权限DBA,完全突破了权限隔离的边界,可能导致数据泄露、篡改、系统破坏等恶性后果。参考安全模型:
- 最小权限原则(Least Privilege Principle):这是信息安全领域的核心模型之一,要求用户仅拥有完成工作所需的最低权限。实验中AAA被授予完整DBA权限,而实际仅需执行函数的权限,违反了该原则;同时BBB的权限被不当提升,也违背了最小权限的约束。
- Oracle权限上下文模型:存储对象的
AUTHID属性决定了执行时的权限上下文,AUTHID CURRENT_USER表示以调用者的权限执行。结合自治事务(PRAGMA AUTONOMOUS_TRANSACTION)的特性,导致调用者的高权限被滥用,这也是Oracle权限控制中需要重点防范的场景。
实验2:SYS用户执行BBB函数报错ORA-06598
实验场景
移除实验1中的AAA用户,改用Oracle自带的SYS用户作为DBA用户执行SELECT BBB.GET_DBA() FROM DUAL;,操作失败,报错ORA-06598: INHERIT PRIVILEGES权限不足。
问题解答
继承权限的含义:
INHERIT PRIVILEGES是Oracle 12c及以后版本引入的权限,用于控制用户是否允许其他用户继承自己的权限来执行存储对象。当存储对象以AUTHID CURRENT_USER模式执行时,调用者需要被授予INHERIT PRIVILEGES ON <对象所有者>,或者对象所有者拥有INHERIT ANY PRIVILEGES系统权限,才能继承调用者的权限执行对象内的操作。报错原因:
SYS作为Oracle的最高特权用户,默认情况下不会向普通用户授予INHERIT PRIVILEGES ON SYS权限,也不会允许普通用户通过INHERIT ANY PRIVILEGES继承其权限。当SYS执行BBB的函数时,函数以AUTHID CURRENT_USER(即SYS的身份)执行,需要BBB拥有继承SYS权限的许可,但该许可不存在,因此触发ORA-06598错误。是否属于安全漏洞:
- 实验1的情况属于可利用的权限提升漏洞:普通DBA用户的权限未被有效限制,导致低权限用户可以通过构造带自治事务的存储对象滥用其权限,突破权限控制。
- 实验2的情况不属于漏洞:这是Oracle针对特权用户(如SYS、SYSTEM)设计的安全防护机制,目的是防止普通用户借助特权用户的上下文提升权限,是预期的安全控制行为。
内容的提问来源于stack exchange,提问作者仰望星空

