Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Można było czytać zmienne środowiskowe i wykonać kod na serwerach Githuba
Każdy zespół bezpieczeństwa lubi otrzymać zgłoszenie podatności w piątek po 17. Tym razem autor znaleziska (@Creastery) opisuje szczegóły podatności, którą odnalazł w okolicach Świąt Bożego Narodzenia 2023, odrywając zespół reagowania na incydenty od makowca. Użytkownicy GitHuba mogli trafić na ogłoszenie, w którym informowano że sekrety, takie jak klucze API itd. zostały unieważnione i wygenerowane na nowo. Jest to standardowa procedura w przypadku podejrzenia ich wycieku. Podatność została sklasyfikowana jako CVE-2024-0200.
Teraz jest już jasne, dlaczego GitHub był zmuszony do podjęcia takich kroków. Okazuje się, że napisany w Ruby serwer GHES (GitHub Enterprise Server) wykorzystywał mechanizm refleksji, który pozwalał na wywołanie dowolnej metody posiadającej zerową liczbę argumentów na jednym z obiektów (konkretnie obiektu Repository
). To pozwoliło badaczowi przez przypadek wylistować przeszło 2MB zmiennych środowiskowych na serwerze GitHub.com.
Autor badania powiadomił GitHuba o zaistniałej sytuacji. Postanowił też spróbować zwiększyć krytyczność błędu doprowadzając do zdalnego wykonania kodu (Remote Code Execution). W tym celu wykorzystał jeden z ujawnionych sekretów. Znalazł tam wartość, która jest wykorzystywana do podpisywania zserializowanych danych. Atakujący, który jest w stanie podrobić podpis zserializowanej wartości, może przesłać do serwera dowolne dane tego typu, które zostaną “rozpakowane” przy pomocy metody Marshal.load
. Czytelnicy znający tematykę deserializacji niezaufanych danych już wiedzą dokąd to zmierza. Stosowna informacja znajduje się też w dokumentacji Ruby:
Never pass untrusted data (including user supplied input) to this method. Please see the overview for further details.
Na szczęście zmienna środowiskowa ENTERPRISE_SESSION_SECRET
umożliwiająca podpisanie danych nie była skonfigurowana na serwerze publicznym GitHuba, co ograniczyło tę podatność tylko do instancji Enterprise. W przypadku atakowania firmowych serwerów GH, atakujący musi mieć rolę właściciela organizacji, co jest całkiem sporym ograniczeniem.
Jak zauważa sam autor, to tylko jedna z metod uzyskania RCE, ponieważ zdobywając sekrety ze zmiennych środowiskowych można było spróbować wykonać kod przy pomocy wywołań do API. Taka metoda nie była przez niego testowana.
GitHub dokonał niezbędnych aktualizacji oraz poinformował użytkowników o zaistniałym problemie. Znalazcy gratulujemy bardzo ciekawego błędu. Cieszy też profesjonalna i szybka reakcja inżynierów GitHuba pomimo świątecznego czasu.
~fc
Po to, między innymi, różne firmy zatrudniają ludzi z różnych kultur, pracujących w różnych strefach czasowych.
(Godzina 17 nie wypada wtedy u wszystkich w tym samym czasie, a Boże Narodzenie nie odrywa ludzi od pracy w Indiach lub Chinach.)
Ruby i wszystko jasne.
W tym języku za dużo jest magii.