Atak typu „sam na sobie” npm Dependency Confusion

Atak typu „sam na sobie” npm Dependency Confusion

TL; DR

W okresie od 1 do 6 maja 2026 r. jeden wydawca npm, alone5511, wprowadzono osiem pakietów o zerowej zależności, które wydają się być przeznaczone Microsoft / Wewnętrzne przestrzenie nazw pakietów w stylu platformy Azure.

Pakiety używały nazw takich jak cosmos-explorer, ms.analytics-web, icons.generated, latency-tracking-internal, carbonite-internal, carboniteapp. Kilka wersji używało wysokich wartości semver, takich jak 99.9.0 oraz 99.9.13, co jest powszechną taktyką polegającą na wprowadzaniu w błąd co do zależności, mającą na celu przewyższenie rangi prywatnych pakietów wewnętrznych.

Wydawca wycofał publikację wszystkich ośmiu pakietów siostrzanych z npm między 1 a 6 maja 2026 r. Bezpośrednie metadane rejestru potwierdziły, że pliki tarball zwracają teraz błąd HTTP 404 z CDN npm.

Jednakże klaster nadal ma znaczenie.

Ładunek w próbkach kanonicznych, carbonite-internal:99.9.0 oraz carboniteapp:99.9.0, uruchamia się w czasie instalacji za pomocą preinstall hak. Zbiera dane odcisku palca hosta, pobiera publiczny adres IP maszyny z api.ipify.org, tworzy fałszywy „RAPORT WYWIADOWCZY POZIOMU ​​PRO”, oznacza gospodarza jako RCE VERIFIEDi wysyła raport do bota Telegramu poprzez API Telegram Bot.

Wczesne ostrzeganie przed złośliwym oprogramowaniem (MEW) firmy Xygeni System sklasyfikował próbki kanoniczne jako prawdopodobnie złośliwe, przyznając im wynik powyżej 91/100.

Śledzimy to jako wewnętrzną kampanię firmy Microsoft powodującą zamieszanie związane z zależnościami nazw, z odciskiem palca hosta w czasie instalacji i eksfiltracją sygnału Telegram.

Klaster: osiem pakietów, jeden wydawca

Konto wydawcy alone5511 użył adresu e-mail:

				
					raistargaming703@gmail.com
				
			

Konto nie miało zweryfikowanego adresu e-mail, nie SCM weryfikacja i wynik reputacji npm wynoszący 2.

Referencyjna tożsamość GitHub, alonebeast002/beastcrypt, pojawił się również w kontekście klastra.

Wydawca udostępnił osiem powiązanych pakietów w ciągu sześciu dni. Wszystkie pakiety nie miały żadnych zależności i opierały się na tym samym ogólnym schemacie: mały pakiet, skrypt instalacyjny, odcisk palca hosta i sygnalizacja Telegram.

#PakietWersja złośliwaUtworzono, UTCNiepublikowane, UTCPotwierdzono ładunekZainstaluj hak
1badacz kosmosu1.1.32026-05-01T18:26Z2026-05-01T19:01ZWywnioskowano, ten sam wydawca / klasterpreinstalować, przypuszczalnie
2sygnałydk-web1.0.0, 10.0.02026-05-04T13:57Z2026-05-04T18:51ZWnioskowanepreinstalować, przypuszczalnie
3ms.analytics-web99.0.0, 99.9.132026-05-04T18:47Z2026-05-05T10:07ZWnioskowanepreinstalować, przypuszczalnie
4ikony.wygenerowane99.9.132026-05-05T10:02Z2026-05-05T12:57ZWnioskowanepreinstalować, przypuszczalnie
5śledzenie opóźnień99.9.02026-05-05T11:57Z2026-05-05T12:57ZWnioskowanepreinstalować, przypuszczalnie
6śledzenie opóźnień wewnętrznychWersje usunięte z rejestru2026-05-06T06:02Z2026-05-06T08:35ZWnioskowanepreinstalować, przypuszczalnie
7carboniteapp99.9.02026-05-06T05:49Z2026-05-06T08:35ZTak, pełny przepływ kodu skanerapreinstalacja: węzeł index.js
8karbonit-wewnętrzny99.9.02026-05-06T06:14Z2026-05-06T08:36ZTak, pełny przepływ kodu skanerapreinstalacja: węzeł index.js

Łączna liczba złośliwych krotek wersji w klastrze: 9+.

W przypadku niektórych rekordów pakietów pokrewnych wersje zostały usunięte po wycofaniu publikacji, co ogranicza możliwość dokładnej rekonstrukcji wyłącznie na podstawie danych z rejestru publicznego.

Dlaczego imiona mają znaczenie

Nazwy pakietów są najsilniejszym sygnałem.

