The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Опубликованы детали критической уязвимости в MySQL и MariaDB

09.06.2012 23:48

Представлена детальная информация об уязвимости, исправленной в недавно выпущенных обновлениях MariaDB 5.5.23/5.3.6/5.1.62/5.2.12 и MySQL 5.5.24/5.1.63/5.6.6 (все более ранние релизы подвержены проблеме). Уязвимость позволяет злоумышленнику осуществить аутентифицированный вход под любым пользователем без ввода корректного пароля.

Из-за ошибки в коде сравнения хэшей от паролей, переданный пароль мог быть признан эквивалентным эталонному даже при возврате ненулевого значения функцией memcmp(), используемой для сравнения. Вероятность подобного исхода составляет 1 из 256, т.е. злоумышленник может за примерно 300 попыток подключиться к СУБД, указав любое значение в качестве пароля. Эксплуатация проблемы может быть совершена любым клиентом, без необходимости модификации libmysqlclient. Суть проблемы сводится к тому, что функция проверки пароля в MySQL определена как "my_bool check_scramble(...)", но итоговый "return memcmp(...)" в данной функции не всегда возвращал данные в диапазоне -128..127, укладывающемся в тип my_bool, поэтому при определённом стечении обстоятельств возвращаемое memcmp ненулевое значение вне данного диапазона в результате приведения типов становилось нулём.

Положительным моментом является то, что не все сборки MySQL и MariaDB эксплуатируемы - очень многое зависит от того на какой платформе и как произведена сборка. Например, распространяемые разработчиками MySQL и MariaDB бинарные пакеты проблеме не подвержены. Предпосылкой к возникновению проблемы является возможность возвращения некоторыми реализациями memcmp() произвольных целых значений, не попадающих в диапазон -128..127. Например, реализации memcmp() из BSD libc и GCC не подвержены проблеме, а оптимизированная с использованием SSE-инструкций реализация memcmp() из Linux Glibc подвержена проблеме (GCC обычно использует собственную реализацию).

Дополнение: проверка версий MySQL поставляемых в дистрибутивах показала, что уязвимости подвержены пакеты для 64-разрядных выпусков Ubuntu Linux (с 10.04 по 12.04), OpenSuSE 12.1, Fedora 16 и Arch Linux. Не подвержены уязвимости официальные сборки с сайтов проектов, а также пакеты из состава Red Hat Enterprise Linux, CentOS, выпусков Ubuntu для 32-разрядных систем, Debian Linux (Squeeze, Lenny), Gentoo 64-bit.

