В июле 2009 года компания Oracle выпустила очередной пакет ежеквартальных обновлений, содержащий заплатки для 30 уязвимостей в различных продуктах, 10 из которых затрагивают СУБД.
Поляков Александр 
    Ведущий аудитор компании DigitalSecurity (http://www.dsec.ru)
    Руководитель исследовательского  подразделения DigitalSecurityResearchGroup (http://www.dsecrg.ru)
В июле 2009 года компания Oracle выпустила очередной пакет ежеквартальных обновлений, содержащий заплатки для 30 уязвимостей в различных продуктах, 10 из которых затрагивают СУБД. На сайте производителя приведено описание пакета с указанием продуктов и их версий, на которые распространяется обновление: [1]
http://www.oracle.com/technology/deploy/security/critical-patch-updates/cpujul2009.html
Несколько слов о текущем обновлении
Данный релиз отличается от большинства предыдущих, в которых основная масса закрытых уязвимостей была обнаружена в PL/SQL процедурах, и для их эксплуатации требовались аутентификационные данные. Уязвимости PL/SQL инъекции во встроенных процедурах СУБД Oracle позволяли повысить привилегии обычного пользователя до роли DBA [2] или позволяли читать критичные данные в системе [3].
В данном обновлении также присутствует одна закрытая уязвимость типа PL/SQL Injection. Что самое интересное, данная уязвимость [4] была закрыта ещё в апреле 2006 года, но, как оказалось, закрыта она была недостаточно, и с некоторыми модификациями опубликованный в 2006 году эксплоит можно было использовать вплоть до последнего обновления. Старый и новый эксплоиты к данной уязвимости доступны в свободном доступе на сайте компании Red-database-security и позволяют повысить привилегии любого пользователя до роли DBA [5].
Учитывая то, что в большинстве систем присутствуют стандартные пользователи, такие как DBSNMP, SCOTT и прочие, со стандартными паролями (по нашей статистике тестирований на проникновение примерно в 90% СУБД присутствуют стандартные учётные записи со стандартными паролями [6]), и получить доступ с непривилегированной учетной не составляет труда, то данная уязвимость представляет собой реальную опасность; к тому же код эксплоита доступен для всеобщего скачивания.
Удалённые уязвимости высокой степени критичности в сетевых протоколах СУБД Oracle
Теперь сосредоточимся на более критичных уязвимостях. В июльском пакете обновлений присутствует ряд уязвимостей в сетевом протоколе Oracle NET, позволяющих провести удалённую атаку, в половине случаев случаях даже не имея авторизационных данных. Именно на них мы и заострим внимание.
Таблица 1. Уязвимости СУБД Oracle, закрытые в обновлении за июль 2009 года.
| Vuln# | Component | Protocol | Package and/or Privilege Required | Remote Exploit without Auth.? | CVSS VERSION 2.0 RISK (see Risk Matrix Definitions) | Last Affected Patch set (per Supported Release) | ||||||
| Base Score | Access Vector | Access Complexity | Authentication | Confidentiality | Integrity | Availability | ||||||
| Network Foundation | Oracle Net | None | No | 9.0 | Network | Low | Single | Complete | Complete | Complete | 9.2.0.8, 9.2.0.8DV, 10.1.0.5, 10.2.0.4, 11.1.0.7 | |
| Network Authentication | Oracle Net | None | Yes | 7.5 | Network | Low | None | Partial+ | Partial+ | Partial+ | 9.2.0.8, 9.2.0.8DV, 10.1.0.5, 10.2.0.4, 11.1.0.7 | |
| Network Foundation | Oracle Net | None | No | 7.5 | Network | Low | Single | None | Partial+ | Complete | 11.1.0.6 | |
| Advanced Replication | Oracle Net | Create Session | No | 5.5 | Network | Low | Single | Partial+ | Partial+ | None | 9.2.0.8, 9.2.0.8DV, 10.1.0.5, 10.2.0.3 | |
| CVE-2009-1966 (Oracle Enterprise Manager) | Config Management | HTTP | Valid Session | No | 5.5 | Network | Low | Single | Partial | Partial | None | 11.1.0.7 | 
| CVE-2009-1967 (Oracle Enterprise Manager) | Config Management | HTTP | Valid Session | No | 5.5 | Network | Low | Single | Partial | Partial | None | 11.1.0.7 | 
| CVE-2009-0987 | Upgrade | Oracle Net | Create Session | No | 5.5 | Network | Low | Single | Partial | Partial | None | 9.2.0.8, 9.2.0.8DV, 10.1.0.5, 10.2.0.3 | 
| CVE-2009-1973 | Virtual Private Database | Oracle Net | Access to tables with VPD policies | No | 5.5 | Network | Low | Single | Partial+ | Partial+ | None | 10.1.0.5, 10.2.0.4, 11.1.0.7 | 
| CVE-2009-1970 | Listener | Oracle Net | None | Yes | 5.0 | Network | Low | None | None | None | Partial+ | 9.2.0.8, 9.2.0.8DV, 10.1.0.5, 10.2.0.4, 11.1.0.7 | 
| Secure Enterprise Search | HTTP | None | Yes | 4.3 | Network | Medium | None | None | Partial | None | 10.1.8.3 | |
| CVE-2009-1015 | Core RDBMS | Oracle Net | Create Session | No | 4.0 | Network | Low | Single | None | Partial+ | None | 9.2.0.8, 9.2.0.8DV, 10.1.0.5, 10.2.0.4 | 
| Auditing | Oracle Net | Create Session | No | 2.1 | Network | High | Single | Partial | None | None | 9.2.0.8, 9.2.0.8DV, 10.1.0.5, 10.2.0.4, 11.1.0.7 | |
Из приведённых в официальном Advisory уязвимостей наибольший интерес представляют уязвимости, обнаруженные исследователем Денисом Юричевым:
Рассмотрим перечисленные уязвимости более подробно:
CVE-2009-1020
Уязвимости [7] присвоено 9 баллов из 10. При успешном выполнении данная уязвимость позволяет получить полный контроль над операционной системой, где установлена СУБД, с правами администратора в OS Windows (по умолчанию) или с правами пользователя Oracle в UNIX. Данной уязвимости подвержены все версии СУБД, начиная с 9g R2 и заканчивая 11i. Доступный в сети эксплоит позволяет выполнить только атаку на отказ в обслуживании.
Для реализации уязвимости требуется иметь доступ к СУБД с правами любой учётной записи, к примеру, SCOTT. Уязвимость заключается в возможности записать 4-х байтное нулевое значение в произвольное место памяти СУБД при помощи модификации сетевого пакета, который посылается клиентской программой на сервер при выполнении любого запроса, к примеру “select * from v$version”.
На самом деле критичность данной уязвимости преувеличена по двум причинам. Во-первых, злоумышленнику необходимо иметь учётную запись в СУБД, что теоретически может привести к получению административного доступа, например, способом, описанным автором в исследовании “Проникновение в ОС через приложения. Получение доступа к ОС, используя непривилегированную учётную запись в СУБД Oracle”, в которой представлен модуль для Metasploit, позволяющий получить административный доступ к ОС с правами любого пользователя СУБД [8]. Во вторых, записав значение 0 в любую ячейку памяти, мы сможем в большинстве случаем вызвать отказ в обслуживании, но чтобы выполнить произвольный код, необходимо немало постараться, и код эксплоита будет очень сильно зависеть от версии программного обеспечения Oracle и операционной системы, на которой установлена СУБД.
CVE-2009-1019
Уязвимости [9] присвоено 7.5 баллов из 10. При успешном выполнении данная уязвимость позволяет теоретически получить полный контроль над СУБД. Данной уязвимости подвержены все версии СУБД, начиная с 9g R2 и заканчивая 11i. Доступный в сети эксплоит позволяет выполнить только атаку на отказ в обслуживании.
Для реализации уязвимости не требуется никаких прав СУБД, и любой удалённый нарушитель может произвести атаку путём посылки некорректных NSPTCN пакетов на порт Листенера, что в некоторых случаях приводит к повреждению кучи и отказу в обслуживании.
Из приведённого описания понятно, что выполнение произвольного кода возможно больше в теории, но, тем не менее, удалённый отказ в обслуживании через порт Листенера при отсутствии аутентификационных данных – уязвимость достаточно критичная, особенно в периоды бухгалтерской отчётности.
CVE-2009-1063
Уязвимости [10] присвоено 7.5 баллов из 10. Успешная реализация атаки позволяет загрузить процессор на 100% и выполнить атаку на отказ в обслуживании; эксплоит для реализации данной атаки доступен в сети. Уязвимости подвержена только версия СУБД 11.1.0.6.
Данная уязвимость похожа на приведённую выше (CVE-2009-1020). Для реализации уязвимости требуется иметь доступ к СУБД с правами любой учётной записи, к примеру, SCOTT. Уязвимость возникает при перезаписи типа (изменяется тип из TTIPFN на DD) TNS протокола при посылке клиентом любого стандартного запроса типа “select * from v$version”. В результате этого, система загружается на 100%, и происходят ошибки повреждения памяти.
Критичность данной уязвимости, как и уязвимости CVE-2009-1020, на наш взгляд, не высока, так как позволяет выполнить отказ в обслуживании только при условии наличия учётной записи в системе, тем более, уязвимости подвержена только 11 версия СУБД, которая на данный момент в коммерческой эксплуатации практически не встречается.
CVE-2009-1070
Уязвимости [11] присвоено 5 баллов из 10. При успешном выполнении данная уязвимость позволяет выполнить отказ в обслуживании службы Листенера, в результате чего пользователи не смогут подключаться к СУБД. Данной уязвимости подвержены все версии СУБД, начиная с 10g R1 и заканчивая 11i. Доступный в сети эксплоит позволяет выполнить атаку на отказ в обслуживании.
Для реализации уязвимости требуется отсылать две TNS команды на порт Листенера с определёнными значениями в бесконечном цикле. Подробности описаны в официальном Advisory.
В итоге мы получаем удалённый отказ в обслуживании, для выполнения которого достаточно запустить публично доступный эксплоит.
Уязвимости средней и низкой степени критичности.
Из менее критичных уязвимостей, закрытых в данном обновлении, следует отметить:
CVE-2009-1068
Данная уязвимость [12] обнаружена специалистами DSecRG в приложении Oracle Secure Enterprise Search, которое предоставляет безопасный удалённый доступ ко всем источникам данных в организации – веб-сайтам, файловым серверам, системам управления контентом, системам планирования ресурсов и системам управления взаимодействия с заказчиком. С помощью обнаруженной уязвимости внешний нарушитель может получить доступ к сессии аутентифицированного пользователя системы.
В одной из общедоступных страниц поиска (скрипт "search") обнаружена уязвимость межсайтового скриптинга (XSS). Уязвимым параметром является search_p_groups. Злоумышленник может внедрить XSS, добавив javascript код в параметр search_p_groups, после чего отправить зарегистрированному пользователю системы письмо со ссылкой на страницу с XSS, которая является для него доверенным ресурсом и, в случае захода пользователя по ссылке, получить доступ к его сессии.
Критичность данной уязвимости по факту зависит от уровня осведомлённости пользователей и наличия специализированных средств защиты клиентских рабочих станций. Учитывая средние данные перехода по ссылке при использовании сценариев социальной инженерии (от 10% до 50%) и то, что наличие на рабочих станциях пользователей HIPS пока ещё встречается не везде, можно говорить, что данная уязвимость вполне реализуема.
CVE-2009-1021
Уязвимости [13] присвоено 2.1 балла из 10. Уязвимость обнаружена Алекандром Корнбрустом из Red-database-security и позволяет получить доступ к хэшам паролей пользователей, которые записываются в журналы аудита при смене пароля пользователя.
Хэш пароля пользователя длинной менее 9 символов в большинстве случаев можно расшифровать (“большинство случаев” – это когда используется стандартный набор символов СУБД Oracle, такой как буквы, цифры и спецсимволы @,#,$), используя rainbow tables или стандартные методы перебора, за разумное время. Об этом можно подробнее почитать в статье “Запароленная власть” [14].
Таким образом, уязвимость представляет собой опасность в случае использования слабых паролей. Для того, чтобы настроить безопасно парольную политику в СУБД Oracle, рекомендуем воспользоваться статьёй “Настройка парольной политики в СУБД Oracle”, доступной на ресурсе PCIDSS.RU [15]
Альтернативный вариант защиты
В качестве альтернативного решения для защиты от атак на Листенер, а также в целом для повышения уровня защищённости, рекомендуется разграничить доступ к Листенеру. Разграничение осуществляется при помощи технологии “valid node checking”, что на практике реализуется путём добавления нескольких строк в конфигурационный файл sqlnet.ora, находящийся в директории $ORACLE_HOME/network/admin/. Пример:
tcp.validnode_checking  = yes 
  tcp.invited_nodes  = (192.168.0.1, 192.168.0.2, Adminstation,  …) 
Директива tcp.validnode_checking включает ограничение по IP адресам. Директива tcp.invited_nodes позволяет задавать список разрешённых адресов. Разрешено вводить только отдельные IP адреса и имена хостов. Список подсетей вводить запрещено. Также существует директива tcp.excluded_nodes, которая позволяет задавать список запрещённых адресов, но рекомендуется использовать “белый список”. Более подробно о защите Листенера и безопасности СУБД Oracle в целом, можно прочитать в недавно вышедшей книге “Безопасность Oracle глазами аудитора: нападение и защита”. [16]
Ссылки
Digital Security - одна из ведущих российских консалтинговых компаний в области информационной безопасности. Digital Security более семи лет работает на всей территории России, стран СНГ и Балтии. Все специалисты отдела аудита и аналитики имеют многолетний практический опыт выполнения работ в области ИБ, включая аудит на соответствие ISO 27001 и PCI DSS. Вся информация о деятельности компании доступна по адресам: www.dsec.ru, www.dsecrg.ru, www.pcidss.ru
Лечим цифровую неграмотность без побочных эффектов