Tags Posts tagged with "mysql"

mysql

przez -
8 1350
MySQL

King Cope, który jest znany z tworzenia exploitów, opublikował sposób na podniesienie uprawnień w bazie MySQL na systemie Linux. Pozwala on na dodanie do bazy danych użytkownika o prawach administratora. Do wykorzystania exploita, atakujący musi posiadać użytkownika w bazie danych z przywilejami FILE. Dzięki temu napastnik może stworzyć plik w systemie o uprawnieniach użytkownika mysql.

Następnie atakujący tworzy TRIGGER na dowolne zdarzenie w bazie. Zazwyczaj TRIGGER doczepiany jest do użytkownika i wykonywany na jego prawach. Ponieważ jednak mamy możliwość zapisu do plików dzięki FILE, możemy dodać dowolną treść do pliku TRG (plik triggera). Atakujący zapisuje tam zapytanie SQL, które uruchamia się jako root@localhost.

Następnie należy spowodować uszkodzenie serwera MySQL i jego wznowienie za pomocą przepełnienia stosu, aby plik TRIGGERA został poprawnie zaczytany i rozpoznany. Wykonanie dowolnego zapytania SQL, które uruchamia TRIGGER pozwoli na wykonanie zapytania jako root@localhost.

Opublikowany przez Kinga exploit wykonuje następujące kroki:

  1. Podłącza się do serwera MySQL
  2. Tworzy tabelę dla TRIGGERa
  3. Tworzy plik dla TRIGGERa: /var/lib/mysql/<bazadanych>/<tabela>.TRG
  4. Poprzez wywołanie przepełnienia stosu, zmusza serwer MySQL do awarii i przeładowania się
  5. Dodaje wartość do tabeli aby wywołać TRIGGER
  6. TRIGGER dodaje wszystkie uprawnienia dla bieżącego użytkownika w mysql.user
  7. Ponowne uszkodzenie i przeładowanie MySQLa
  8. Dodanie nowego użytkownika o uprawnieniach administratora
  9. Ponowne uszkodzenie i przeładowanie MySQLa
  10. Podłącza się do bazy danych jako nowy użytkownik
  11. Wykonuje zrzut loginów oraz hashy haseł z tabeli mysql.user

Błąd został sprawdzony na systemach:

  • Debian Lenny (mysql-5.0.51a)
  • OpenSuSE 11.4 (5.1.53-log)

przez -
16 3951
Bazy danych, baza danych

Kilka miesięcy temu na rynku pojawił się nowy produkt w kategorii baz danych – MemSQL. Stworzony przez dwóch byłych deweloperów Facebooka, zaprojektowany ze znacznym naciskiem na wykorzystanie pamięci RAM, oraz konwertujący zapytania SQL do kodu C++. To wszystko przy deklarowanej 30-krotnie większej wydajności w porównaniu z bazą MySQL. Sprawdziliśmy czy faktycznie różnica jest tak ogromna oraz jak MemSQL sprawdza się w praktyce.

O MemSQL

MemSQL to baza danych, której głównymi atutami są minimalne wykorzystanie tradycyjnego dysku twardego kładąc przy tym duży nacisk na wykorzystanie pamięci RAM oraz konwersja (a później kompilacja) zapytań SQL do języka C++.  Jest dostępna w dwóch wersjach – darmowej deweloperskiej której ograniczenia to 10GB maksymalnej pojemności bazy danych oraz płatnej dla firm (dostępnej w 30 dniowej wersji trial). Aby ją pobrać należy wygenerować klucz licencyjny na stronie memsql.com oraz ściągnąć binarną paczkę dla 64 bitowych systemów GNU/Linux. Zalecana konfiguracja sprzętowa to wielordzeniowy CPU oraz co najmniej 8GB pamięci RAM.

MemSQL jest kompatybilny z aplikacjami wykorzystującymi MySQL, co oznacza że można bezproblemowo zaimportować dane z jednej bazy danych do drugiej, zmieniając jedynie port po którym łączy się aplikacja (domyślnie 3307). Twórcy zapewniają że MemSQL w pełni wspiera ACID (właściwości gwarantujące poprawne przeprowadzanie transakcji), oraz te same silniki bazodanowe co MySQL – InnoDB oraz MyISAM. Nie oznacza to jednak że MemSQL wspiera ten sam, pełny zestaw poleceń SQL co baza MySQL.

Jednym z czynników wpływających na deklarowaną wydajność jest przetrzymywanie wszystkich danych w ulotnej pamięci RAM. Narzuca to wymagania w postaci odpowiednio dużej ilości wolnej pamięci, co najmniej tak dużej co sama baza danych. Wszystkie zmiany zapisywane są w logu transakcji który znajduje się fizycznie na dysku. W przypadku awarii – dane są z niego odtwarzane, zapytanie po zapytaniu.

