Ryzykowny interes: wyjaśnienie samoczynnego usuwania pakietów npm

Ryzykowny interes: Pakiety antynadzorcze, które same się usuwają

TL; DR

Pakiety usuwają się same. W ciągu piętnastu dni w sierpniu jeden operator npm opublikował dziewięć pakietów pod dziewięcioma nazwami z siedmiu kont i osobiście wycofał osiem z nich. Okno czasowe dla każdego z nich skróciło się z trzynastu godzin do siedemnastu minut. Ta technika nie jest jedyną ich techniką: siedem kolejnych pakietów od niezależnych operatorów, niosących zupełnie inne ładunki, zostało wycofanych przez ich własnych wydawców w czasie 37.8 minuty. Artefakt zniknął, zanim uruchomiła się większość procesów obronnych, a instalacja już się odbyła.

Wszystko, co udostępnia rejestr, podlega rotacji; ładunek nie. Wszystkie dziewięć zostało wysłanych w identycznych bajtach bin/ katalog, ten sam skrót SHA-256 dla trzech nazw pakietów i dwóch kont, w odstępie piętnastu dni. Tożsamość zawartości to jedyny sygnał śledzenia, którego ten operator nie złamał, a pojedynczy pakiet, którego nigdy nie wycofał, jest powodem, dla którego w ogóle można go było zbadać.

Osoby instalujące ten system nie są ofiarami, a w każdym razie są bardzo narażone. To narzędzie nie jest przeznaczone dla programistów: uniemożliwia zdalne nadzorowanie egzaminów dzięki ukrytemu przechwytywaniu ekranu, wyodrębnianiu tekstu z ekranu i zwracaniu odpowiedzi do nakładki, więc ktokolwiek biega npm install jest zamierzonym beneficjentem, a nie celem. Uruchamiają również niepodpisany plik binarny, który odszyfrowuje magazyn plików cookie przeglądarki, z konta, które samo się kasuje w ciągu godziny. Nie mogą otrzymać poprawki, nie mogą później sprawdzić, co uruchomili, ani zgłosić szkody bez ujawnienia powodu instalacji.

Ekosystem: npm, ten sam schemat zaobserwowano w PyPI. Okres: Czerwiec–sierpień 2026 r.

Pomiar

Czas przebywania to odstęp czasu między pojawieniem się a zniknięciem pakietu, obliczany na podstawie metadanych rejestru. Są to pomiary, a nie szacunki.

PakietOpublikowano (UTC)Pozostawiony stojący
moidev2026-08-16 16:315h 58m
moidevx2026-08-17 03:2413h 23m
moidevz2026-08-26 03:3812h 56m
moideva2026-08-26 18:581h 33m
amicat2026-08-28 20:4817m
bmcat2026-08-28 21:1747m
eyevox2026-08-28 21:4421m
moidevh2026-08-31 03:2247m

Odczytane w kolejności publikacji, okno skraca się ponad czterdziestokrotnie – z 13 godzin i 23 minut w najszerszym miejscu do 17 minut w najwęższym. Pierwsze cztery pakiety trwają średnio osiem i pół godziny; ostatnie cztery – trzydzieści trzy minuty. 28 sierpnia opublikowano i wycofano trzy pakiety w ciągu jednego 77-minutowego okresu.

Spadek nie jest stopniowy. Koncentruje się on między 26 a 28 sierpnia, a tym, co uległo zmianie, była ocena operatora dotycząca tego, jak długo przesyłka może bezpiecznie stać.

Każda wypłata tutaj jest inicjowana przez wydawcę. Dokument rejestru dla każdej z nich pokazuje pustą listę opiekunów obok czas.nieopublikowany rekord — podpis pod wycofaniem publikacji, a nie usunięciem. Dziewiąty pakiet, niesamowite, nigdy nie zostało wycofane; to jest powód, dla którego można było to wszystko zbadać.

Istnieje drugi system wypłat i nie należy go mylić z tym. W przypadku gdy tylko wersja ładunku zostanie wyciągnięty, a pakiet przetrwa, mediana wynosi około 73 godzin dla 31 pakietów. Te zamienniki przybywają w skryptowanych partiach i pozostawiają pustą skorupę — pakiet.json deklarując główny który nie wysyła żadnego pliku — którego jedyną funkcją jest utrzymanie nazwy. Ten system to porządkowanie według harmonogramu. Ten jest dostrojonym oknem ekspozycji.

