Kompromitacja pakietów Laravel-Lang: złośliwy stealer uruchamiany automatycznie przez Composer - Security Bez Tabu

Kompromitacja pakietów Laravel-Lang: złośliwy stealer uruchamiany automatycznie przez Composer

Cybersecurity news

Wprowadzenie do problemu / definicja

Ekosystem open source pozostaje jednym z kluczowych filarów współczesnego wytwarzania oprogramowania, ale jednocześnie jest coraz częściej wykorzystywany jako wektor ataków typu software supply chain. Incydent związany z pakietami Laravel-Lang pokazuje, jak przejęcie procesu publikacji może doprowadzić do automatycznego uruchamiania złośliwego kodu w środowiskach deweloperskich, serwerowych oraz CI/CD.

W tym przypadku atakujący wykorzystał mechanizm autoloadingu Composera, aby dostarczyć wieloplatformowy malware typu stealer. Zagrożenie było szczególnie niebezpieczne, ponieważ aktywacja nie wymagała żadnej dodatkowej interakcji poza standardowym użyciem zależności przez aplikację PHP.

W skrócie

  • W maju 2026 roku ujawniono kompromitację kilku popularnych pakietów organizacji Laravel-Lang.
  • Zainfekowane zostały pakiety laravel-lang/lang, laravel-lang/http-statuses, laravel-lang/attributes oraz laravel-lang/actions.
  • Złośliwy kod został osadzony w pliku src/helpers.php i dodany do sekcji autoload.files w composer.json.
  • Po uruchomieniu aplikacji lub procesu korzystającego z vendor/autoload.php malware wykonywał się automatycznie.
  • Łańcuch infekcji prowadził do pobrania stealer’a działającego na Windows, Linux i macOS.

Kontekst / historia

Laravel-Lang to popularny zestaw społecznościowych pakietów tłumaczeń i komponentów pomocniczych dla aplikacji budowanych z użyciem frameworka Laravel. Chociaż nie są one częścią oficjalnego rdzenia Laravel, bywają szeroko wdrażane w środowiskach produkcyjnych i developerskich. To zaufanie do rozpoznawalnych bibliotek znacząco zwiększyło potencjalną skalę incydentu.

Badacze zwrócili uwagę, że problem nie ograniczał się do pojedynczej nowej wersji. W krótkim czasie doszło do przepublikowania lub nadpisania dużej liczby historycznych tagów w wielu repozytoriach jednocześnie. Taki wzorzec sugeruje naruszenie procesu wydawniczego albo przejęcie uprawnień organizacyjnych, a nie zwykłą pomyłkę maintainerską.

To ważne z perspektywy bezpieczeństwa, ponieważ przypięcie konkretnego numeru wersji nie dawało pełnej ochrony. Jeśli historyczne tagi zostały przepisane, organizacje mogły pobrać złośliwy artefakt mimo korzystania z wcześniej znanych wersji.

Analiza techniczna

Rdzeniem ataku było wykorzystanie zachowania Composera związanego z sekcją autoload.files. W przeciwieństwie do mechanizmu leniwego ładowania klas, pliki wymienione w tej sekcji są ładowane natychmiast po zainicjowaniu autoloadera. Oznaczało to, że kod umieszczony przez atakujących wykonywał się automatycznie przy starcie aplikacji, testów lub jobów CI.

Praktyczny próg aktywacji był bardzo niski. Wystarczało wykonać composer install lub composer update, a następnie uruchomić aplikację PHP albo dowolny proces wykorzystujący autoloader. Nie było konieczne wywołanie konkretnej klasy, metody czy funkcji biznesowej, co znacząco zwiększało skuteczność ataku.

Z analizy incydentu wynika, że dropper najpierw profilował hosta, a następnie kontaktował się z zewnętrzną infrastrukturą sterującą w celu pobrania dalszego ładunku. Mechanizm wykorzystywał unikalny identyfikator systemu, aby ograniczać wielokrotne wykonanie na tej samej maszynie i utrudniać korelację zdarzeń podczas dochodzenia.

Docelowy payload miał charakter rozbudowanego stealer’a napisanego w PHP. Na systemach Windows stosowano dodatkowy launcher oparty o Visual Basic Script i cscript, podczas gdy na Linuxie i macOS kod wykonywał się bezpośrednio. Malware został zaprojektowany do zbierania danych z wielu warstw środowiska: systemu operacyjnego, chmury, narzędzi DevOps, przeglądarek oraz portfeli kryptowalut.

Zakres pozyskiwanych danych był bardzo szeroki i obejmował między innymi:

  • tokeny i konfiguracje usług chmurowych,
  • dane z metadanych instancji,
  • sekrety CI/CD,
  • klucze SSH,
  • pliki .env,
  • konfiguracje Kubernetes,
  • dane uwierzytelniające Git,
  • historię powłoki,
  • artefakty przeglądarek, ciasteczka i zapisane dane logowania,
  • dane z menedżerów haseł oraz sesji narzędzi administracyjnych.

