Przepływ zamykający nieaktywne zgłoszenia w jednym z projektów na GitHubie przez cztery miesiące padał po dwóch sekundach, a 16 września nagle zaczął działać i trwał ponad 11 minut. Nikt nie zmienił w nim ani linijki. Zmieniło się tylko to, że dwie akcje GitHub Actions, przejęte w maju w kampanii Mini Shai-Hulud, znów dało się pobrać. Te akcje to actions-cool/issues-helper i actions-cool/maintain-one-comment. Ich tagi wersji przez cały ten czas wskazywały na złośliwy kod, który w maszynie budującej ma dostęp do tokenów i sekretów. Opisała to firma Socket 24 września, a w nocy z 24 na 25 września GitHub ponownie zablokował oba repozytoria. Jeśli twój projekt używa którejś z tych akcji, masz do zrobienia trzy rzeczy: sprawdzić historię przebiegów, zmienić sekrety i przypiąć akcje do konkretnych commitów.
Co się stało z akcjami issues-helper i maintain-one-comment
Obie akcje to drobne narzędzia porządkowe. Pierwsza zamyka stare zgłoszenia i sprawdza nowe, druga utrzymuje w wątku jeden aktualny komentarz bota. Według analizy Socketa napastnicy podmienili ich zawartość 18 maja, a dzień później zespół bezpieczeństwa GitHuba wyłączył oba repozytoria. Przepływy, które z nich korzystały, zaczęły wtedy padać na etapie przygotowania zadania, zanim uruchomił się jakikolwiek kod. To zatrzymało atak, ale tylko na czas blokady.
Tagów wersji nikt nie posprzątał. Gdy 16 września, między 11:09 a 18:16 czasu polskiego, repozytoria znów stały się dostępne, każdy przepływ odwołujący się do nich po tagu pobrał złośliwy kod przy najbliższym uruchomieniu. Socket nie ustalił, dlaczego blokadę zdjęto.
Sprawdziliśmy stan repozytoriów przez API GitHuba 26 września. Oba zwracają komunikat o zablokowanym dostępie z powodu naruszenia regulaminu, a blokada trwa od 24 września, 23:51 czasu UTC. Obecnie przepływy z tymi akcjami znów padają przy starcie. Okno, w którym kod się wykonywał, trwało więc nieco ponad osiem dób.
Skala jest duża. Socket podaje, że od samej akcji issues-helper zależy według grafu zależności GitHuba około 15 tysięcy repozytoriów. Nie wiadomo, ile z nich odwołuje się do akcji po tagu, a ile po skrócie konkretnego commita, bo tego Socket nie policzył. Takie przepływy uruchamiają się zwykle codziennie albo przy każdym nowym zgłoszeniu. Według Socketa większość dotkniętych projektów prawdopodobnie wykonała kod w ciągu doby od odblokowania.
Dlaczego odwołanie po tagu w GitHub Actions uruchomiło stary kod
Zapis uses: actions-cool/issues-helper@v2.2.1 wygląda jak numer wersji, ale wskazuje na tag w Gicie. Tag to przesuwalna etykieta. Wskazuje na ten commit, na który ktoś go ustawił, i można go przestawić bez zmiany nazwy. Maszyna budująca przy każdym zadaniu pobiera akcję od nowa i uruchamia to, na co tag wskazuje w danej chwili.
Socket pokazuje to na logach. Tag v2.2.1 prowadził do commita a0c53dd42fc842d2f9276c5a1d4f9a26abe8713d ze zaciemnionym plikiem index.js. Logi pokazują instalację środowiska Bun i kilkuminutowe uruchomienie tego pliku. Według Socketa pasuje to do nakładki, która najpierw wykonuje złośliwy kod, a potem oddaje sterowanie właściwej akcji, dzięki czemu przebieg wygląda na udany.
Kod działający w akcji ma dostęp do tokenu GITHUB_TOKEN i do każdego sekretu, który przepływ przekazuje zadaniu. W publicznym repozytorium przepływ reagujący na nowe zgłoszenia może uruchomić każdy użytkownik GitHuba. Wystarczy, że założy zgłoszenie.
Ten sam schemat widzieliśmy już w tym roku kilka razy. W maju Mini Shai-Hulud zainfekował 314 paczek npm w 22 minuty. W sierpniu jego kolejna odsłona weszła do paczek z rodziny keyv. We wrześniu napastnicy przejęli konta opiekunów paczek Rusta w crates.io. Tym razem nie było nawet nowego włamania. Wystarczyło, że zablokowane repozytorium wróciło z tą samą zawartością.
Jak sprawdzić, czy twoje przepływy GitHub Actions używały tych akcji
Zacznij od plików przepływów. W katalogu repozytorium wystarczy jedno polecenie:
grep -rn "actions-cool/issues-helper@\|actions-cool/maintain-one-comment@" .github/workflows/
Przy wielu repozytoriach wygodniejsza jest wyszukiwarka kodu na GitHubie z zapytaniem w rodzaju org:twoja-organizacja actions-cool/issues-helper path:.github/workflows. Każde odwołanie po tagu, na przykład @v2.2.1 albo @v3, traktuj jak dotknięte atakiem.
Potem przejrzyj historię przebiegów tych przepływów w zakładce Actions. Socket radzi szukać dwóch sygnałów. Pierwszy to przebiegi, które przez dłuższy czas padały po kilku sekundach, a od 16 września nagle się udają. Drugi to czas trwania, który skoczył z sekund do kilku minut. W logach zadania podejrzane są pobranie akcji instalującej środowisko Bun i polecenie bun run $GITHUB_ACTION_PATH/index.js wykonane w ramach którejś z dwóch akcji.
Na koniec przejrzyj historię commitów od 16 września. Jeśli przepływ miał uprawnienia do zapisu, token mógł posłużyć do wypchnięcia zmian, których nikt z zespołu nie robił.
Jak przypiąć akcję do SHA commita zamiast tagu
Tag można przestawić, a pełnego skrótu SHA commita już nie. Przypięty przepływ wygląda tak:
steps:
- uses: nazwa-autora/nazwa-akcji@<pełny 40-znakowy skrót SHA commita> # v1.2.3
Komentarz z numerem wersji na końcu linii pomaga ludziom i narzędziom takim jak Dependabot, który umie aktualizować akcje przypięte do SHA. Skrót sprawdzisz na stronie wydania w repozytorium akcji albo poleceniem git ls-remote wywołanym na jej repozytorium.
Jest jedno zastrzeżenie, o którym Socket pisze wprost. Przypięcie chroni tylko wtedy, gdy przypięty commit jest czysty. W przypadku tych dwóch akcji chodzi o commit z wydania sprzed 18 maja. Rozsądniej jest jednak usunąć je całkiem, bo repozytoria i tak są dziś zablokowane, a ich zadania łatwo zastąpić innymi narzędziami albo krótkim skryptem.
Frontend Master 2026 · Kodożercy
Pisz kod, nie tylko prompty
Frontend Master 2026 to pakiet sześciu kursów Kodożerców (HTML, CSS, JavaScript, Git) w polskim wideo z 12-miesięcznym dostępem. Fundamenty frontu od pierwszej linijki kodu do deploy.
Wchodzę w to →

