Kampania wfx-loot wykorzystywała przejęte konta GitHub do sprawdzania repozytoriów, a tam, gdzie konta miały uprawnienia do zapisu — do wprowadzania kodu kradnącego sekrety ze środowisk ciągłej integracji (CI). Aikido poinformowało o 4 837 przejętych kontach i zgłoszeniach pull request w 61 764 repozytoriach. Według opublikowanego zestawienia firmy w co najmniej 1 835 repozytoriach uruchomiono ładunek i wykradziono poświadczenia.
4
9
Kiedy doszło do ataku i jak długo trwał?
Aktywność rozpoczęła się około 10 listopada 2026 r. o 12:45 UTC. Według jednej z relacji okno wysyłania testowych pull requestów trwało do 11 listopada, do 15:00 UTC — około 26 godzin i 15 minut.
6
7 To zaobserwowany okres sondowania repozytoriów, a nie potwierdzenie, że wtedy ustało każde uruchomienie złośliwego kodu albo późniejsze użycie skradzionych poświadczeń.
Podawane liczby opisują różne etapy kampanii:
- 4 837 kont zostało zgłoszonych jako przejęte.
- 61 764 repozytoria otrzymały testowe pull requesty. To liczba sprawdzonych repozytoriów, nie tych, w których na pewno uruchomiło się złośliwe oprogramowanie.
- Co najmniej 1 835 repozytoriów uwzględniono w opublikowanym przez Aikido zestawieniu uruchomień ładunku i wykradzionych poświadczeń.
9
W części relacji opublikowanych w tym samym czasie pojawiła się niższa liczba: 1 806.
6
10 Dostępne materiały nie wyjaśniają tej różnicy, dlatego warto traktować te dane jako odrębne raportowane wyniki, a nie sumować je ze sobą. Przytoczone źródła nie potwierdzają też późniejszej informacji o około 1 970 potwierdzonych przypadkach publicznych wśród ponad 66 000 celów.
Jak atakujący sprawdzali dostęp
Atakujący otwierali pull requesty zatytułowane docs: dependency audit notes, pochodzące z gałęzi wfx-docs. Były to testy: miały sprawdzić, czy przejęte konto może wprowadzać zmiany w danym repozytorium.
3
4
9
Tam, gdzie pozwalały na to uprawnienia, atakujący umieszczali w środowisku CI ładunek kradnący sekrety. Kampania opierała się na prawidłowych, skradzionych poświadczeniach, a nie na luce w GitHub Actions.
4
9 OX Security opisało złośliwe oprogramowanie jako pojedynczy skrypt powłoki liczący około 1 500 wierszy.
31
W niektórych przypadkach usuwano złośliwe zmiany i logi uruchomień workflow, co utrudniało późniejsze dochodzenie.
1
6 Dostępne dowody potwierdzają ogólny schemat: sondowanie, uruchomienie ładunku i usuwanie śladów. Nie dowodzą jednak, że każda opisywana metoda wdrożenia lub treść commita występowała w każdym przypadku.
Jakich danych szukał złośliwy kod
Udokumentowanym celem było pozyskanie poświadczeń dostępnych zadaniom CI, w tym sekretów GitHub Actions i danych logowania do usług chmurowych. Relacje opisują również próby zdobycia tokenów usług AI.
3
9 Analiza OX Security wymienia wśród celów dane dostępowe do AWS, Azure i Google Cloud.
31 Osobne doniesienia mówią, że złośliwy kod mógł przeszukiwać pamięć procesów działających na runnerze — komputerze wykonującym zadania CI — ale przytoczone materiały nie pokazują, jak często ta metoda okazywała się skuteczna.
17
29
W jednym z podsumowań opisano próby utrwalenia dostępu poprzez zmiany zasad zaufania AWS oraz dodawanie poświadczeń federacyjnych w Azure.
5 Należy traktować to jako raportowane zachowanie, a nie dowód, że zmodyfikowano każde zaatakowane repozytorium lub każde powiązane konto chmurowe. Dostępne ustalenia dotyczą kradzieży poświadczeń; nie wykazują kradzieży kodu źródłowego ani baz danych klientów.
9
15
Co mówią — i czego nie dowodzą — raportowane sygnały
Jedna z relacji podawała, że 92% z 10 431 testowych pull requestów wysłanych z uprawnieniami współpracownika lub organizacji pozostawało otwartych w chwili sprawdzania.
10
19 Sugeruje to, że wiele zgłoszeń nie zostało wtedy obsłużonych, ale nie dowodzi, że właściciele repozytoriów lub zespoły bezpieczeństwa ich nie wykryli. Odsetek ten nie dotyczy wszystkich pull requestów w kampanii.
W poradniku dochodzeniowym opisano też 173 testowe pull requesty wysłane z 19 kont za pomocą tokenów powiązanych z aplikacją GitHub Fly.io. Sama ta obserwacja nie oznacza, że doszło do włamania do infrastruktury Fly.io ani że ładunek uruchomił się w każdym repozytorium osiągniętym przy użyciu tych tokenów.
37
Co sprawdzić, jeśli organizacja mogła być narażona
W ocenie incydentu rozróżnij sondowanie repozytorium, wprowadzenie ładunku, jego uruchomienie i wykradzenie poświadczeń. To różne ustalenia, których nie należy traktować zamiennie.
- Wyszukaj oznaki sondowania. Sprawdź repozytoria, do których konta w organizacji mogły wprowadzać zmiany, pod kątem pull requestów
docs: dependency audit notes i gałęzi wfx-docs.
9
- Przejrzyj CI i dzienniki audytowe. Sprawdź uruchomienia workflow, commity, aktywność gałęzi i dostępne logi chmurowe. Brakujące numery uruchomień mogą być wskazówką, bo raporty mówią o usuwaniu uruchomień i logów, ale sama luka w numeracji nie potwierdza przejęcia.
1
24
- Unieważnij podejrzany dostęp. Cofnij podejrzane tokeny GitHub i sprawdź dostęp kont, współpracowników oraz aplikacji GitHub.
- Szeroko rotuj ujawnione sekrety. Jeśli ładunek się uruchomił, uznaj za potencjalnie przejęte sekrety i role chmurowe dostępne dla danego workflow — nie tylko te widoczne w zachowanych logach.
3
9
- Sprawdź możliwość utrzymania dostępu w chmurze. Zbadaj nieoczekiwane zmiany zasad zaufania AWS oraz zmiany aplikacji lub poświadczeń federacyjnych w Azure, a także nieautoryzowane klucze i inne modyfikacje dostępu.
5
- Zabezpiecz dowody. Zachowaj dostępne logi i zapisy audytowe przed porządkowaniem środowiska, a następnie odnotuj, który etap ataku potwierdzają zebrane dane.