Kolejnym czynnikiem jest translacja zapytań SQL do C++ która odbywa się dla każdego nowopoznanego zapytania skierowanego do bazy. Polega to na wyłuskaniu z zapytania SQL jedynie głównej jego części z pominięciem wszelkich statycznych wartości.

Przykładowo zapytanie:
[sql]SELECT * FROM users WHERE col = 1;[/sql]
zostanie zinterpretowane jako
[sql]SELECT * FROM users WHERE col = @;[/sql]
a następnie skonwertowane do kodu C++ i skompilowane do postaci biblioteki współdzielonej (pliku .so). Efektem takiej operacji jest dłuższy czas wykonywania dla nowych zapytań, ale dużo szybszy dla następnych o podobnej konstrukcji.

Tyle teorii, w następnym kroku sprawdzimy jak te ulepszenia przekładają się na praktyczne rezultaty poddając je seriom testów.

Testy były wykonywane na serwerze opartym o system CentOS 6.3 w wersji 64 bitowej. Maszyna posiadała ośmiordzeniowy procesor Intel Core i7 930 taktowany 2.80 GHz oraz 8GB pamięci RAM. Użyte wersje oprogramowania to:

  • MySQL w wersji 5.5.25 (domyślna konfiguracja)
  • MySQL 5.5.25 z (zwiększona ilość pamięci dla MySQL, bufforów oraz cache)
  • MemSQL w wersji 1b (domyślna konfiguracja)

Do testów wykorzystano benchmark Sysbench (http://sysbench.sourceforge.net/) w wersji 0.3.1. Pierwszym etapem było zapełnienie bazy danych 1 000 000 (milionem) przykładowych rekordów. Wykorzystano w tym celu polecenie:
[sql]sysbench –test=oltp –db-driver=mysql –mysql-user=root –mysql-password=mysql –mysql-db=test –oltp-table-size=1000000 –myisam-max-rows=1000000 –mysql-table-engine=innodb –oltp-table-name=innodb prepare[/sql]
dla bazy MySQL oraz polecenie
[sql]sysbench –test=oltp –db-driver=mysql –mysql-user=root –mysql-host=127.0.0.1 –mysql-db=test –oltp-table-size=1000000 –myisam-max-rows=1000000 –mysql-table-engine=myisam –oltp-table-name=myisam  –oltp-dist-type=uniform prepare[/sql]
dla bazy MemSQL (oba w wersji dla InnoDB oraz MyISAM)

Do testów użyto dwóch trybów pracy Sysbench

  • Simple/read only  który polegał na wykonaniu 1 000 000 zapytań typu SELECT o różnym poziomie skomplikowania, nie modyfikując przy tym żadnych danych
  • Complex – będący złożonym trybem symulującym serię transakcji na które składało się 1 400 000 zapytań typu SELECT, 500 000 zapytań UPDATE/INSERT modyfikujących dane oraz 200 000 zapytań DELETE.

W przypadku silnika InnoDB transakcyjność osiągnięto przy użyciu standardowych poleceń BEGIN/COMMIT, dla MyISAM natomiast do symulowania transakcji Sysbench wykorzystuje polecenia LOCK TABLES/UNLOCK TABLES (co dość pokaźnie wpłynęło na wynik końcowy).

Poniżej wyniki testów w postaci wykresów oraz parametry użyte przy uruchomieniu każdego benchmarku. (prezentowany wynik to czas, jaki potrzebowała baza danych na ukończenie testu).

InnoDB zapytania typu select

[sql]–test=oltp –db-driver=mysql  –mysql-table-engine=innodb –num-threads=128 –oltp-table-size=1000000 –max-requests=1000000 –myisam-max-rows=1000000 –oltp-read-only=on  –oltp-test-mode=simple –oltp-dist-type=uniform –db-ps-mode=disable[/sql]

InnoDB transakcje

[sql]–test=oltp –db-driver=mysql  –mysql-table-engine=innodb –num-threads=128 –oltp-table-size=100000 –max-requests=100000 –myisam-max-rows=1000000 –oltp-read-only=off  –oltp-test-mode=complex –oltp-dist-type=uniform –db-ps-mode=disable[/sql]

MyISAM - zapytania typu SELECT

[sql]–test=oltp  –db-driver=mysql –mysql-table-engine=myisam –num-threads=128 –oltp-table-size=1000000 –max-requests=1000000 –myisam-max-rows=1000000 –oltp-read-only=on –oltp-test-mode=simple –oltp-dist-type=uniform –db-ps-mode=disable[/sql]

MyISAM - Transakcje

[sql]–test=oltp  –db-driver=mysql –mysql-table-engine=myisam –num-threads=128 –oltp-table-size=100000 –max-requests=100000 –myisam-max-rows=1000000 –oltp-read-only=off –oltp-test-mode=complex –oltp-dist-type=uniform –db-ps-mode=disable[/sql]

Jak widać, różnica w szybkości wykonywania zapytań jest znacząca. Nie jest to co prawda obiecywana 30-krotna różnica (w najlepszym wypadku kilkunastokrotna) ale mimo wszystko przewaga MemSQL jest ogromna. Jednak jako baza produkcyjna MemSQL jeszcze nie nadaje się według mnie do praktycznych zastosowań. Powodów ku temu jest kilka:

  1. Wciąż trwają prace nad ukończeniem pełnej specyfikacji SQL dla bazy danych MySQL. Wielu poleceń wciąż brakuje (np. TRUNCATE), brakuje obsługi widoków, triggerów czy kluczy obcych. Na obecną chwilę jedynym obsługiwanym zestawem znaków jest UTF-8.
  2. Nadal brakuje wparcia ze strony deweloperów dla bazy MemSQL. Próba instalacji oraz migracji aplikacji WordPress zakończyła się w naszym przypadku niepowodzeniem, czego powodem były zapewne niewspierane polecenia SQL wyeksportowane do pliku dump bazy danych. Na obecną chwilę istnieje oficjalny poradnik http://developers.memsql.com/docs/1c/guides/popular_tools.html o instalacji Django na MemSQL, lecz to wciąż zbyt mało, by można było mówić o pełnym wsparciu dla użytkowników.

Nie zmienia to faktu, iż MemSQL to produkt o ogromnym potencjale i ma sporą szansę aby zmienić obecną sytuację na rynku.

przez -
2 836
MySQL

Na blogu MariaDB możemy znaleźć informację, że testy jednostkowe, zawarte w MySQL zostały ukryte lub ich brakuje. Sergei Golubchik pisze, że były one częścią kodu źródłowego każdej nowej wersji i znajdowały się zawsze w katalogu mysql-test/. Aktualnie takowego nie ma, ale pojawił się internal/mysql-test/, w którym nic nie ma. Sugeruje to, że albo testy jednostkowe zostały zamknięte, albo nie są domyślnie dołączane do kodu. Na zadane pytanie, odnośnie zmian Oracle do tej pory nie odpowiedziało.

przez -
2 1035
MySQL

BIKE to lekkie narzędzie dla administratorów, użytkowników i deweloperów, którzy potrzebują szybkiego podglądu swojej bazy danych, bez potrzeby instalacji skomplikowanych aplikacji. Aplikacja jest napisana w PHP i działa z systemami CMS: WordPress, Joomla oraz Drupal. Aby całość zadziałała, wystarczy skopiować odpowiednie pliki do katalogu, w którym działa nasza instalacja, a BIKE sam wykryje konfigurację naszej bazy danych.

Narzędzie łączy się z bazą danych, wysyła zapytania bezpośredni od MySQL i wyświetla wyniki w oknie przeglądarki. Domyślnie posiadamy 5 gotowych formułek, ale dzięki edytorowi możemy przygotować ich znacznie więcej i zapisać je w bibliotece. Prócz tego mamy dostępną historię 40 ostatnio wydanych zapytań, a także możliwość ich skopiowania do edytora lub wykonania.

Wersja jest uboga w funkcję uwierzytelniania, dlatego zalecane jest używanie serwera z własnym szyfrowaniem lub autoryzacją.

przez -
22 1612
MySQL

Sergei Golubchik, koordynator projektu MariaDB, odkrył bardzo poważny błąd bezpieczeństwa w bazie danych MySQL. Polega on na ominięciu autoryzacji i uzyskaniu bardzo łatwego dostępu do bazy danych z prawami administratora. Błąd o oznaczeniu CVE-2012-2122, pozwala atakującemu wykonać błędne logowanie ze złym hasłem i dać szansę dostępu. Szanse na zalogowanie się do bazy na konto root z błędnym hasłem wynoszą 1 na 256 prób. Aby się to udało, wystarczy wykonać odpowiednią przygotowaną pętle od 300 do 512 razy.

Firma Oracle załatała problem w serwerze MySQL (#64884) w wydaniach 5.1.63 i 5.5.24, które pojawiły się ponad 2 miesiące temu. Poprawki w dystrybucjach Linuksa powinny pojawić się niebawem.

Błąd polega na założeniu, że funkcja memcmp() zawsze zwraca wartość z przedziału -128 do 127. Na niektórych platformach z włączonymi optymalizacjami, funkcja ta potrafi zwrócić wartość z poza tego przedziału, co w efekcie powoduje, że funkcja porównująca zahashowane hasło, zwróci TRUE, w przypadku podania błędnego hasła.

Przykładowy exploit

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

Systemy, które posiadają luki w serwerze bazy danych

  • Ubuntu Linux 64-bit ( 10.04, 10.10, 11.04, 11.10, 12.04 )
  • OpenSuSE 12.1 64-bit MySQL 5.5.23-log
  • Fedora 16 64-bit
  • Arch Linux

Systemy, które nie są podatne na atak

  • Oficjalne paczki MySQL oraz MariaDB (w tym wersje na Windows)
  • Red Hat Enterprise Linux, CentOS (32-bit and 64-bit) [ not conclusive ]
  • Ubuntu Linux 32-bit (10.04, 11.10, 12.04, likely all)
  • Debian Linux 6.0.3 64-bit (Version 14.14 Distrib 5.5.18)
  • Debian Linux lenny 32-bit 5.0.51a-24+lenny5 ( via @matthewbloch )
  • Debian Linux lenny 64-bit 5.0.51a-24+lenny5 ( via @matthewbloch )
  • Debian Linux lenny 64-bit 5.1.51-1-log ( via @matthewbloch )
  • Debian Linux squeeze 64-bit 5.1.49-3-log ( via @matthewbloch )
  • Debian Linux squeeze 32-bit 5.1.61-0+squeeze1 ( via @matthewbloch )
  • Debian Linux squeeze 64-bit 5.1.61-0+squeeze1 ( via @matthewbloch )
  • Gentoo 64-bit 5.1.62-r1 ( via @twit4c )
  • SuSE 9.3 i586 MySQL 4.1.10a ( via @twit4c )

przez -
3 899
MySQL

Oracle ogłosiło wydanie MySQL 5.5.21, regularnej aktualizacji produkcyjnej wersji otwartoźródłowej bazy danych. Pojawiła się nowa opcja w CMake – MYSQL_PROJECT_NAME, którą możemy ustawić na Windows lub Mac OS X, w celu użycia w nazwie projektu. Naprawiono sporo błędów w InnoDB Storage Engine oraz replikacji. Ulepszona została wydajność InnoDB oraz zarządzanie pamięcią.

przez -
3 593
MySQL

Oracle ogłosiło wydanie MySQL 5.5.18, regularnej aktualizacji produkcyjnej wersji otwartoźródłowej bazy danych. Firma oznaczyła niebezpieczne zapytania dla replikacji o nie oparte (statement-based replication). Zapytania te opierają się głównie o wynik polecenia SELECT, gdzie nie można ustalić kolejności wyników. Poprawiono także błąd w replikacji, gdzie master mógł wysłać niebezpieczne zdarzenia do slaves, jeżeli dysk przechowywał binarne logi na masterze, który stał się przepełniony.

Inne zmiany obejmują poprawki w bibliotece libedit w pakiecie MySQL, usuwanie i zwalnianie niepotrzebnej alokacji pamięci, podczas otwierania tabel, poprawiono awarie związane z tabelami ARCHIVE i FEDERATED. Usunięto możliwą awarię w komendzie OPTIMIZE TABLE przy użyciu MyISAM. Programiści umożliwili także użycie RPM w celu zastąpienia dowolnie zainstalowanej wersji MySQL inną z tej samej rodziny, np. podczas aktualizacji z wersji darmowej do komercyjnej.

przez -
0 1040
MySQL

Oracle ogłosiło dostępność komercyjnych rozszerzeń dla bazy danych MySQL. Nowe rozszerzenia są dostępne dla Enterprise Edition i będą potem rozróżniały wersję komercyjną od społecznościowej. Wcześnie, Enterprise Edition zawierała jedynie zewnętrzne narzędzia – MySQL Enterprise Monitor i MySQL Enterprise Backup, jako część ich pakietu, jednakże nowe rozszerzenia są bardziej zintegrowane z bazą.

Narzędzie Thread Pool, np. oferuje ulepszoną wydajność na 16 rdzeniowych lub większych systemach. Dzięki takim rozszerzeniom jest możliwe zwiększenie ogólnej wydajności od 3 do 20 razy.

Okazuje się także, że decyzja firmy spotkała się zarówno z ciepłym przyjęciem, jak i niezadowoleniem części osób.

Polecane

fritzbox

0 92
AVM Fritz!Box 7590 to nowsza wersja modelu 7490, czym się różnią re modele - na pewno jest spora różnica wizualna, ale i...