Co przetrwa usunięcie

Dziewięć z tych pakietów jest obsługiwanych przez jednego operatora: moidev, moidevx, moidevz, Moideva, moidevh, amicat, bmcat, oko oraz niesamowite. Nazwy nie mają żadnej konwencji — każdy, kto je śledzi, moidev STEM pominąłby ponad połowę z nich — a zostały one opublikowane z siedmiu oddzielnych kont, z których niemal wszystkie zostały zarejestrowane w domenach z jednorazowymi adresami e-mail.

Łączy je jawny wpis, który nie ma powodu istnieć:

"kosz": { "": "bin/kalamasha-tool.js" } }

Zachowaliśmy kopie pięciu z nich przed usunięciem. W sumie, w pięciu, kosz/ katalog jest identyczny bajtowo:

filetSHA-256
bin/kalamasha-tool.js0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
bin/uia_extract.exee2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
bin/chrome_cookies.ps121b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a
bin/stealth_capture.ps1c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c
bin/uia_extract.pyc20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e
bin/uia_get_text.ps14a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c

Dwa kolejne sygnały są zgodne. Trzy pakiety zostały opublikowane o 03:24, 03:38 i 03:22 UTC 17 sierpnia, 26 sierpnia i 31 sierpnia – szesnastominutowe pasmo obejmujące piętnaście dni i trzy oddzielne konta. Dwa z tych kont zostały zarejestrowane na tej samej tymczasowej domenie e-mail, co łączy je niezależnie od kodu.

Konta

Poniżej znajdują się konta wydawców npm, które wysłały ładunek, informacje o każdym pakiecie, który został przesłany, oraz o tym, jak długo pozostawał on w magazynie:

Konto wydawcyPakietDomena e-mailPozostawiony stojący
letol39119moidev:1.0.0hutdot.com (jednorazowe)5h 58m
so1d1a7i27moidevx:1.0.0ogzmail.com (jednorazowe)13h 23m
lololololol435678eyiouss:3.0.21, 3.0.22, 4.0.1ogzmail.com (jednorazowe)nadal publikowane
tagadob568moidevz:1.0.0ebflyai.com (jednorazowe)12h 56m
tayihim489moideva:1.0.0prodbits.com (jednorazowe)1h 33m
sahihai123amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0poczta internetowa dla konsumentów17m / 47m / 21m
heytoshanmoidevh:1.0.0poczta internetowa dla konsumentów47m

so1d1a7i27 oraz lololololol435678 udostępnij ogzmail.com domena rejestracyjna — łącze łączące konto, na którym nadal znajduje się aktywna kopia konta opublikowanego pod moidev łodyga dwa tygodnie wcześniej. sahihai123 opublikował i wycofał trzy oddzielne nazwy pakietów w ciągu jednego 77-minutowego okna 28 sierpnia. Heytoshan zarejestrowany, opublikowany moidevhi wycofał je 47 minut później; pozostaje to jedyną publikacją na tym koncie.

Każde z tych kont nie ma zweryfikowanego adresu e-mail, nie zawiera zweryfikowanego linku do kontroli kodu źródłowego i nie opublikowało żadnego niezwiązanego projektu. Sześć z siedmiu kont nie hostuje już niczego.

Jedna paczka nie została nigdy odebrana. ejiouss:4.0.1 został opublikowany 16 sierpnia i w momencie pisania tego tekstu nadal był możliwy do rozwiązania. Osiem artefaktów było nie do odzyskania; kampania została zrekonstruowana w całości na podstawie tego, który pozostał. Operator, który odruchowo usuwa artefakty, i tak w końcu pozostawi jeden.

Co robi to narzędzie

ejiouss:4.0.1 Opisuje się w serwisie npm jako „wysokowydajne narzędzie DOM i most diagnostyczny dla nowoczesnych aplikacji internetowych”. Jest to narzędzie do przechwytywania ekranu i pobierania odpowiedzi, stworzone do działania w ramach zdalnego nadzoru egzaminów, co zostało potwierdzone własnymi słowami w źródle.

Program uruchamiający kopiuje środowisko wykonawcze Electron pod fałszywą nazwą pliku przed jego uruchomieniem i podaje nazwę elementów, których ma unikać:

// 🛡️ NAZWA BINARU STEALTH: NIE MOŻE kolidować z prawdziwym Testpadem! const STEALTH_NAME = 'SearchApp.exe';