Które sekrety trzeba zmienić po ataku
Każdy przepływ, który od 16 września uruchomił którąś z tych akcji po tagu, trzeba traktować tak, jakby jego sekrety wyciekły. Dotyczy to wszystkiego, co przepływ dostawał w zmiennych: kluczy do chmury, tokenów npm i PyPI, kluczy do serwerów wdrożeniowych i tokenów do zewnętrznych usług. Zmień je u źródła, a potem zaktualizuj w ustawieniach repozytorium. Przy okazji sprawdź, czy któryś z nich nie był używany z nieznanych miejsc.
Sam GITHUB_TOKEN wygasa po zakończeniu zadania, więc zmieniać go nie trzeba. Trzeba za to sprawdzić, co wolno mu było zrobić w czasie działania. Jeśli przepływ nie ustawia uprawnień jawnie, dostaje domyślne ustawienia repozytorium albo organizacji. Mogą one obejmować zapis do kodu. Dlatego w każdym przepływie warto wpisać sekcję permissions z najmniejszym zakresem, jaki jest potrzebny. Akcja zamykająca stare zgłoszenia potrzebuje dostępu do zgłoszeń, a do kodu repozytorium już nie.
Masz pomysł na aplikację? Najpierw go zobacz
Zanim zainwestujesz w pełny system, przygotujemy klikalny prototyp, który pokażesz zespołowi albo klientom. Potem budujemy aplikację webową, która rośnie razem z firmą.
Podsumowanie
Dwie akcje porządkowe z konta actions-cool zostały przejęte w maju i zablokowane przez GitHub dzień później. 16 września repozytoria wróciły z nietkniętymi tagami, więc przepływy odwołujące się do nich po tagu przez ponad osiem dni uruchamiały złośliwy kod z dostępem do sekretów. W nocy z 24 na 25 września GitHub znów je zablokował. Według Socketa od samej akcji issues-helper zależy około 15 tysięcy repozytoriów, choć nie wiadomo, ile z nich używało tagu. Właściciel projektu powinien przeszukać katalog .github/workflows/ i przejrzeć historię przebiegów od 16 września. Sekrety przepływów, które uruchomiły akcję, trzeba zmienić, a historię commitów przejrzeć. Na przyszłość najwięcej daje przypinanie zewnętrznych akcji do pełnego skrótu SHA i ograniczanie uprawnień tokenu. Przypięty commit nie zmieni się bez twojej wiedzy, niezależnie od tego, co stanie się z tagami w cudzym repozytorium.
Newsletter · DevstockAcademy & Kodożercy
Bądź na bieżąco ze światem IT, AI i automatyzacji
Co wtorek: newsy z branży, praktyczne tipy i narzędzia które warto znać. Zero spamu.



