Operacja trwała między około 11:36 a 17:48 UTC, co sugeruje wysoce zautomatyzowany system zaprojektowany do szybkiego kompromitowania dużej liczby repozytoriów, zanim opiekunowie projektu zauważyli zmiany.
Kampania opierała się na automatyzacji i kamuflażu społecznym, aby złośliwe commity wyglądały jak normalne czynności konserwacyjne CI.
Atakujący tworzyli jednorazowe konta GitHub z losowymi nazwami użytkowników i podszywali się pod tożsamości automatyzacji, takie jak:
Te tożsamości sprawiały, że commity wyglądały jak rutynowe działanie systemów automatyzacji, a nie ludzkiego atakującego.
Dane autorów i wiadomości commitów zostały sfałszowane, aby wyglądać wiarygodnie – często przypominały rutynowe aktualizacje workflowu lub poprawki konfiguracji CI. Pomogło to wtopić commity w normalną aktywność programistyczną i opóźniło podejrzenia.
Kampania skupiła się na repozytoriach, w których reguły ochrony gałęzi były słabe lub nieobecne. Bez obowiązkowych przeglądów pull requestów lub ograniczeń dotyczących modyfikowania workflowów atakujący mogli wypychać zmiany w workflowach bezpośrednio do domyślnej gałęzi repozytorium.
Każdy złośliwy commit dodawał plik workflow GitHub Actions zawierający zakodowany w Base64 ładunek Bash. Gdy potok CI się wykonał, skrypt uruchamiał się w środowisku wykonawczym GitHub Actions i zaczynał kraść dane uwierzytelniające.
To oznaczało, że atak często pozostawał uśpiony do momentu następnego uruchomienia CI, które aktywowało workflow.
Zakodowany w Base64 skrypt osadzony w workflowach został zaprojektowany do zbierania wrażliwych danych ze środowiska CI i wysyłania ich do infrastruktury kontrolowanej przez atakujących.
Zgłaszane cele obejmowały:
Złośliwe oprogramowanie zbierało zmienne środowiskowe, informacje o systemie i sekrety dostępne dla wykonawcy CI, a następnie wysyłało je do serwera dowodzenia i kontroli.
Ponieważ potoki CI często zawierają dane uwierzytelniające do wdrożeń, kompromitacja środowiska budowania może otworzyć drogę do infrastruktury chmurowej, rejestrów pakietów i wdrożeń produkcyjnych.
Głównym celem ładunku Megalodon były tokeny OIDC GitHub Actions.
Nowoczesne potoki CI/CD często używają federacji OpenID Connect (OIDC), aby uwierzytelniać się u dostawców chmurowych bez przechowywania długoterminowych danych uwierzytelniających. Zamiast tego workflow żąda krótkotrwałego tokena tożsamości, który dostawcy chmury wymieniają na tymczasowe dane dostępu.
Takie podejście poprawia bezpieczeństwo, eliminując statyczne klucze API lub dane uwierzytelniające kont usługowych. Wprowadza jednak nowe ryzyko: jeśli atakujący ukradnie token podczas wykonywania potoku, może tymczasowo podszyć się pod tożsamość zadania CI.
Ponieważ te tokeny są zaufane przez systemy tożsamości w chmurze, skradziony token może potencjalnie zostać wymieniony na tymczasowy dostęp do chmury z tymi samymi uprawnieniami, jakie ma potok wdrożeniowy.
Oznacza to, że skompromitowany workflow CI może prowadzić do:
Mimo że tokeny OIDC szybko wygasają, uprawnienia z nimi związane mogą sprawić, że krótkoterminowy dostęp będzie niezwykle wartościowy dla atakujących.
Kampania Megalodon ilustruje przesunięcie w atakach na łańcuch dostaw – od modyfikowania kodu aplikacji w kierunku kompromitowania infrastruktury automatyzacji.
Atakując workflowy CI zamiast kodu źródłowego, atakujący mogą:
Ponieważ tysiące repozytoriów polega na potokach CI z silnymi danymi uwierzytelniającymi, pojedyncza modyfikacja workflowu może ujawnić sekrety w wielu systemach downstream.
Mniej więcej w tym samym czasie GitHub ujawnił osobny incydent bezpieczeństwa związany z zatrutym rozszerzeniem Visual Studio Code zainstalowanym na urządzeniu pracownika. Złośliwe rozszerzenie umożliwiło atakującym dostęp do około 3800 wewnętrznych repozytoriów GitHub, zanim kompromitacja została opanowana.
To naruszenie zostało prześledzone do skompromitowanego środowiska programisty i obejmowało kradzież danych uwierzytelniających za pośrednictwem trojanizowanego rozszerzenia dystrybuowanego za pośrednictwem rynku VS Code.
Niektóre raporty bezpieczeństwa zauważają podobieństwa w czasie i taktyce między tym incydentem a innymi atakami na łańcuch dostaw wymierzonymi w narzędzia deweloperskie. Jednak publiczne dowody nie potwierdziły, że wewnętrzne naruszenie GitHub bezpośrednio umożliwiło kampanię Megalodon.
Na razie oba incydenty najlepiej rozumieć jako osobne, ale współczesne zdarzenia w zakresie bezpieczeństwa łańcucha dostaw, które dotknęły ekosystem programistów.
Megalodon pokazuje, jak szybko automatyzacja może rozprzestrzenić atak na łańcuch dostaw na tysiące repozytoriów. Łącząc podszywanie się pod boty, zautomatyzowane commity i zatrute workflowy CI, atakujący zamienili rutynową infrastrukturę budowania w system kradnący dane uwierzytelniające.
Incydent wzmocnił kilka priorytetów obronnych dla zespołów programistycznych:
Ponieważ potoki programistyczne coraz częściej kontrolują wdrożenia chmurowe i infrastrukturę produkcyjną, bezpieczeństwo workflowów CI/CD stało się kluczową częścią obrony łańcucha dostaw oprogramowania.