Nagłówek tego samego pliku nazywa się Strażnik duchów antyproctorowych i implementuje pętlę odrodzenia, która cofa się tym bardziej, im szybciej zostanie zabity. W innych miejscach proces sam podnosi swój priorytet. aby zwalczać dławienie procesora, wypycha aplikację egzaminacyjną z pierwszego planu, gdy uzyskuje fokus, i kończy proces podrzędny Bezpiecznej przeglądarki egzaminów zabij zadanie /F /T.

Przechwytywanie działa za pomocą dołączonego skryptu programu PowerShell, wywoływanego z wyłączoną polityką wykonywania i wyłączonym oknem, a tekst na ekranie jest zbierany równolegle za pomocą automatyzacji interfejsu użytkownika systemu Windows. Obrazy i tekst w kolejce są przesyłane do sesji modelu językowego w osadzonej przeglądarce, a odpowiedź jest renderowana w nakładce zawsze na wierzchu. To połączenie jest celowo odkładane, a kod podaje przyczynę: aby uniknąć trwałego narażenia na NETSTAT.

Pakiet wysyłany jest również chrome_cookies.ps1, kierowany WYCIĄGACZ DO CIASTEK CHROME, który odszyfrowuje pliki cookie Chrome i Edge za pomocą DPAPI i odczytuje bazę danych plików cookie z maksymalnie czterech profili przeglądarek. Podano wcześniejcisely: nie znaleźliśmy skryptu wywoływanego przez nazwę z żadnego dostarczonego pliku JavaScript. Obecna i dostępna jest tylko część konsumująca, która wstrzykuje zapisane pliki cookie sesji do osadzonej przeglądarki.

Pozycja osób, które ją instalują

Nikt nie instaluje tego przypadkowo. Nie pełni on żadnej funkcji poza egzaminem monitorowanym, a jego wynikiem jest nakładka z odpowiedziami na ekranie użytkownika. Zwodniczy opis pakietu wcale nie jest skierowany do instalatora — to przykrywka skierowana do rejestru i każdego, kto później będzie kontrolował komputer. Instalator wie, co otrzymuje; opis istnieje, więc… rekord instalacji tego nie odzwierciedla.

Poszkodowanymi stronami są osoby trzecie, które nigdy nie miały styczności z npm: instytucja przeprowadzająca egzamin, pozostali kandydaci i wszyscy, którzy polegają na tym, że certyfikat ma jakieś znaczenie.

Jednak instalator nie jest z tego powodu bezpieczny, i warto o tym wspomnieć, ponieważ to właśnie model znikającego pakietu powoduje narażenie na niebezpieczeństwo.

Używają niepodpisanego pliku binarnego od nikogo. uia_extract.exe Statki skompilowane, bez źródła i bez informacji o pochodzeniu kompilacji, z konta, które już nie istnieje. Ten sam plik, według hasha, został ponownie opublikowany przez letol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123 oraz Heytoshan przez piętnaście dni. Nie ma osoby, której można by zapytać, żadnego repozytorium do odczytania ani historii do sprawdzenia — każda tożsamość, która go wysłała, sama się usunęła.

Nadali mu dokładnie takie możliwości, jakich potrzebuje złośliwe oprogramowanie. Ukryty proces, działający pod fałszywą nazwą, który odszyfrowuje magazyn plików cookie przeglądarki, stale odczytuje zawartość ekranu, zamyka oprogramowanie zabezpieczające i uruchamia się ponownie po jego zamknięciu. Obecnie odszyfrowywanie plików cookie jest ograniczone do domen jednego dostawcy i obsługuje sesję użytkownika. Ten zakres to zmiana jednego wiersza, a żadna zmiana w modelu dostarczania nie ujawniłaby go, gdyby nastąpiła – nowa nazwa, nowe konto, nowe przesłanie.

Nie mogą otrzymać poprawki. Pakiet zostaje wycofany z publikacji w ciągu godziny. Nie ma ścieżki aktualizacji, żadnego komunikatu ani możliwości późniejszego dowiedzenia się, że zainstalowana przez nich wersja różni się od tej zainstalowanej przez znajomego. Cokolwiek jest na komputerze, pozostaje tam.

Nie mogą audytować tego, co uruchomili. Ich plik blokady odwołuje się teraz do pakietu, który nie jest już rozpoznawany. Gdyby później chcieli ustalić, co znajdowało się na ich komputerze – po incydencie lub sporze – rejestr nie miałby dla nich żadnego zapisu.