Проверить наличие проблемы на своём сервере можно запустив приложение для оценки поведения memcmp или выполнив простой тест:


   for i in `seq 1 1000`; do mysql -u root --password=bad -h 127.0.0.1 2>/dev/null; done


  1. Главная ссылка к новости (http://permalink.gmane.org/gma...)
  2. OpenNews: Стабильный релиз СУБД MariaDB 5.5
  3. OpenNews: Непонятная ситуация с 0-day эксплоитом и 27 уязвимостями в MySQL
  4. OpenNews: Уязвимости в MySQL, Wicd, FreePBX, RPM, MediaWiki, Ghostscript, LibTIFF, libpng, FFmpeg, Gajim, Puppet
  5. OpenNews: Уязвимости в MySQL, Adobe Flash, Chrome, VMware, ownCloud, Asterisk, BIND, Net-SNMP и Drupal
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/34062-mysql
Ключевые слова: mysql, mariadb, security
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (42) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Аноним (-), 00:45, 10/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –25 +/
    Вот что ты получаешь, если используешь язык программирования родом из 70-х, в котором, даже простейший булев тип, приходится сооружать из дерьма и палок.
     
     
  • 2.11, pavlinux (ok), 02:59, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +13 +/
    Вот что получаешь, когда начинаешь выё...тся, понтоватся и создавать свои типы,
    например my_bool. Ладно бы my_bool был бы int или Bool, так он же char.
     
     
  • 3.26, Аноним (-), 14:18, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • –4 +/
    В си нет типа Bool, есть _Bool или bool размер которого может быть и не int'ом. Морал простой - типы нужно приводить явно.
     
     
  • 4.44, Аноним (-), 01:07, 11/06/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    админоморда, хватит редактировать сообщения. Будешь за это гореть в аду
     
     
  • 5.58, Michael Shigorin (ok), 11:44, 13/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Будешь за это гореть в аду

    EPERM

     
  • 4.45, pavlinux (ok), 04:22, 11/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > _Bool или bool размер которого может быть и не int'ом.

    ISO/IEC 9899:201x

    6.2.5 Types

    An object declared as type _Bool is large enough to store the values 0 and 1.

    6.3.1.1 Boolean, characters, and integers

    — The rank of _Bool shall be less than the rank of all other standard integer types.

    То есть уже по стандарту, Bool, максимум может быть (SHRT_MAX-1), т.е. (2^8/2-1)-1 = 32766;


    > Морал простой - типы нужно приводить явно.

    Приведение типов только для лохов! :)

     
  • 2.17, arisu (ok), 12:30, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    ну так не пиши на этом мерзком языке, запили свой обалденный язык. тебе мешает кто-то, что ли?
     
     
  • 3.27, Аноним (-), 14:40, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Не, лучше не надо, хватит уже.
     
     
  • 4.29, arisu (ok), 15:13, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Не, лучше не надо, хватит уже.

    а вдруг выйдет что-то действительно крутое и гениальное?

     
     
  • 5.41, umbr (ok), 19:39, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +2 +/
    да, с вероятностью 1 к 256
     
     
  • 6.43, arisu (ok), 20:18, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > да, с вероятностью 1 к 256

    но ведь не нулевой.

     
  • 2.55, Аноним (-), 03:47, 12/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Вот, что получается, когда руки из *опы и мозгов ноль. Ну и про выпендрёж выше верно замечено.
     

  • 1.3, Аноним (-), 00:48, 10/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    осталось подобрать 300 паролей хэш которых увеличивается на 1...
    интересная уязвимость впредь буду думать...
     
     
  • 2.9, Аноним (-), 01:50, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Совершенно не обязательно. Достаточно 300 разных(!).Зачем подбирать их по порядку? Если получится зайти - сразу увидишь.
     

  • 1.4, Аноним (-), 00:52, 10/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    знающие люди, почему BSD не подвержена? там по другому приводятся типы?
     
     
  • 2.6, Аноним (-), 01:31, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    выше в статье написано почему. чукча не читатель?
     
     
  • 3.12, pavlinux (ok), 03:09, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Предпосылкой к возникновению проблемы является возможность возвращения
    > некоторыми реализациями memcmp() произвольных целых значений, не попадающих
    > в диапазон -128..127.

    Ткните меня мордой !!! Где написано что memcmp() должно возвращать от -128 до 127 ????

    IEEE Std 1003.1-2008
    http://pubs.opengroup.org/onlinepubs/9699919799/functions/memcmp.html

    ISO/IEC 9899:201x



    7.24.4.1 The memcmp function
    Synopsis
    1 #include <string.h>
      int memcmp(const void *s1, const void *s2, size_t n);

    Description

    2 The memcmp function compares the first n characters of the object pointed to by s1 to
      the first n characters of the object pointed to by s2.

    Returns

    3 The memcmp function returns an integer greater than, equal to, or less than zero,
      accordingly as the object pointed to by s1 is greater than, equal to, or less than the
      object pointed to by s2.



    Почему в BSD по другому?!

     
     
  • 4.18, arisu (ok), 12:32, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Ткните меня мордой !!! Где написано что memcmp() должно возвращать от -128
    > до 127 ????

    да нигде. и strcmp() тоже не обязана. но кто ж эти дурацкие документации читает-то? а потом возникают вот такие школьные «уязвимости». или вонь про то, что memcpy() «поломали».

     

  • 1.13, Аноним (-), 03:47, 10/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    Эпично, что тут скажешь. my_bool вообще доставило.

    ЗЫ Вы всё ещё используете MySQL? Тогда слоник идёт к вам...

     
     
  • 2.28, AllSoftwareSucks (ok), 14:54, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Тогда слоник идёт к вам...

    Зелёный?

     
     
  • 3.38, Аноним (-), 17:44, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Розовый.
     
     
  • 4.40, Аноним (-), 18:53, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +2 +/
    синий
     

  • 1.14, im (??), 03:54, 10/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Забыли добавить из оригинальной новости:
    All MariaDB and MySQL versions up to 5.1.61, 5.2.11, 5.3.5, 5.5.22 are
    vulnerable.
     
     
  • 2.51, анонимно (?), 19:27, 11/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Пробовал убунту 12.04 64-битную, мускул 5.5.22 - не пускает и через 1к попыток.
     
     
  • 3.52, antono (??), 19:54, 11/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Видимо уже исправили. У меня тоже не работает :)

    http://shelr.tv/records/4fd6126496608064fc000014

     
  • 3.53, antono (??), 20:08, 11/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Интересно... С root не прокатывает :) Зато с debian-sys-maint огого:

    http://shelr.tv/records/4fd6173a9660804894000018

     

  • 1.15, Йух (??), 06:18, 10/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > Например, реализации memcmp() из BSD libc и GCC не подвержены проблеме, а оптимизированная с использованием SSE-инструкций реализации memcmp() из Linux Glibc подвержена проблеме (GCC обычно использует собственную реализацию).

    Интересно, я один после этих слов вспомнил срачик Линуса и Ульриха по поводу memcpy()? :))

     
     
  • 2.16, Аноним (-), 09:16, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    А причём здесь memcpy()? Там всё дело в кастомном типе my_bool (lol), к которому приводиться результат выполнения memcpy. А так как memcpy возвращает int то иногда возникают проблемы при кастинге из "большего" типа в "меньший". Так что я вижу тут только проблему индусов.
     
     
  • 3.20, Йух (??), 13:06, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Там тоже оптимизации под SSE "поломали" поведение функции.

    в случае memcpy() - это происходило на пересекающихся областях и по стандарту это Undefined behavior, а индусы из Adobe заложились на определенное поведение функции.

    в этом случае в стандарте ничего не говорится что значения будут укладываться в диапазон -128..127, a приведение типов иногда дает 0

    т.е. и тут и там проблема в индусах, [TROLL] но интересно, потребует ли тут Линус изменить поведение glibc [/TROLL]

     
  • 2.19, arisu (ok), 12:33, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Интересно, я один после этих слов вспомнил срачик Линуса и Ульриха по
    > поводу memcpy()? :))

    а разве был срачик? линусу сказали, что он дебил. линус утёрся и убежал рассказывать, как он круто всех победил.

     
     
  • 3.21, Йух (??), 13:11, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    По факту утерся Ульрих - http://www.opennet.dev/opennews/art.shtml?num=33461
    и это печалит.

     
     
     
     
    Часть нити удалена модератором

  • 6.32, R (?), 16:47, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Один из них ты. Ущербный мозг не может знать что такое defacto
    > стандарт.

    Ну, во-первых, "de facto", а во-вторых - http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0
    И еще: практика показывает, что нежелание читать и, что важнее, ПОНИМАТЬ документацию часто приводит к необходимости в новых версиях городить "костыли" для поддержки некогда некорректно написаного софта. Таким образом, получаем замкнутый круг. Яркий пример - экосистема Windows. Посмотрите, как в WINE вместо реализации функций по документации приходится воспроизводить "особенности" оригинальной реализации, так как прикладные программы эти самые "особенности" используют во всю. И это же является причиной неработоспособности части программ, написанных "типа крутыми прогерами, которым чихать на документацию" и использующих "недокументированные" функции, в официально выпущенных новых версиях ситем от Microsoft - вспомните сколько воплей было по поводу VISTA, а потом и "семерки"!
    Вы считаете это правильным и хотите иметь такую же ситуацию в UNIX?

     
     
  • 7.34, Аноним (-), 16:53, 10/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    он обычный php быдлокодер, у него нет никаких осознанных 'хочу'. Всё делается спинным мозгом
     

  • 1.39, Аноним (39), 18:31, 10/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    чудесно!
     
  • 1.42, Аноним (-), 20:03, 10/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    "На 1 000 000 000-й попытке сервер согласился что пароль - Мао Цзэдун"
     
  • 1.46, Аноним (-), 12:43, 11/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    $ for i in 'seq 1 1000'; do mysql -u root --password=bad -h 127.0.0.1 2>/dev/null; done

    mysql>

    http://habrahabr.ru/post/145641/ вероятность взлома 1/256

    программа проверки http://pastie.org/4064638

     
     
  • 2.49, Вредоносный (ok), 17:53, 11/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    $ mysql --version
    mysql  Ver 14.14 Distrib 5.5.22, for debian-linux-gnu (x86_64) using readline 6.2

    Чего-то не могу вломиться на свой локалхостик. Не пущает :(

     
     
  • 3.50, FSA (ok), 19:26, 11/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    У меня тоже не получилось на Ubuntu 12.04 AMD64.
     
     
  • 4.54, antono (??), 20:19, 11/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Попробуйте с debian-sys-maint :)

    http://shelr.tv/records/4fd6173a9660804894000018

     
  • 3.56, Аноним (-), 03:50, 12/06/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > mysql --version

    mysql  Ver 14.14 Distrib 5.1.56, for slackware-linux-gnu (x86_64) using readline 5.1

    Тоже не получилось. Версия слаки - 13.37

     

  • 1.57, Nas_tradamus (ok), 11:15, 13/06/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Во 64bit FreeBSD не сработало:

    for i in 'jot - 1 1000'; do mysql -u root --password=bad -h 127.0.0.1 2>/dev/null; done

     
  • 1.59, Аноним (-), 07:29, 04/07/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    мне пофиг, ipfw+pf закрыты порты
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру