Хакер #305. Многошаговые SQL-инъекции
e-Matters обнаружил две уязвимости в MySQL сервере, которые могут использоваться любым MySQL пользователем, чтобы нарушить работу сервера. Кроме того,
одна из обнаруженных уязвимостей может использоваться для обхода проверки пароля в MySQL сервере и выполнению произвольного кода с привилегиями MySQLd пользователя.
e-Matters также обнаружил переполнение динамической памяти в клиентской библиотеке и еще одну уязвимость, которая позволяет записывать '\0' в любой адрес памяти. Оба недостатка могут использоваться для DoS атаки или выполнению произвольного кода в любых приложениях, использующих
libmysqlclient.
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 библиотека получает строки ответа от сервера, она копирует ответ в другой буфер.
Происходит это без проверки, находятся ли сохраненные размеры поля в пределах границ адресуемого буфера. В конце всех полей есть дополнительный символ '\0', для которого не выделяется дополнительное место в границах адресуемого буфера. Вследствие того, что эта ошибка уже вызвана простым запросом SELECT, все приложения или библиотеки, использующие libMySQL, потенциально уязвимы. Из-за природы этой ошибки, ее можно тривиально эксплуатировать против клиентских приложений (например, используя отрицательный размер поля). Так как происходит переполнение, уязвимость может использоваться для выполнения буфера. Однако успешная эксплуатация сильно зависит от используемого приложения.
Уязвимые системы: MySQL 3.23.53a и более ранние версии, MySQL 4.0.5a и более ранние версии.