Opublikowano pierwsze wyniki analizy incydentu związanego z odkryciem w repozytorium Git projektu PHP dwóch złośliwych commitów z backdoorem, aktywowanym przy przesyłaniu żądania z specjalnie przygotowanym nagłówkiem User Agent. W trakcie badania śladów działalności atakujących stwierdzono, że sam serwer git.php.net, na którym znajdowało się repozytorium git, nie został włamywany, ale baza danych z kontami deweloperów projektu została skompromitowana.
Nie wyklucza się, że przestępcy mogli pobrać bazę użytkowników, przechowywaną w SGBD na serwerze master.php.net. Zawartość master.php.net została już przeniesiona na nowy serwer main.php.net, który został skonfigurowany od podstaw. Wszystkie hasła deweloperów, używane do uzyskania dostępu do infrastruktury php.net, zostały zresetowane, a proces ich zmiany został rozpoczęty poprzez specjalny formularz odzyskiwania hasła. Repozytoria git.php.net i svn.php.net pozostają dostępne w trybie tylko do odczytu (rozwój został przeniesiony na GitHub).
Po odkryciu pierwszego złośliwego commitu, dokonanego przez konto Rasmusa Lerdorfa, twórcy PHP, wysunięto przypuszczenie, że jego konto zostało złamane, a Nikita Popow, jeden z kluczowych deweloperów PHP, cofnął zmiany i zablokował uprawnienia do commitów dla problematycznego konta. Po pewnym czasie przyszło zrozumienie, że blokada nie miała sensu, ponieważ bez weryfikacji commitów za pomocą podpisu cyfrowego, każdy uczestnik z dostępem do repozytorium php-src mógł wprowadzać zmiany, podstawiając fikcyjne imię autora.
Następnie atakujący wysłali złośliwy commit w imieniu samego Nikity. Poprzez analizę logów serwisu gitolite, stosowanego do organizacji dostępu do repozytoriów, podjęto próbę określenia uczestnika, który rzeczywiście wprowadził zmiany. Mimo włączonego rejestrowania wszystkich commitów, w logu nie znalazły się zapisy dotyczące dwóch złośliwych zmian. Stało się jasne, że miała miejsce kompromitacja infrastruktury, ponieważ commity zostały dodane bezpośrednio, z pominięciem połączenia przez gitolite.
Serwer git.php.net został szybko wyłączony, a pierwotne repozytorium przeniesiono na GitHub. W pośpiechu umknęło, że do repozytorium można było uzyskać dostęp nie tylko przez SSH z użyciem gitolite, ale istniał również inny sposób umożliwiający przesyłanie commitów przez HTTPS. W tym przypadku do interakcji z Gitem wykorzystywano backend git-http-backend, a uwierzytelnianie odbywało się za pomocą serwera HTTP Apache2, który weryfikował uprawnienia, zwracając się do bazy danych, znajdującej się w SGBD na serwerze master.php.net. Dopuszczano wejście nie tylko za pomocą kluczy, ale także za pomocą zwykłego hasła. Analiza logów serwera http potwierdziła, że złośliwe zmiany zostały wprowadzone przez HTTPS.
Podczas analizy logów odkryto, że atakujący nie połączyli się od razu, lecz najpierw próbowali odgadnąć nazwę konta, ale po jej ustaleniu weszli przy pierwszej próbie, tzn. wcześniej znali hasła Rasmusa i Nikity, ale nie znali ich loginów. Jeśli atakujący uzyskali dostęp do SGBD, nie jest jasne, dlaczego od razu nie użyli prawidłowego loginu podanego tam. Ta niezgodność nie została dotąd w wiarygodny sposób wyjaśniona. Włamanie do master.php.net jest uważane za najbardziej prawdopodobny scenariusz, ponieważ na tym serwerze wykorzystano bardzo stary kod i przestarzały system operacyjny, które od dawna nie były aktualizowane i miały nieusunięte luki bezpieczeństwa.
Wśród podjętych działań zauważono reinstalację środowiska serwera master.php.net oraz przeniesienie skryptów na nową wersję PHP 8. Kod do pracy z SGBD został przebudowany w celu użycia zapytań parametryzowanych, które utrudniają wstrzykiwanie kodu SQL. Do przechowywania haszy haseł w bazie danych zastosowano algorytm bcrypt (wcześniej hasła były przechowywane przy użyciu niebezpiecznego hasza MD5). Istniejące hasła zostały zresetowane, a użytkownicy zostali poproszeni o ustawienie nowego hasła przez formularz resetowania hasła. Ponieważ dostęp do repozytoriów git.php.net i svn.php.net przez HTTPS był związany z haszami MD5, postanowiono pozostawić git.php.net i svn.php.net w trybie tylko do odczytu oraz przenieść wszystkie pozostałe repozytoria rozszerzeń PECL na GitHub, analogicznie do głównego repozytorium PHP.
Źródło: opennet.ru
