Raport dotyczący naruszenia bezpieczeństwa repozytorium git i bazy użytkowników projektu PHP

Opublikowano pierwsze wyniki analizy incydentu związanego ze zidentyfikowaniem dwóch złośliwych zatwierdzeń w repozytorium Git projektu PHP z backdoorem aktywowanym podczas wysyłania żądania ze specjalnie zaprojektowanym nagłówkiem User Agent. W trakcie badania śladów działań atakujących stwierdzono, że sam serwer git.php.net, na którym znajdowało się repozytorium git, nie został zhakowany, lecz baza danych zawierająca konta twórców projektu .

Możliwe, że atakującym udało się pobrać bazę danych użytkowników przechowywaną w systemie DBMS na serwerze master.php.net. Zawartość master.php.net została już przeniesiona na nowy serwer main.php.net zainstalowany od podstaw. Wszystkie hasła programistów używane do dostępu do infrastruktury php.net zostały zresetowane, a proces ich zmiany został zainicjowany poprzez specjalny formularz odzyskiwania hasła. Repozytoria git.php.net i svn.php.net pozostają tylko do odczytu (rozwój został przeniesiony do GitHub).

Po wykryciu pierwszego złośliwego zatwierdzenia dokonanego za pośrednictwem konta Rasmusa Lerdorfa, założyciela PHP, założono, że jego konto zostało zhakowane, a Nikita Popov, jeden z kluczowych programistów PHP, wycofał zmiany i zablokował uprawnienia do zatwierdzania dla problematyczne konto. Po pewnym czasie zdano sobie sprawę, że blokowanie nie ma sensu, gdyż bez weryfikacji zatwierdzeń za pomocą podpisu cyfrowego każdy uczestnik mający dostęp do repozytorium php-src mógłby dokonać zmiany podstawiając fikcyjne nazwisko autora.

Następnie napastnicy wysłali złośliwe zatwierdzenie w imieniu samego Nikity. Analizując logi usługi gitolite służącej do organizacji dostępu do repozytoriów, podjęto próbę ustalenia uczestnika, który faktycznie dokonał zmian. Pomimo uwzględnienia rozliczania wszystkich zatwierdzeń, w dzienniku nie było wpisów dotyczących dwóch złośliwych zmian. Stało się jasne, że doszło do naruszenia infrastruktury, ponieważ zatwierdzenia zostały dodane bezpośrednio, z pominięciem połączenia za pośrednictwem gitolite.

Serwer git.php.net został natychmiast wyłączony, a główne repozytorium zostało przeniesione do GitHub. W pośpiechu zapomniano, że aby uzyskać dostęp do repozytorium, oprócz SSH za pomocą gitolite, istniało jeszcze jedno wejście, które umożliwiało wysyłanie zatwierdzeń przez HTTPS. W tym przypadku do interakcji z Gitem wykorzystano backend git-http-backend, a uwierzytelnianie przeprowadzono przy użyciu serwera HTTP Apache2, który weryfikował poświadczenia poprzez dostęp do bazy danych hostowanej w systemie DBMS na serwerze master.php.net. Logowanie było możliwe nie tylko za pomocą kluczy, ale także zwykłego hasła. Analiza logów serwera http potwierdziła, że ​​szkodliwe zmiany zostały dodane poprzez HTTPS.

Studiując logi, okazało się, że napastnicy nie połączyli się za pierwszym razem, lecz początkowo próbowali odnaleźć nazwę konta, jednak po jej zidentyfikowaniu logowali się za pierwszym razem, tj. znali wcześniej hasła Rasmusa i Nikity, ale nie znali ich loginów. Jeżeli atakującym udało się uzyskać dostęp do systemu DBMS, nie jest jasne, dlaczego od razu nie użyli podanego tam prawidłowego loginu. Ta rozbieżność nie doczekała się jeszcze wiarygodnego wyjaśnienia. Włamanie do master.php.net jest uważane za najbardziej prawdopodobny scenariusz, ponieważ serwer ten wykorzystywał bardzo stary kod i przestarzały system operacyjny, który nie był aktualizowany przez długi czas i miał niezałatane luki.

Podjęte działania obejmują ponowną instalację środowiska serwerowego master.php.net oraz przeniesienie skryptów do nowej wersji PHP 8. Kod do pracy z systemem DBMS został zmodyfikowany w celu obsługi zapytań parametrycznych, które komplikują podstawienie kodu SQL. Algorytm bcrypt służy do przechowywania skrótów haseł w bazie danych (poprzednio hasła były przechowywane przy użyciu zawodnego skrótu MD5). Istniejące hasła zostaną zresetowane i zostanie wyświetlony monit o ustawienie nowego hasła za pomocą formularza odzyskiwania hasła. Ponieważ dostęp do repozytoriów git.php.net i svn.php.net poprzez HTTPS był powiązany z hashami MD5, zdecydowano się pozostawić git.php.net i svn.php.net w trybie tylko do odczytu, a także przenieść wszystkie pozostałe do nich repozytoria rozszerzeń PECL na GitHubie, podobne do głównego repozytorium PHP.

Źródło: opennet.ru

Dodaj komentarz