Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!

Kolejna odsłona kampanii złośliwych paczek npm – tym razem dostarczanych w projektach rekrutacyjnych

11 grudnia 2025, 07:40 | Aktualności | 1 komentarz

Badacze z Socket analizują kampanię złośliwych pakietów w npm. Od października opublikowano co najmniej 197 złośliwych paczek, a całość zebrała łącznie ponad 31 tys. pobrań. Celem są programiści blockchain i Web3 uruchamiający projekty-zadania podczas fałszywych rozmowów kwalifikacyjnych. Kampania jest przypisywana atakującym z Korei Północnej.

TLDR:

  • Od października badacze z Socket zidentyfikowali w npm 197 złośliwych paczek, pobranych ponad 31 tys. razy. Niektóre wciąż są dostępne.
  • Celem ataków są programiści blockchain i Web3 biorący udział w fałszywych procesach rekrutacyjnych.
  • Złośliwe paczki pobierają payload hostowany na Vercel i wykonują go przez eval(), umożliwiając zestawienie reverse shella, keylogging, kradzież schowka, danych portfeli, przeglądarek i plików.
  • Wszelki cudzy kod/projekty rekrutacyjne należy uruchamiać w kontenerach lub VM, aby zależności nie były instalowane i nie wykonywały skryptów bezpośrednio na urządzeniu.

Badając złośliwy pakiet npm tailwind-magic badacze odkryli hostowaną na Vercel stronę tetrismic[.]vercel[.]app, a stamtąd dotarli do konta GitHub kontrolowanego przez atakującego – stardev0914, które posiadało 18 repozytoriów. Powiązanie udało się znaleźć i potwierdzić przy współpracy z DPRK Research.

Skaner Socket wykrył w pakiecie tailwind-magic niespójne metadane oraz zapisany na sztywno w kodzie link do repozytorium GitHub: https://github[.]com/stardev0914/tailwind-magic.git.

Rys. 1 – link do repozytorium w kodzie paczki, źródło: socket.dev

Na GitHub przechowywano kod serwera dostarczającego malware (github[.]com/stardev0914/tetrismic) – najnowszy payload był pobierany z Vercel (tetrismic[.]vercel[.]app), a osobny serwer zbierał pozyskane dane. Co najmniej 5 złośliwych pakietów, w tym tailwind-magic, tailwind-node, node-tailwind, node-tailwind-magic i react-modal-select wykorzystywało tę infrastrukturę, aby dostarczyć payload dla drugiego etapu.

Przy każdym żądaniu serwer zwracał payload main.js w odpowiedzi JSON. Złośliwy pakiet npm wykonywał otrzymany kod za pomocą funkcji eval() na urządzeniu ofiary.

Rys. 2 – schemat uruchamiania malware, źródło: socket.dev

Sam payload to najnowszy wariant malware OtterCookie, który po uruchomieniu sprawdza urządzenie pod kątem maszyn wirtualnych i sandboxów, identyfikuje hosta, a następnie ustanawia połączenie z serwerem C2. Umożliwiało to atakującym dostęp (reverse shell) do urządzenia, wykradanie zawartości schowka, keylogging i skanowanie systemu plików w celu zbierania poświadczeń oraz danych portfeli kryptowalutowych.

Rys. 3 – Fragment kodu identyfikującego urządzenie, źródło: socket.dev

Wykradane były również dane przeglądarek – Chrome i Brave:

Rys. 4 – wykradanie danych Chrome i Brave, źródło: socket.dev

Oraz wspomniane portfele kryptowalutowe:

Rys. 5 – wykradanie portfeli kryptowalutowych, źródło: socket.dev

Oprócz tego malware szukało konkretnych ścieżek w systemie plików:

Rys. 6 – skanowanie plików, źródło: socket.dev

Przechwytywane były także zrzuty ekranu:

Rys. 7 – zrzuty ekranu na wielu monitorach, źródło: socket.dev

Jeden ze zidentyfikowanych pakietów – node-tailwind – w chwili pisania artykułu wciąż jest dostępny w npm, ale został już zgłoszony do zespołu bezpieczeństwa. Skaner Socket wykrył w nim malware i nowe konto, które zaczęło wydawać kolejne wersje paczki. Badacze znaleźli łącznie 15 paczek, które w chwili ich publikacji były wciąż dostępne.

Rys. 8 – wyniki skanowania paczki, źródło: socket.dev

Główny moduł pakietu (index.js) zawiera loader, który łączy się z tetrismic[.]vercel[.]app, a następnie wykonuje (eval) kod zwrócony przez serwer:

Rys. 9 – skrypt postinstall paczki, źródło: npmjs.com

Badacze przeanalizowali repozytoria na koncie użytkownika stardev0914 – wiele z nich było po prostu szablonami i stronami demo, które udawały “zadania rekrutacyjne”. Atakujący podszywając się pod rekrutera mógł kierować ofiary do tych repozytoriów prosząc – w ramach zadania rekrutacyjnego – o wprowadzenie w nich zmian. Uruchomienie projektu na komputerze użytkownika skutkowało instalacją złośliwej paczki, a ta uruchamiała malware.

Mimo że konto stardev0914 zostało usunięte, omawiane techniki z pewnością będą jeszcze wykorzystywane. Nie jest to też pierwsza tego typu kampania, bo o bardzo podobnym malware pisaliśmy już w czerwcu, a także pod koniec 2024 r. – złośliwy kod był dostarczany jako projekt programistyczny na potrzeby rekrutacji/zlecenia.

Każde wykonanie komendy npm install w zaimportowanym projekcie powoduje – zależnie od konfiguracji projektu – pobranie dodatkowych (w tym potencjalnie złośliwych) paczek zdefiniowanych przez autora lub niejawne wykonanie dodatkowych skryptów. Omawiana kampania jest kolejnym przykładem na to, jak bardzo może być to niebezpieczne – nawet w ramach pozornie wiarygodnego zadania rekrutacyjnego.

Najważniejszą ochroną jest odizolowanie tego typu projektów – np. za pomocą wirtualnej maszyny lub dedykowanych osobnych środowisk. O ile w tym przypadku szybkie przejrzenie kodu paczki pozwoliłoby zidentyfikować złośliwy skrypt, o tyle taki kod może być sprytnie ukryty. Najlepszą strategią pozostaje więc izolacja, a weryfikowanie instalowanych zależności stanowi dobre uzupełnienie.

Źródło: socket.dev

~Tymoteusz Jóźwiak

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



Komentarze

  1. Odpowiedz

Odpowiedz