Istotnym elementem działania malware było także usuwanie śladów po zakończeniu działania. Po eksfiltracji danych payload miał usuwać się z dysku, co ograniczało dostępność artefaktów dla zespołów DFIR i utrudniało jednoznaczne potwierdzenie skali kompromitacji na podstawie samego stanu bieżącego systemu.

Konsekwencje / ryzyko

Ryzyko związane z incydentem należy traktować jako wysokie, a w środowiskach CI/CD i produkcyjnych nawet krytyczne. Jeżeli zainfekowane pakiety zostały zainstalowane lub zaktualizowane w pipeline’ach budowania, atakujący mógł przejąć sekrety umożliwiające dalszą propagację w organizacji.

Najbardziej zagrożone są środowiska posiadające dostęp do tokenów repozytoriów, rejestrów pakietów, platform chmurowych, narzędzi orkiestracji oraz kluczy wykorzystywanych do wdrożeń. W praktyce incydent mógł prowadzić nie tylko do wycieku poświadczeń, ale również do naruszenia integralności procesu dostarczania oprogramowania i przejęcia kolejnych etapów łańcucha dostaw.

Dodatkowym problemem był wieloplatformowy charakter ataku. Podnosi to prawdopodobieństwo kompromitacji zarówno stacji roboczych deweloperów, jak i runnerów CI, kontenerów buildowych czy serwerów aplikacyjnych. W efekcie organizacje powinny zakładać, że kontakt z zagrożonymi pakietami mógł skutkować szerokim wyciekiem sekretów operacyjnych.

Rekomendacje

Organizacje korzystające z pakietów Laravel-Lang powinny w pierwszej kolejności ustalić, czy którykolwiek z zagrożonych komponentów był instalowany lub aktualizowany po rozpoczęciu incydentu. Należy przeanalizować pliki lock, logi buildów, cache zależności, historię runnerów, obrazy kontenerowe oraz artefakty wdrożeniowe.

Jeżeli wystąpiła styczność z potencjalnie złośliwymi wersjami, należy przyjąć scenariusz kompromitacji hosta i wdrożyć działania reagowania na incydent:

  • odizolować podejrzane maszyny oraz pipeline’y,
  • unieważnić i obrócić wszystkie sekrety dostępne z poziomu tych środowisk,
  • zmienić tokeny do chmury, repozytoriów, CI/CD, SSH, baz danych i menedżerów haseł,
  • przeanalizować połączenia wychodzące, logi procesów i historię wykonania zadań,
  • zweryfikować integralność obrazów, artefaktów i paczek zbudowanych w okresie narażenia.

Od strony prewencyjnej warto wdrożyć trwałe mechanizmy ograniczające ryzyko podobnych incydentów:

  • opierać instalację zależności na zweryfikowanych lockfile’ach i kontrolowanych mirrorach lub proxy rejestrów,
  • monitorować anomalie w metadanych pakietów, takie jak masowe przepisywanie tagów, nagłe zmiany autoloadingu czy modyfikacje composer.json,
  • uruchamiać środowiska CI z minimalnymi uprawnieniami i separacją sekretów według kontekstu zadania,
  • skanować zależności pod kątem zmian w autoload.files,
  • monitorować uruchomienia interpreterów i procesów potomnych startowanych z procesów PHP,
  • stosować krótkoterminowe tokeny i federację tożsamości zamiast długowiecznych sekretów,
  • segmentować runnerów buildowych od systemów produkcyjnych i zasobów krytycznych.

Podsumowanie

Incydent wokół Laravel-Lang potwierdza, że współczesne ataki supply chain coraz częściej wymierzone są nie tylko w pojedyncze wersje pakietów, lecz w cały model zaufanego publikowania oprogramowania. Wykorzystanie autoload.files w Composerze zapewniło atakującym natychmiastowe wykonanie złośliwego kodu podczas zwykłego uruchamiania aplikacji PHP.

Dla zespołów bezpieczeństwa najważniejsze wnioski są jednoznaczne: nie należy ufać wyłącznie numerom wersji, środowiska buildowe trzeba traktować jako zasoby wysokiego ryzyka, a kompromitacja zależności powinna być rozpatrywana jako potencjalny wyciek wszystkich dostępnych sekretów. Skuteczna reakcja wymaga zarówno szybkiego dochodzenia technicznego, jak i długofalowego uszczelnienia procesu zarządzania zależnościami.

Źródła

  1. https://thehackernews.com/2026/05/laravel-lang-php-packages-compromised.html
  2. https://www.stepsecurity.io/blog/laravel-lang-supply-chain-attack
  3. https://socket.dev/blog/laravel-lang-compromise
  4. https://www.aikido.dev/category/vulnerabilities-threats