I nie mogą zgłaszać szkód. Użytkownik zainfekowany tym narzędziem nie może zgłosić nadużycia bez ujawnienia powodu instalacji. To nie przypadek. Zgłoszenia nadużyć w rejestrze to główny kanał wychwytywania krótkotrwałych pakietów, a baza użytkowników tego operatora jest strukturalnie niezdolna do korzystania z niego. Jedynym pozostałym przeciwnikiem jest automatyczne skanowanie — do którego skalibrowano siedemnastominutowe okno.

Struktura ofiar i czas przebywania to ten sam fakt, który został zauważony dwukrotnie. Wyjaśnia to również anomalię w osi czasu: gdyby wycofanie było spowodowane strachem przed skargami, pakiet cieszący się długoletnią popularnością zostałby wycofany jako pierwszy. Tak się nie stało, ponieważ skargi nigdy nie nadeszły.

Ten sam wzór, inny operator

Operator nadzorujący nie jest w tym odosobniony, a najwyraźniejsze równoległe działania dotyczą niezwiązanego ładunku.

W dniach od 24 do 27 sierpnia pojawiły się cztery pakiety npm o nazwach zapożyczonych z narzędzi uwierzytelniania dwuskładnikowego — autoryzacja-OTP, klucz tajny-2fa, secretkey2fa oraz 2fa-klucz tajny — zawierające łącznie szesnaście wersji. Każda została opublikowana z własnego, świeżo zarejestrowanego konta (beayilol, jeanpaul686g, zzzalipay, dluuuuu), wszystkie bez weryfikacji adresu e-mail, żadna z weryfikowanym linkiem do kontroli źródła, żadna nie publikująca niczego innego. Każda została wycofana przez własnego wydawcę.

Ładunek nie ma nic wspólnego z oprogramowaniem egzaminacyjnym. Odczytuje on dane uwierzytelniające przeglądarki i tokeny Discorda, a następnie przechodzi przez drabinkę uwierzytelniania Xbox Live w programie uruchamiającym Minecraft, aby przechwycić token odświeżania. Tutaj instalator is ofiara w powszechnym rozumieniu tego słowa — co sprawia, że ​​porównanie jest przydatne, ponieważ sposób dostarczania treści jest w każdym przypadku identyczny.

Cztery cykle przebiegały w kolejności publikacji po 274.9, 37.8, 37.6 i 35.7 minuty: jedna długa pierwsza próba, a następnie konwergencja na wartość, która się utrzymuje. Trzy kolejne pakiety należą ponownie do innych operatorów i wykazują takie samo zachowanie w zakresie wypłat.

PakietOperatorPozostawiony stojący
octopus-actionradiolatarnia rozpoznawcza2.5 min
mt-ts-serverless-starterradiolatarnia rozpoznawcza9.6 min
2fa-secretkey2FA obejmuje nazwy35.7 min
secretkey2fa2FA obejmuje nazwy37.6 min
secretkey-2fa2FA obejmuje nazwy37.8 min
auth-otp2FA obejmuje nazwy274.9 min
hex-encode-utilsInne724.2 min

Siedem pakietów, mediana 37.8 minut, żaden z nich nie dotyczył oprogramowania egzaminacyjnego.

Trzy niezależne ładunki, trzy niezależne zestawy kont, jedna współdzielona technika.

Dlaczego okno się zamyka

Coś zmieniło się w środowisku rejestru w 2026 r., a oczywistym powodem było przyspieszenie skanowania.

Do niedawna złośliwe pakiety były wykrywane głównie po fakcie: przez użytkownika, który coś zauważył, przez raport z dalszego śledzenia lub przez okresowe skanowanie. Opóźnienie w wykrywaniu mierzono w dniach. To już nie jest jedyny sposób. Analiza nowo opublikowanych pakietów w czasie niemal rzeczywistym — Wczesny system ostrzegania przed złośliwym oprogramowaniem firmy Xygeni wśród rosnącej liczby takich systemów w całej branży — skraca czas między publikacją a kontrolą.

Operator ma dwie możliwości: utrudnić rozpoznanie ładunku lub skrócić czas jego dostępności do wglądu. Druga opcja jest tańsza, nie wymaga żadnych nakładów inżynieryjnych, a rejestr udostępnia ten mechanizm za darmo: w ciągu 72-godzinnego okresu na usunięcie pakietu z publikacji w npm wydawca może jednostronnie usunąć pakiet, a nazwa może zostać później ponownie wykorzystana. Wycofanie pakietu nic nie kosztuje operatora.

