W weekend 16–17 maja 2026 roku Grafana Labs — firma stojąca za jednym z najpopularniejszych narzędzi do monitoringu i wizualizacji metryk — padła ofiarą włamania do swojego środowiska GitHub. Atakujący nie złamał żadnego hasła ani nie wyłudził MFA. Wykorzystał dobrze udokumentowaną pułapkę w GitHub Actions, którą badacze bezpieczeństwa nazywają “Pwn Request”. Dzięki niej z forkowanego, publicznego repozytorium wyciągnął uprzywilejowany token dostępu i pobrał całość prywatnego kodu Grafany oraz czterech powiązanych repozytoriów. Wykrycie ataku zawdzięczamy bardzo prozaicznemu mechanizmowi — pojedynczemu canary tokenowi, który firma rozsiała w swoim środowisku właśnie po to, żeby krzyczeć, kiedy ktoś go dotknie. Do ataku przyznała się grupa Coinbase Cartel, opisywana przez Sophos jako odprysk ekosystemu ShinyHunters, Scattered Spider i LAPSUS$. Grafana odmówiła zapłaty okupu i opublikowała szczegółowe post-mortem.
Co poszło nie tak w CI/CD
Sercem ataku była zła konfiguracja workflow w GitHub Actions, który wyzwalał się na zdarzeniu pull_request_target. To zdarzenie ma jedną bardzo niewygodną właściwość — w odróżnieniu od zwykłego pull_request, uruchamia kod w kontekście repozytorium docelowego, czyli z dostępem do sekretów i tokenów organizacji. Jeżeli workflow dodatkowo wykonuje skrypty pochodzące z forkowanego brancha (np. testy, lintery, narzędzia buildowe), atakujący może umieścić w forku własny kod, który zostanie wykonany z uprawnieniami głównej organizacji.
W przypadku Grafany napastnik sforkował publiczne repozytorium, a w nazwie brancha umieścił specjalnie spreparowane polecenie, które po podstawieniu do komendy curl uruchomiło zewnętrzny skrypt. Skrypt wydrukował zmienne środowiskowe, zaszyfrował je i wysłał na zewnątrz. Wśród tych zmiennych znajdował się uprzywilejowany token GitHub, którym atakujący zalogował się jak własny pracownik Grafany.
Z tym tokenem napastnik pobrał całe prywatne repozytorium Grafany oraz cztery dodatkowe, a następnie skasował forka, żeby zatrzeć ślady. Klasyczny scenariusz “supply chain via CI/CD”.
Jak canary token uratował sytuację
Kluczowy moment tej historii to wykrycie. Grafana ma w swoim środowisku rozsiane setki canary tokenów — fałszywych poświadczeń, kluczy API i sekretów, które wyglądają jak prawdziwe, ale ich jedynym zadaniem jest wystrzelić alarm w momencie, gdy ktokolwiek spróbuje ich użyć. Atakujący, który zassał całą zawartość zmiennych środowiskowych, automatycznie zassał też kilka takich pułapek. Pierwsze użycie podstawionego tokena natychmiast obudziło zespół bezpieczeństwa.
To bardzo dobry przykład tego, dlaczego canary tokeny są jednym z najtańszych i najskuteczniejszych mechanizmów wykrywania włamań. Nie kosztują praktycznie nic, nie wymagają utrzymania, a w momencie ataku dają detekcję wręcz natychmiastową — przed jakimkolwiek SIEM-em czy analizą logów.
Coinbase Cartel — kto za tym stoi
Do ataku przyznała się grupa Coinbase Cartel, która pojawiła się we wrześniu 2025 roku. Sophos klasyfikuje ją jako rozwinięcie tej samej sceny, która stoi za ShinyHunters, Scattered Spider i LAPSUS$. Nie jest to klasyczny ransomware z szyfrowaniem — Coinbase Cartel zajmuje się czystą ekstorsją danych. Wykrada kod źródłowy, dane klientów albo wewnętrzne dokumenty, a potem żąda okupu w zamian za niepublikowanie ich. Grafana otrzymała taki klasyczny szantaż wraz z próbką pobranego kodu i odmówiła zapłaty, powołując się na rekomendacje FBI mówiące, że płacenie tylko napędza kolejne ataki i nie daje żadnej gwarancji usunięcia danych.
Co istotne, Grafana po analizie incydentu poinformowała, że nie ma śladów dostępu do danych klientów ani systemów produkcyjnych. Wyciekł sam kod, w tym także elementy komponentów Enterprise, ale firma od dawna projektuje swoje produkty tak, żeby bezpieczeństwo nie zależało od ukrywania samego kodu źródłowego.
Co administrator GitHub-a powinien zrobić jeszcze dziś
Pierwsza rzecz to audyt wszystkich workflowów używających pull_request_target. Sama dokumentacja GitHuba ostrzega przed tym triggerem od lat, ale w praktyce wiele projektów wciąż używa go w trybie, który pozwala atakującemu wprowadzić kod do trusted context. Zasada jest prosta — pull_request_target nigdy nie powinien wykonywać kodu z forka. Jeżeli musisz uruchomić coś z PR-a (np. testy), zrób to przez zwykły pull_request, który nie ma dostępu do sekretów, albo użyj mechanizmu environment z manualną aprobatą.
Druga sprawa to zasada najmniejszych uprawnień dla tokenów. GITHUB_TOKEN domyślnie potrafi mieć szerokie uprawnienia — w pliku workflow ogranicz je do minimum przez sekcję permissions. Jeżeli używasz tokenów PAT do dostępu między repozytoriami, koniecznie zamień je na fine-grained tokens albo na GitHub Apps z ograniczonym scope.
Trzecia rzecz to canary tokeny. Wbrew pozorom to nie jest gadżet dla wielkich korporacji — darmowe canary tokeny od Thinkst (canarytokens.org) możesz wygenerować i rozsiać po swoim GitHubie, plikach .env, dokumentach Confluence czy nawet w S3 w piętnaście minut. Dopóki nikt ich nie tknie, nic się nie dzieje. W dniu ataku stają się twoim najszybszym alarmem.
Czwarta — log scanning na zmienne środowiskowe. Wiele ataków typu Pwn Request wykrywa się retrospektywnie po tym, że w logach workflow pojawia się dziwna komenda lub niezwykle długi base64 w nazwie brancha. GitHub ma audit log organizacji, warto skonfigurować jego eksport do SIEM i alerty na nietypowe wzorce.
Podsumowanie
Atak na Grafana Labs to jeden z najczystszych w ostatnich miesiącach przykładów ryzyka związanego z CI/CD. Pwn Request w pull_request_target jest znany od lat, ale wciąż żyje w setkach tysięcy publicznych repozytoriów. To, co odróżnia Grafanę od typowych ofiar tego typu ataków, to dwie decyzje podjęte na długo przed włamaniem — postawienie canary tokenów w środowisku oraz projektowanie bezpieczeństwa bez polegania na ukryciu kodu źródłowego. Dzięki pierwszej zespół wiedział o ataku w ciągu minut, dzięki drugiej — wyciek kodu nie pociągnął za sobą wycieku danych klientów ani kompromitacji infrastruktury. Jeśli zarządzasz organizacją na GitHubie i nigdy nie audytowałeś swoich workflowów Actions pod kątem pull_request_target, ten weekend jest dobrym powodem, żeby się tym zająć.