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

11 maja 2024, 15:22 | W biegu | komentarze 2

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. 

Rysunek 1. Utrwalone żądanie i odpowiedź zawierająca zmienne środowiskowe serwera, żródło

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

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Roman

    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.)

    Odpowiedz
  2. tom

    Ruby i wszystko jasne.
    W tym języku za dużo jest magii.

    Odpowiedz

Odpowiedz