Wyglądają jak wewnętrzne pakiety SDK, telemetrii, generowania ikon, eksploratora lub śledzenia opóźnień:

				
					cosmos-explorer
signalsdk-web
ms.analytics-web
icons.generated
latency-tracking
latency-tracking-internal
carbonite-internal
carboniteapp
				
			

To nie jest losowe nazewnictwo. Wygląda na skalibrowane. pomieszanie zależności.

Kilka późniejszych pakietów używało wysokich numerów wersji:

				
					99.0.0
99.9.0
99.9.13
10.0.0
				
			

Ma to znaczenie, ponieważ ataki typu dependency-confusion często opierają się na pakietach publicznych o wyższych wersjach niż pakiety z wewnętrznego rejestru prywatnego. Jeśli system kompilacji jest błędnie skonfigurowany, menedżer pakietów może wybrać publiczną wersję npm zamiast docelowej wersji wewnętrznej.

Wydaje się również, że wydawca z czasem eskaluje swoją działalność.

Wczesne pakiety korzystały z wersji wyglądających normalnie, takich jak 1.1.3 oraz 1.0.0. Późniejsze paczki przeniosły się do 99.x.x oraz 99.9.xTa zmiana jest zgodna z dostrajaniem kampanii przez aktora pod kątem wewnętrznego zachowania rozwiązywania pakietów.

Co dzieje się podczas instalacji

Próbki kanoniczne, carbonite-internal:99.9.0 oraz carboniteapp:99.9.0, zadeklarować preinstall hak:

 
				
					{
  "scripts": {
    "preinstall": "node index.js"
  }
}
				
			

Oznacza to, że ładunek zostanie uruchomiony zanim npm zakończy instalowanie zależności.

To najwcześniejszy możliwy punkt zaczepienia w czasie instalacji. Deweloper nie musi importować pakietu. Kompilacja nie musi wykonywać kodu aplikacji. Sama instalacja wystarczy.

Ładunek jest niewielki, ma rozmiar około 2.4 KB i nie pełni żadnej funkcji poza nawigacją.

Zachowanie ładunku

index.js Plik wykonuje cztery główne akcje.

Po pierwsze, to wzywa api.ipify.org aby pobrać publiczny adres IP hosta:

				
					https://api.ipify.org
				
			

Po drugie, zbiera podstawowe dane odcisku palca hosta, korzystając z interfejsów API systemu operacyjnego Node.js:

				
					os.userInfo()
os.hostname()
os.platform()
os.networkInterfaces()
os.uptime()
				
			

Po trzecie, formatuje zebrane dane do raportu wielowierszowego z dosłownym banerem:

				
					PRO-LEVEL INTELLIGENCE REPORT
				
			

Raport kończy się słowami:

				
					Status: 🟢 RCE VERIFIED
				
			

Po czwarte, wysyła raport do Telegramu za pośrednictwem sendTelegram(report) funkcja, korzystając z punktu końcowego Telegram Bot API:

				
					https://api.telegram.org/bot<token>/sendMessage
				
			

Dokładny token bota Telegram jest przechowywany w nieopublikowanych plikach tarball i można go odzyskać z wewnętrznej pamięci npm.

Dlaczego baner „RCE Verified” jest ważny

Dosłownie RCE VERIFIED znacznik jest znaczący pod względem operacyjnym.

Ładunek nie uruchamia backdoora. Nie jest utrwalany. Nie kradnie bezpośrednio danych uwierzytelniających do chmury. Zamiast tego potwierdza, że ​​wykonanie kodu nastąpiło podczas instalacji pakietu.

To wystarczy do przeprowadzenia kampanii dowodu wykonania polegającej na pomyleniu zależności.

Jeśli atakujący otrzyma wiadomość w usłudze Telegram ze środowiska docelowego, będzie wiedział, że publiczny pakiet npm został rozwiązany i wykonany w prawdziwym hoście, programie uruchamiającym CI, stacji roboczej programisty lub środowisku kompilacji.

Innymi słowy, złośliwe oprogramowanie nie tylko gromadzi metadane hosta. Sprawdza również, czy rozwiązanie pakietu docelowego nadaje się do wykorzystania.

Klasyfikacja MEW Xygeni

Xygeni MEW sklasyfikował próbki kanoniczne jako prawdopodobnie złośliwy, z wynikiem powyżej 91/100.

Wykrycia obejmowały:

