Rzadko trafiają się błędy aż tak kuriozalne, jak ten. Okazuje się, że ze względu na możliwy błąd w porównaniu wartości dwóch zmiennych w procesie logowania, baza może uznać losowe hasło za prawidłowe i przydzielić dostęp do dowolnego konta – w tym roota.
Zanim jednak pobiegniecie hakować NASA, błąd ma pewne ograniczenia – nie wszystkie instalacje są na niego podatne. Ale może po kolei.
Gdzie jest błąd
Sergei Golubczik, odpowiedzialny za bezpieczeństwo MariaDB, odkrył ciekawe zachowanie zarówno swojej bazy, jak i MySQL. W momencie logowania baza hashuje hasło użytkownika po czym dodaje losowy ciąg i tworzy z niego token, który porównywany jest z wartością oczekiwaną w oparciu o informacje przechowywane w bazie. Ze względu na specyficzny błąd w kodzie, może się okazać, że mimo iż funkcja memcmp() porównująca obie wartości zwróci wartość różną od zera, to baza uzna, że hasło było prawidłowe i pozwoli na dostęp użytkownikowi. Ze względu na losowe ciągi stosowane w procedurze, prawdopodobieństwo trafienia w błędną odpowiedź wynosi 1/256.
Aby wykonać udane połączenie potrzeba w najgorszym przypadku ok. 300 prób i znajomości istniejącego loginu użytkownika. Z oboma elementami nie powinno być problemu – 300 prób połączenia zajmuje ok. sekundy, a w większości przypadków użytkownik root istnieje w bazie.
Które wersje są podatne
Wg Golubczika podatne mogą być wersje MySQL do 5.1.61, 5.2.11, 5.3.5 oraz 5.5.22. Nie są podatne wersje od 5.1.63, 5.5.24, 5.6.6. Ale sam numer wersji nie decyduje o wystąpieniu podatności – wszystko zależy od tego, gdzie i jak została skompilowana wersja. Aby błąd wystąpił, funkcja memcmp() musi zwracać liczby całkowite z przedziału (-128 … 127). Wg Golubczika binaria dystrybuowane przez MySQL są bezpieczne, tak samo jak memcp z gcc i to z BSD. Podatne na błąd jest na przykład memcmp z linuxowego glibc sse-optimized. Podobno błąd dotyczy też 64bitowych Ubuntu/Debiana.
Tutaj znajduje się skrypt, z pomocą którego możecie przetestować swojego memcmp (i podać wyniki w komentarzach). Pojawił się także ciekawy opis problemu oraz moduł Metasploita.
Komentarze
ubuntu 12.04 64-bit podatne :)
12.04 32-bit niepodatne, stan na dziś.. updating your system makes sense..
Czy faktycznie w tych wersjach można zalogować się do mysql znając tylko nazwę użytkownika ? rozumiem, że przez phpmyadmin również ?
Slack 13.37, glibc 1.2.10, mysql Ver 14.14 Distrib 5.1.56,
Not triggered in 10 seconds, *probably* not vulnerable..