Czas pasuje. Oba powyższe operatory zbiegają się do wartości i utrzymują ją, zamiast dryfować, co jest raczej efektem dostrojonego parametru niż kwestią wygody. A parametr, do którego się zbiegli – dziesiątki minut – znajduje się przed…cisgdzie musiałby się znaleźć, aby uniknąć automatycznej kontroli, a jednocześnie pozostawić pakiet do zainstalowania na tyle długo, aby dotarł do odbiorców.

To pozostaje hipotezą. Dane dotyczące czasu nie mogą oddzielić odpowiedzi na skanowanie od odpowiedzi na egzekwowanie rejestru ani od zwykłego dojrzewania operacyjnego, ponieważ operatorzy uczą się od siebie nawzajem. To, co można powiedzieć bez wnioskowania, jest węższe, ale nadal przydatne: okno czasowe jest teraz na tyle krótkie, że kontrola polegająca na sprawdzeniu pakietu po publikacji jest niczym wyścig z czasem ustawionym przez operatora. Kontrole, które nie wymagają kontroli — kwarantanna ze względu na wiek, wyłączone skrypty instalacyjne — nie są dotknięte tą rasą, co jest praktycznym powodem, dla którego warto je preferować.

Co z tym zrobić

Kwarantanna ze względu na wiek. Nic w tabeli czasu przebywania nie przetrwało trzynastu godzin. Zasada, zgodnie z którą żadna wersja zależności nie jest możliwa do zainstalowania, dopóki nie istnieje przez 72 godziny, wykluczyłaby każdą z nich, nie wykrywając niczego.

Wyłącz domyślnie skrypty instalacyjne. –Ignore-scripts Usuwa mechanizm dostarczania, od którego zależą pakiety kradnące dane uwierzytelniające w tym korpusie. Nie pomaga w przypadku narzędzia, które użytkownik uruchamia celowo, co jestcisWarto zrozumieć to rozróżnienie.

Potraktuj zniknięcie jako zdarzenie zagrażające bezpieczeństwu. Ostrzegaj, gdy zainstalowana zależność przestaje być rozwiązywana. Dowody wciąż znajdują się w Twoim pliku blokady, a nie w rejestrze.

Śledź treść, nie nazwy. Sześć powyższych skrótów pasuje niezależnie od nazwy pakietu, konta wydawcy czy ciągu wersji – każde pole, które ten operator wykazał, zostanie zmienione. Reguła po stronie rejestru, zgodnie z którą nowo zarejestrowane konto wycofujące swój jedyny pakiet w ciągu godziny jest raportowanym wzorcem, zostałaby uruchomiona dla każdego pakietu tutaj, tylko w odniesieniu do metadanych.

A jeśli rozważasz instalację czegoś z tej kategorii: Właściwości, które utrudniają rejestrowi wykrycie, to te same właściwości, które pozbawiają Cię możliwości odwołania. Nie ma wydawcy, którego można by obciążyć odpowiedzialnością, ścieżki aktualizacji ani rejestru uruchomień.

wskaźniki

TypWartość:
filetbin/kalamasha-tool.js — nie-standard punkt wejścia do pojemnika
SHA-2560c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd
SHA-256e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865
PrzetwarzanieSearchApp.exe napisane obok legalnego środowiska uruchomieniowego Electron
Zachowaniepowershell -ExecutionPolicy Bypass -File w windowsHide: true
Zachowanietaskkill /F /T ukierunkowanie na proces przeglądarki Safe Exam Browser
MetadanePusta lista opiekunów obok time.unpublished rekord
Kontaletol39119, so1d1a7i27, lolololol435678, tagadob568, tayihim489, sahihai123, heytoshan
Rejestracjaogzmail.com, hutdot.com, ebflyai.com, prodbits.com — domeny poczty jednorazowej

Referencje

sca-tools-oprogramowanie-narzędzia-analizy-kompozycji
Określ priorytety, rozwiąż problemy i zabezpiecz zagrożenia związane z oprogramowaniem
Załóż darmowe konto.
Nie wymagamy karty kredytowej.

Zabezpiecz rozwój i dostarczanie oprogramowania

z pakietem produktów Xygeni