Mega Sekurak Hacking Party w Krakowie! 20.10.2025 r. Bilety -30%

Atak na łańcuch dostaw w npm – malware ukryty w kodach QR

29 września 2025, 11:44 | W biegu | 0 komentarzy

Środowisko NPM po raz kolejny stało się miejscem propagacji malware. Jeszcze nie milkną echa o ostatniej szeroko zakrojonej kampanii, która na szczęście nie odniosła oczekiwanych efektów, a już pojawiło się nowe zagrożenie. Malware ukryty w kodzie QR, umieszczony w pakiecie fezbox.

TLDR:

  • Badacze bezpieczeństwa informują o kolejnym ataku na łańcuch dostaw w npm.
  • Malware został umieszczony w pakiecie fezbox, który oferował zestaw narzędzi JavaScript/TypeScript wspierających deweloperów.
  • Głównym celem ataku było przejęcie danych uwierzytelniających użytkowników, przechowywanych w ciasteczkach (login i hasło).
  • Aby utrudnić wykrycie złośliwej aktywności, malware stosował szereg technik ukrywania takich jak: obfuskacja, odwracanie łańcuchów znaków, steganografia w kodach QR.
  • NIewielka liczba pobrań pakietu oraz konstrukcja ciasteczek we współczesnych aplikacjach webowych znacząco zredukowały skuteczność ataku.

Podejrzana biblioteka została wykryta przez badaczy z zespołu Socket Threat Research na portalu npm. Pakiet o nazwie fezbox, zgodnie z przeznaczeniem miał zawierać zestaw narzędzi JavaScript/TypeScript  ułatwiających pracę deweloperom. Posiadał szereg funkcji pomocniczych, dedykowanych do obsługi różnych modułów, pozwalających m.in. na import tylko tych elementów, które są aktualnie potrzebne w projekcie. Ponadto, oferował moduł obsługujący kody QR (generowanie, parsowanie, odczytywanie). 

W rzeczywistości okazało się, że wewnątrz pakietu ukryta została dodatkowa funkcjonalność, przechwytywanie haseł i loginów użytkownika z ciasteczek przeglądarki.

Analiza pakietu fezbox

Biblioteka fezbox została opublikowana na portalu socket.dev. Kod źródłowy nie zostały publicznie udostępniony. Pakiet zawierał jedynie skompilowaną wersję – fezbox.cjs, co utrudniało analizę i wykrycie złośliwego oprogramowania. Ponadto, zawierał szereg technik obfuskacyjnych, takich jak: odwracanie łańcuchów znaków, ukrywanie payloadu w kodach QR, stosowanie steganografii do zabezpieczenia payloadu, dynamiczne pobieranie kodu z zewnętrznych serwisów. Wszystkie te mechanizmy skutecznie utrudniały wykrycie przez automatyczne skanery. Na poniższym rysunku przedstawiono zawartość pliku fezbox.cjs.

Rys. 1 Zawartość pliku fezbox.cjs. Źródło: socket.dev

Na szczególną uwagę zasługuje poniższy fragment kodu:

Rys. 2 Zawartość pliku fezbox.cjs – złośliwy kod. Źródło: socket.dev

Zgodnie z listingiem kodu przedstawionego na Rys. 2, w pierwszym etapie następuje sprawdzenie, czy kod został uruchomiony w środowisku deweloperskim oraz losowo (w 2 na 3 przypadków) nie wykonuje żadnej akcji. Następnie, przed realizacją głównej funkcji zaimplementowano 120 sekundowy timeout. W ten sposób atakujący starają się ukryć przed automatycznymi skanerami. 

Po odwróceniu ciągu znaków i przejściu na otrzymany adres strony wyświetlał się złośliwy kod QR. Podczas analizy kod QR pozostawał nadal aktywny i możliwy do odczytania. Co ciekawe, skanery kodów QR nie potrafiły go rozpoznać, głównie z powodu zastosowania mechanizmów obfuskacji. Kod był możliwy do odczytania, jedynie z poziomu pakietu fezbox

Należy podkreślić, że kod QR był niewidoczny dla użytkownika i korzystał z niego jedynie malware. Link prowadzący do kodu został na stałe zahardkodowany w pakiecie. Jego zastosowanie miało na celu utrudnienie wykrycia złośliwego kodu przez automatyczne skanery bezpieczeństwa.  

Rys. 3 Kod QR zawierający złośliwy skrypt. Źródło: res.cloudinary.com.
Rys. 4 Payload umieszczony w kodzie QR. Źródło: socket.dev/blog
Rys. 5 Payload po deobfuskacji. Źródło: opracowanie własne

Jak widać na Rys. 5, malware odczytuje ciasteczko z przeglądarki, próbuje pobrać nazwę użytkownika oraz hasło, a następnie wysyła odczytane dane na adres https://my-nest-app-production[.]up[.]railway[.]app/users. W przypadku, kiedy dane te nie zostaną odnalezione, kończy działanie.

Malware wykryty, co dalej?

Zarówno badacze z Socket Threat Research jak i automatyczny skaner malware – Socket AI Scanner wykryli złośliwy kod. W konsekwencji pakiet został zablokowany i usunięty z serwisu.

Rys. 7 Informacja na temat statusu pakietu. Źródło: socket.dev

Liczba pobrań pakietu (mniej niż 100) sugeruje, że nie był on zbyt popularny wśród deweloperów. Biorąc pod uwagę fakt, że współczesne aplikacje nie przechowują danych uwierzytelniających użytkownika (login i hasło) w postaci jawnej w ciasteczkach można ocenić, że jego skuteczność była ograniczona.

Nie mniej jednak sam sposób przeprowadzenia ataku, a w szczególności zastosowane mechanizmy obfuskacyjne (odwracanie łańcuchów znaków, ukrywanie payloadu w kodzie QR, obfuskacja kodu, dynamiczne pobieranie malware z zewnętrznych serwisów) są godne uwagi i pokazują kreatywność atakujących. 

Zaprezentowany wektor ataku oraz zastosowane techniki ukrywania złośliwej aktywności wyraźnie pokazują, że cyberprzestępcy doskonalą swoje umiejętności programistyczne, a w niedalekiej przyszłości można spodziewać się coraz to bardziej wyrafinowanych sposobów ataku. 

Źródło: socket.dev/blog

~_secmike

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

Odpowiedz