DotkliwośćWykrywanieZnaczenie
Krytycznyeksfiltracja_danych_wrażliwychreq.write(data) przenosi raport odcisku palca hosta do wychodzącego komunikatu POST w Telegramie
Wysoki złośliwe_skrypty_instalacyjnepreinstall: node index.js uruchamia sygnalizator w momencie instalacji
Niski podejrzane_żądanieOdkrywanie publicznego adresu IP za pomocą api.ipify.org
Niski podejrzane_żądanieTelegram Bot API – punkt końcowy wychodzący
Niski pakiet_trywialnyPakiet nie ma żadnego sensownego celu poza sygnalizowaniem
Informacjewyliczenie_danych_wrażliwychPodano szczegóły dotyczące hosta, takie jak czas sprawności, informacje o użytkowniku i nazwa hosta

Obie carbonite-internal:99.9.0 oraz carboniteapp:99.9.0 miały identyczne ładunki, w tym ten sam identyfikator przepływu kodu i skrypty instalacyjne o równoważnym bajcie.

Indeks projektów wydawców MEW oznaczył wszystkie osiem pakietów jako część tego samego klastra wydawców/ładunków.

Dlaczego wzorzec samodzielnego wycofania publikacji ma znaczenie

Wszystkie osiem pakietów siostrzanych zostało wycofanych z publikacji przez wydawcę w ciągu kilku minut lub godzin od publikacji.

To zachowanie jest ważne.

Prawowici administratorzy czasami wycofują publikację pakietów, ale moment ten wygląda na próbę usunięcia danych przez atakującego. Pakiety pojawiały się, wykonywały swój ładunek w czasie instalacji, jeśli zostały rozwiązane przez cel, a następnie znikały z dostępu do rejestru publicznego.

To stwarza dwa problemy dla obrońców.

Po pierwsze, publiczne metadane npm stają się niekompletne po wycofaniu publikacji. Niektóre rekordy wersji mogą zostać usunięte lub trudniej je odtworzyć.

Po drugie, osoby broniące się, opierające się na aktualnym stanie rejestru, mogą przeoczyć pakiety, które były obecne w okresie narażenia, ale nie można ich już zainstalować.

Z tego powodu npm powinien zachować nieopublikowane pliki tarball wewnętrznie w celach dochodzeniowych. Bot Telegramu token znajdujący się w plikach tarball może pomóc w ustaleniu kanału odbiorczego i rekonstrukcji potencjalnych ofiar.

Wskaźniki naruszenia i wykrycia

Wydawca i konto

PoleWartość:
nazwa użytkownika npmalone5511
adres e-mail wydawcy npmraistargaming703@gmail.com
reputacja npm2
Zweryfikowano adres e-mailNie
SCM zweryfikowanaNie
Referencyjna tożsamość GitHubalonebeast002/beastcrypt

Nazwy pakietów, których to dotyczy

				
					cosmos-explorer
signalsdk-web
ms.analytics-web
icons.generated
latency-tracking
latency-tracking-internal
carbonite-internal
carboniteapp
				
			

Podejrzane wzorce wersji

				
					10.0.0
99.0.0
99.9.0
99.9.13
				
			

Te wyższe wersje są szczególnie istotne w przypadku dochodzeń w sprawie pomyłek zależności, ponieważ mogą mieć wyższą rangę niż prywatne wersje pakietów.

Punkty końcowe sieci

TypWartość:
Badanie publicznego adresu IPhttps://api.ipify.org
Zlew eksfiltracyjnyhttps://api.telegram.org/bot<token>/sendMessage
Metoda eksfiltracjiTelegram Bot API POST

Markery ładunku

Wyszukaj skrypty instalacyjne pod kątem następujących ciągów:

				
					PRO-LEVEL INTELLIGENCE REPORT
