2009-08-31 04:33:34
"Hardened" Mantis

This article is also available in english language.

Nie wiem czemu, ale znakomita większość (jeśli nie wszystkie) ze znanych mi PHPowych frontendów/aplikacji cierpi na tę samą wadę: hasła trzymane albo gołym tekstem, albo jakąś słabizną w rodzaju MD5. Na to cierpiała (cierpi?) Joomla, i chociaż używają tam jakiegoś salta, to mimo wszystko ten salt jest (albo był) zapisany gołym tekstem, także dalej metody brute-force, i słowniki wchodziły w grę. Mantis 1.1.8 nie saltuje ;-) I używa przestarzałego MD5 (nie zanosi się na to, by w 1.2.0 to się zmieniło). Dalej napisałem jak sprawić, by zaczął korzystać ze SHA1.

Uzasadnienie? Szczególnie na współdzielonych hostingach zdarza się, że z jednej instalacji MySQLa korzysta kilku/kilkunastu userów; włamanie na konto jednego i wykorzystanie ew. luk do przejęcia reszty albo w inny sposób dobranie się do bazy sprawia, że włamywacz ma na tacy wszystkie hashe. Jeśli nie mamy dostatecznej kontroli nad serwerami, o fakcie włamania dowiadujemy się gdy włamywacz już doszedł do właściwych haseł albo znalazł kolizje hashy. Sęk w tym, że MD5 jest już oklepane, są już znane różne formy ataków (nie tylko brute-force, słowniki i tęczowe tablice), nikt mający blade pojęcie o kryptografii nie używa już MD5 tam, gdzie bezpieczeństwo ma jakiekolwiek znaczenie (bo jeśli nie ma, to trzyma niezaszyfrowane hasła i cieszy się z paru wolnych cykli procesora ;>).

Po kolei:

  1. Po pierwsze, robimy backup bazy (a przynajmniej tabeli "mantis_user_table") oraz pliku "core/authentication_api.php" oraz informujemy userów o wprowadzaniu takich zmian. Poniższe zmiany spowodują unieważnienie WSZYSTKICH haseł, co uniemożliwi zalogowanie. Rozwiązaniem jest oczywiście użycie funkcji resetowania hasła - ale gdy userzy o tym nie wiedzą, mogą po fafnaście razy próbować różnych dziwnych kombinacji i wariacji i trochę obciążyć nam serwery. ;-)
  2. Odcinamy dostęp do bazy danych. Nieistotne jak, czy to używając maczety w rodzaju iptables, czy chwilowo zmieniając konfigurację serwera SQL w Mantisowym config_inc.php. Ważne, by z tabelą "mantis_user_table" nic się nie działo.
  3. W tabeli "mantis_user_table" zmieniamy szerokość kolumny "password" z 32 na 40 znaków (ustawiamy typ "VARCHAR(40)") - wygodnie jest się posłużyć phpMyAdminem.
  4. Zapisujemy zmiany, odblokowujemy bazę danych.
  5. W pliku "core/authentication_api.php" zmieniamy linię 265 z:
            case MD5:
                    $t_processed_password = md5( $p_password );
                    break;
    
    na:
            case MD5:
                    $t_processed_password = sha1( $p_password );
                    break;
    
    oraz linię 275 z
            return substr( $t_processed_password, 0, 32 );
    
    na
            return substr( $t_processed_password, 0, 40 );
    
  6. Resetujemy swoje hasło i sprawdzamy czy działa. Jeśli nie, cofamy się do wersji z backupu i próbujemy do skutku/znudzenia, w przeciwnym razie, puszczamy w obieg informację o wprowadzonych zmianach. Gotowe.

Wiem, że powinno być jeszcze saltowanie, ale samo przejście z MD5 na SHA1 jest dużym szokiem, ponieważ doprowadzenie do kolizji hashy MD5 jest dużo mniej wymagajace niż doprowadzenie do kolizji hashy SHA1 (a na tej zasadzie działa większość crackerów). Znalezienie hasła zakodowanego do skrótu SHA1 też trwa duuużo dłużej. A ja nie chciałem wprowadzać do kodu Mantisa większych zmian, by czegoś przypadkiem nie popsuć (sam fakt manipulowania przy tabeli jest trochę niepokojący).

Mam nadzieję, że komuś się to przyda nawet, jeśli jest to trochę partyzancka metoda wymagająca "pospolitego ruszenia" (szczególnie w przypadku dłużej działających instalacji) ;-).

Update: Void w swoim komentarzu zasugerował użycie funkcji hash() - jeśli Twoja instalacja PHP na to pozwala, nie zastanawiaj się i użyj jej, gdyż oferuje znacznie większy wybór funkcji hashujących.


Może Cię zainteresować...

Link | Komentarzy: 37 | Programowanie, Tech, Techblog
Pokazuj komentarze.
Komentowanie wyłączone dla tego wpisu.
Powered by:
Hellcore Mailer - polski program pocztowyOpera Web BrowserFreeBSD - The Power to Serve!Slackware
RSSy:
Sidekick:
Projekty:
O autorze:
Zobacz:
Kategorie:
Archiwum:
Szukaj: