Black Week z sekurakiem! Tniemy ceny nawet o 80%!

Złośliwa kampania zaśmiecania npm – ponad 43 tysiące pakietów IndonesianFoods

24 listopada 2025, 02:35 | Aktualności | 0 komentarzy

Na początku listopada Paul McCarty odkrył złośliwą kampanię w menadżerze pakietów npm. Składa się ona z ponad 43 tysięcy pakietów publikowanych przez co najmniej 11 kont. Były one systematycznie tworzone przez dłuższy czas, a niektóre z nich przetrwały w ekosystemie przez prawie dwa lata. Według ustaleń badaczy, pakiety nie wykradają bezpośrednio danych, a służą do “zaśmiecania” repozytorium npm i generowania sztucznej aktywności w TEA (systemie do wynagradzania za wkład w projekty open-source).

TLDR:

  • Paul McCarty odkrył kampanię IndonesianFoods w npm: ponad 43 tysiące pakietów publikowanych przez 11+ kont.
  • Pakiety nie zawierały aktywnego malware – zaśmiecały repozytorium i generowały sztuczną aktywność w TEA, protokole nagradzającym tokenami aktywność w OSS.
  • Nazwy pakietów tworzono z indonezyjskich imion i słów związanych z jedzeniem, używano także unique-names-generator.
  • Skrypt automatyzował masową publikację paczek i tworzenie wzajemnych zależności, tworząc łańcuch pakietów.
  • Choć nie jest to typowy malware, IndonesianFoods pokazuje jak ważne jest kontrolowanie instalowanych paczek.

IndonesianFoods, bo taką nazwę nadano kampanii, pochodzi od charakterystycznego schematu nazywania pakietów. Oznaczenia były budowane z użyciem dwóch słowników: jednego z indonezyjskimi imionami (np. “andi”, “budi”) i drugiego z terminami związanymi z jedzeniem (np. “rendang”, “sate”). 

Do stworzenia nazwy wybierano losowo jedno imię, jedno słowo związane z jedzeniem, dodawano do nich losową liczbę (1-100) i dołączano końcówkę (np. “-kyuki”, “-breki”).

Jedno z kont publikujące pakiety, źródło: sourcecodered.com

Badacze z Endor Labs ustalili, że pakiety odkryte przez McCarty’ego były częścią kampanii opisanej w kwietniu 2024 r., w której atakujący zamierzali wykorzystać protokół TEA służący do wynagradzania wkładu w oprogramowanie open source. Większość szkodliwych pakietów pozostawała jednak w npm, stanowiąc około ponad 1% całego ekosystemu. 

Nie znaleziono w nich złośliwego kodu, ale niektóre z nich były pobierane tysiące razy. Daje to atakującym możliwość wprowadzenia w przyszłości złośliwego kodu, który wpłynąłby na wszystkie instalacje.

Pakiety IndonesianFoods zawierają standardową strukturę projektu Next.js wraz z plikami konfiguracyjnymi, zależnościami (React i Tailwind CSS) oraz dokumentacją. Ten “kamuflaż” jest celowy.

“Złośliwym” komponentem jest skrypt, który w zależności od wariantu nosi nazwę auto.js lub publishScript.js. W przeciwieństwie do typowego malware, skrypt ten nie jest uruchamiany automatycznie podczas instalacji (dlatego “złośliwy” wzięliśmy w cudzysłów). Pozostaje całkowicie nieaktywny, dopóki nie zostanie wywołany ręcznie.

Gdy tak się stanie, uruchamiana jest nieskończona pętla, a w niej trzy czynności:

Najpierw skrypt sprawdza, czy w pliku package.json znajduje się wpis private z wartością true i usuwa go. Ta flaga używana jest przez programistów aby przypadkowo nie opublikować wewnętrznego kodu w publicznych repozytoriach.

Krok 1 – usuwanie flagi private, źródło: endorlabs.com

Następnie generowany jest losowy numer wersji, np. 2.3.1, co ma na celu ominięcie funkcji wykrywania zduplikowanych wersji w npm.

Krok 2 – generowanie wersji, źródło: endorlabs.com

Na koniec skrypt tworzy nową losową nazwę pakietu przy użyciu wewnętrznych słowników, aktualizuje pliki package.json i package-lock.json, a następnie publikuje pakiet w repozytorium npm.

Krok 3 – publikacja paczki, źródło: endorlabs.com

Po 7-sekundowym lub 10-sekundowym opóźnieniu cały cykl się powtarza. Według szacunków badaczy, wykonanie skryptu powoduje publikację około 12 pakietów na minutę.

Badacze ustalili również, że pakiety IndonesianFoods odwołują się do siebie nawzajem jako zależności (każdy pakiet może mieć zdefiniowane dodatkowe wymagane paczki, które są instalowane wraz z nim).

Gdy użytkownik instaluje jeden z nich, npm automatycznie pobiera wszystkie pozostałe (zapisane w pliku package.json) zależności. Jeśli każda paczka zawiera 8-10 dodatkowych pakietów, rozprzestrzenianie się możemy opisać wykładniczo.

Zainstalowanie jednego pakietu może spowodować pobranie ponad stu powiązanych paczek, co utrudnia pozbycie się zależności, ponieważ konieczne jest usunięcie całego łańcucha paczek.

W części pakietów badacze znaleźli pliki tea.yaml, w których wymienione było kilka kont TEA. Zapewne była to próba zarabiania na ataku za pomocą tokenów przeznaczonych do wynagradzania wkładu w oprogramowanie open source.

Plik tea.yaml, źródło: sourcecodered.com

Umieszczając pliki tea.yaml w tysiącach pakietów i przypisanych im zależności, atakujący zawyżali swoje wyniki, tworząc fikcyjny “wkład”. TEA to projekt, który ma wynagradzać twórców za ich udział w rozwoju otwartoźródłowego oprogramowania przez tokeny kryptowalutowe.

Co ciekawe, nie wszystkie paczki są nazywane przez skrypt bazujący na indonezyjskich słowach. Badacze ustalili, że część nazw była generowana przez pakiet unique-names-generator, za pomocą którego powstały nazwy takie jak “able_crocodile”, czy “big_red_donkey”. Oznacza to, że kampania ma w zasadzie dwie wersje.

Choć pakiety IndonesianFoods nie wykonują złośliwego kodu (malware), ich skala, koordynacja i powiązania zależności mogą stwarzać ryzyko pod kątem przyszłych aktualizacji. Bezpieczeństwo w ekosystemie npm to nie tylko kod pakietów, ale też wzorce publikacji i powiązań między paczkami.

Dla programistów oznacza to choćby weryfikację zależności, których wymagają instalowane pakiety – być może dzięki sprawdzeniu package.json nie zostaniemy ofiarą ataku w łańcuchu dostaw, a takie jak wiemy są jednymi z niebezpieczniejszych.

Źródła:

~Tymoteusz Jóźwiak

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



Komentarze

Odpowiedz