Status: 🟢 RCE VERIFIED
sendTelegram(
				
			

Należy również oznaczyć ten wzorzec manifestu:

				
					{
  "scripts": {
    "preinstall": "node index.js"
  }
}
				
			

Szczególnie w połączeniu z:

  • Zero zależności
  • Mały rozmiar opakowania
  • Nazwa pakietu wyglądająca wewnętrznie
  • Wysoka wersja semver
  • Interfejsy API do odcisków palców hosta
  • Ruch w interfejsie API bota Telegramu

Interfejsy API do odcisków palców hosta

Kanoniczny ładunek wykorzystuje:

				
					os.userInfo()
os.hostname()
os.platform()
os.networkInterfaces()
os.uptime()
				
			

Dociera również do:

				
					https://api.ipify.org
				
			

aby przechwycić publiczny adres IP hosta.

Notatki dotyczące wykrywania

Istnieje kilka zasad, które mogą obejmować tę kampanię i jej warianty.

Najpierw monitoruj skrypty instalacyjne npm, które kontaktują się z Telegramem:

				
					api.telegram.org
				
			

Skrypt instalacyjny pakietu prawie nigdy nie powinien wysyłać wiadomości POST do Telegrama. Należy to traktować jako wrogie, chyba że istnieje bardzo wyraźny i sprawdzony wyjątek.

Po drugie, flaga preinstall skrypty w małych pakietach o zerowej zależności i nazwach wyglądających na wewnętrzne.

Połączenie małego pakietu, wysokiej wersji semver i wewnętrznej nazwy w stylu przestrzeni nazw jest silnym sygnałem pomieszania zależności.

Po trzecie, zwracaj uwagę na nazwy pakietów, które wyglądają jak prywatne moduły inżynieryjne opublikowane przez publiczne konta npm o niskiej reputacji.

Przykłady z tego klastra obejmują:

				
					ms.analytics-web
latency-tracking-internal
carbonite-internal
icons.generated
				
			

Po czwarte, poszukaj odniesień do plików blokujących dla ośmiu nazw pakietów w systemach CI i stacjach roboczych programistów.

Szukanie:

				
					package-lock.json
yarn.lock
pnpm-lock.yaml
npm-shrinkwrap.json
				
			

Każde dopasowanie powinno skutkować przeglądem zależności.

Sugerowane działania rejestru

Ten klaster został już wycofany z publikacji w momencie raportowania. Jednak wycofanie publikacji nie eliminuje ryzyka.

Zalecane działania po stronie npm:

  • Sprawdź, czy cofnięcie publikacji było działaniem inicjowanym przez atakującego, czy też normalnym działaniem administratora.
  • Zawieś lub zablokuj konto wydawcy alone5511.
  • Dodaj wydawcę, adres e-mail, nazwy pakietów i znaczniki ładunku do list blokowanych w celu wykrywania nadużyć i łańcucha dostaw.
  • Zachowaj nieopublikowane pliki tarball w pamięci wewnętrznej na potrzeby analiz kryminalistycznych.
  • Wyodrębnij token bota Telegramu z zachowanych plików tarball.
  • W miarę możliwości współpracuj z Telegramem, aby zidentyfikować kanał odbiorczy i odtworzyć dane telemetryczne potencjalnej ofiary.

Lista kontrolna reakcji na kompromisy

Jeśli którykolwiek z pakietów, których dotyczył problem, pojawił się w plikach blokady, dziennikach kompilacji, pamięci podręcznej pakietów lub historii instalacji CI w okresie narażenia, należy to potraktować jako zdarzenie wykonania powodujące zamieszanie związane z zależnościami.

Zalecana odpowiedź:

  • Określ miejsce zainstalowania pakietu: na lokalnej stacji roboczej, na programie uruchamiającym CI, na agencie kompilacji lub na obrazie kontenera.
  • Zachowaj pliki blokad, pamięć podręczną npm, dzienniki kompilacji, historię powłoki i dane wyjściowe menedżera pakietów.
  • Sprawdź dzienniki sieci wychodzącej api.telegram.org oraz api.ipify.org podczas okna instalacji.
  • Sprawdź, czy instalacja została przeprowadzona w środowisku z poufnymi zmiennymi, poświadczeniami lub wewnętrznym dostępem do sieci.
  • Rotacja tokenów udostępnionych środowisku instalacyjnemu, jeśli hostem był uprzywilejowany użytkownik modułu CI lub stacja robocza programisty.
  • Konfiguracja rozwiązania pakietu audytu w przypadku pomyłki w rejestrze publicznym/prywatnym.
  • Wymuś zakresowe pakiety prywatne i przypinanie rejestru.
  • Blokuj niezatwierdzone pakiety publiczne, które pasują do wewnętrznych wzorców nazewnictwa.
  • Dodaj guardrails do skryptów instalacyjnych, szczególnie preinstall, install, postinstall.

Co obrońcy powinni wynieść

Ta kampania nie jest skomplikowana technicznie. Właśnie dlatego jest taka ważna.

Ładunek jest niewielki, bezpośredni i łatwy do uruchomienia. Atakujący nie potrzebuje uporczywości ani zaawansowanego złośliwego oprogramowania. Wystarczy mu jedna błędnie skonfigurowana ścieżka do rozwiązania pakietu.

Prawdziwym ryzykiem jest pomyłka co do zależności.

Pakiet o znanej wewnętrznej nazwie, wysokim numerze wersji i preinstall hak może obrócić się normalnie npm install do sygnału radiowego z wnętrza Twojego otoczenia.

Dla litu szacuje się DevSecOps Zespoły, lekcja jest jasna: wewnętrzne nazwy pakietów to wrażliwe zasoby. Traktuj je jak powierzchnię ataku.

Zgłoszono do npm w celu egzekwowania na poziomie konta, umieszczenia na czarnej liście i zachowania nieopublikowanego pliku tarball.

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