Security Lab

Множественные уязвимости в MySQL сервере

Дата публикации:17.12.2002
Дата изменения:01.05.2008
Всего просмотров:2212
Опасность:
Низкая
Наличие исправления: Да
Количество уязвимостей:1
CVE ID: CVE-2002-1373
CVE-2002-1374
Вектор эксплуатации: Локальная
Воздействие: Отказ в обслуживании
Повышение привилегий
CWE ID: Нет данных
Наличие эксплоита: Нет данных
Уязвимые продукты: MySQL 3.x
MySQL 4.x
Описание: e-Matters обнаружил две уязвимости в MySQL сервере, которые могут использоваться любым MySQL пользователем, чтобы нарушить работу сервера. Кроме того, Одна из обнаруженных уязвимостей может использоваться для обхода проверки пароля в MySQL сервере и выполнению произвольного кода с привилегиями MySQLd пользователя.

e-Matters также обнаружил переполнение динамической памяти в клиентской библиотеке и еще одну уязвимость, которая позволяет записывать '\' в любой адрес памяти. Оба недостатка могут использоваться для DoS атаки или выполнению произвольного кода в любых приложениях, использующих libmysqlclient.

Уязвимые системы: MySQL 3.23.53a и более ранние версии, MySQL 4.0.5a и более ранние версии

При ревизии исходного кода MySQL сервера, e-Matters обнаружил несколько уязвимостей в MySQL клиенте и сервере, которые описаны ниже:

  1. {SERVER} COM_TABLE_DUMP - Signed Integer Vulnerability

    При обработке COM_TABLE_DUMP пакета, MySQL берет 2 символа из пакета, преобразует их к целому числу без знака и использует их как параметр длины для memcpy. Очевидно, отрицательные значения символов превратятся в очень большие числа без знака. Поскольку произойдет операция копирования динамической памяти в динамическую память, и нет никакой функции распределения памяти внутри SIGSEGV обработчика, мы полагаем, что эта ошибка может использоваться только для DoS нападений. В зависимости от версии MySQLd пакета, работа программы аварийно завершится или зависнет в зацикливании ошибок сегментации. Уязвимость проверена против Windows, Linux и FreeBSD систем.

  2. +++ SERVER +++ COM_CHANGE_USER - Password Length Vulnerability

    В феврале 2000 Роберт ван дер Меулен обнаружил недостаток в системе идентификации MySQL: challenge/response алгоритм MySQL создает ожидаемый ответ с точно длиной ответа, обеспеченного клиентом. Т.е. если клиент посылает только один символ в ответ, MySQL проверит только один байт. Это означает, что можно дать правильный ответ, используя только 32 попытки. Для устранения этой ошибки, авторы просто добавили проверку на сервере, что ответ должен быть длиной 8 символов.

    Однако они забыли добавить эту проверку к команде COM_CHANGE_USER. Так что нападающий, с допустимой MySQL учетной записью, все еще может скомпрометировать другие учетные записи, которым позволено войти от того же самого хоста. Для локального пользователя это означает, что он может войти под учетной записью MySQL и получить полный контроль над всеми базами данных. Уязвимость особенно опасна в общедоступной среде или если root пользователю разрешено войти в систему из других хостов, отличных от localhost. В то время, как нападающий может послать однобайтовый ответ, чтобы войти под другими учетными записями, он может также послать ответ с завышенными размерами. Если ответ длиннее 16 символов, произойдет переполнение стека. Если ответ достаточно длинен, то можно перезаписать сохраненный указатель инструкций (instruction pointer) байтами, которые сгенерированны генератором случайных чисел в алгоритме проверки пароля. Хотя, как кажется, это практически невозможно эксплуатировать, e-Matter успешно эксплуатировал эту ошибку на LINUX системах. Вследствие того, что MySQL перезапускается при аварийном отказе, у вас есть неограниченное число попыток для эксплуатации уязвимости. Из-за ограниченного набора символов, сгенерированных генератором случайных чисел, мы полагаем, что эта ошибка не может эксплуатироваться на Windows системах, потому что невозможно перезаписать указатель инструкций управляемыми адресами.

  3. +++ CLIENT +++ libmysqlclient read_rows Overflow

    Когда клиентская MySQL библиотека получает строки ответа от сервера, она копирует ответ в другой буфер. При происходит без проверки, находятся ли сохраненные размеры поля в пределах границ адресуемого буфера. В конце всех полей есть дополнительный символ '\', для которого не выделяется дополнительное место в буфере. Вследствие того, что эта ошибка может быть вызвана простым запросом SELECT, все приложения или библиотеки, использующие libMySQL, потенциально уязвимы. Из-за природы этой ошибки, ее можно тривиально эксплуатировать против клиентских приложений (например, используя отрицательный размер поля). Так как происходит переполнение, уязвимость может использоваться для выполнения произвольного кода. Однако успешная эксплуатация сильно зависит от используемого приложения. Это зависит главным образом от того, является ли malloc() переполнение годным для использования на специфической системе и позволяет ли приложение управлять структурой динамической памяти.

  4. +++ CLIENT +++ libmysqlclient read_one_row Byte Overwrittes Когда клиентская MySQL библиотека выбирает одну строку в MySQL сервере, она запоминает указатели на значения полей. Размерам поля доверяют и их границы не проверяются. После запоминания указателя, предыдущее поле обнуляется. Некорректный пакет может представить любой размер поля, который перезапишет некоторый произвольный адрес памяти на '\'. Недопустимый адрес, конечно, приведет к аварийному завершению работы клиента. Поскольку перезаписываемый адрес произволен, все клиенты, которые используют этот механизм, вероятно уязвимы к выполнению произвольного кода. Должно быть упомянуто, что нападающий может использовать комбинацию описанных нападений, чтобы войти в систему или получить повышенные привилегии. Например, локальный пользователь может разрушить сервер, используя COM_TABLE_DUMP уязвимость, затем создать поддельный MySQL сервер на 3306 порту. С поддельным сервером он может эксплуатировать переполнение libmysqlclient.
Все уязвимости полностью устранены в MySQL 3.23.54
Ссылки: источник