Обход парольной защиты в линуксовых MySQL: уязвима половина доступных серверов dl // 12.06.12 11:48
Некорректное приведение типов в процедуре проверки паролей ряда сборок MySQL и MariaDB приводит к тому, что с вероятностью 1/256 удается выполнить подключение, используя любой пароль - достаточно знать имя пользователя (ну а root-то там обычно бывает). [Не забывайте при копировании материала указывать полный адрес источника: //bugtraq.ru/rsn/archive/2012/06/03.html] Затронуты версии вплоть до 5.1.61, 5.2.11, 5.3.5, 5.5.22. Разумеется, во многих конфигурациях MySQL закрыт для всех коннектов снаружи, но так бывает далеко не всегда. Ну и героический брутфорс открывает все двери за пару-тройку сотен попыток, на что уйдет менее секунды.
Уязвимые версии собраны с использованием функции memcmp из оптимизированной под SSE линуксовой glibc. Встроенная memcmp из gcc незатронута, как и memcmp из BSDшной libc.
В пересчете на реальные операционные системы, затронуты 64-битные Ubuntu версий 10.04, 10.10, 11.04, 11.10, и12.04, Fedora и OpenSUSE 12.1. Чисты Debian, Gentoo и RHEL, равно как и официальные сборки MySQL и MariaDB. Быстрое сканирование 1.74 миллиона доступных MySQL-серверов показало, что уязвимы практически 50 процентов. Звучит довольно апокалиптично - просто представьте, что половина всех доступных MySQL-серверов прямо сейчас стоит с настежь открытой дверью.
Источник проблемы - возврат функцией целочисленного значения за границами диапазона -127..128. Вообще, возвращаемым значением функции memcmp является целое число, про которое можно лишь утверждать, что оно меньше, больше, либо равно нулю в зависимости от результата сравнения переданных ей блоков памяти. Разработчики понадеялись на то, что этот результат можно безболезненно привести к своему псевдобулевскому типу (typedef char my_bool) - что, строго говоря, справедливо лишь для указанного диапазона (при подобном преобразовании просто отбрасываются старшие биты и 0x100 окажется эквивалентно 0x00). Но с учетом описания функции как возвращающей int, этого никто никогда и не обещал.
"Да это просто праздник какой-то!" (c)Карабас-Барабас
Проблема не в -1/0/1, а тупом преобразовании результата memcmp к некому типу my_bool (скорее всего, обычному char). Классическая реализация memcmp обрабатывает байт за байтом, с ней проблемы не будет. А оптимизированная небось обрабатывает по несколько байт за раз, вычитая полное слово - возвращает что-то типа 0x12345600 - последний байт 0x00 - добро пожаловать, люди добрые!
да, я уже потом посмотрел. надо будет поправить13.06.12 16:39 Автор: dl <Dmitry Leonov>