DeviceDoor npm-paket som levereras med ett Microsoft 365 Device-Code Phishing Framework

DeviceDoor: ett offentligt npm-paket som levererar ett Microsoft 365-ramverk för enhetskod för nätfiske och massutskick

TL; DR

nolimit-agent är ett npm-paket vars publicerade versioner — 1.0.299 genom 1.0.307, släppta under fyra dagar från 2026-06-26 till 2026-06-29 — var och en har en komplett ramverk för nätfiske och massutskick inuti en dold, helt obfuskerad katalog. I varje version löses huvudposten upp till .ad/x0.js, en av ~86 filer i en mapp med namnet dotfile som innehåller ungefär 4 200 javascript-obfuscator strängarray-blobs; installationskroken och postlayouten är identiska över hela raden.

Bakom förvirringen sitter en Microsoft 365 OAuth-enhetskodflöde (login[.]microsoftonline[.]com/common/oauth2/v2.0/devicecode) som, när en kod har godkänts, läser offrets inkorg i Outlook och skickade objekt via Microsoft Graph API; en motor för massutskick av SMTP och SMS som drivs av operatörslevererade mottagarlistor; meddelandemallar för varumärkesimitation; konstruktion av öppna omdirigeringslänkar; och rekognoscering via DNS-över-HTTPS, WHOIS och GitHub-kodsökning. Körtidstrafikbeacons till operatörsinfrastruktur på api[.]nolimitent[.]xyz:4100.

Påverkade: alla som installerar någon version av paketet, och alla Microsoft 365-postlåda vars ägare godkänner en enhetskod som presenteras genom den. Den senaste versionen, 1.0.307, är den senaste taggen och har samma enhetskodsmöjlighet för brevlådor — den skadliga koden är inte begränsad till en bakåtversion.

Stränghet: kritiskPåverkat ekosystem: npmDen indikator man ska söka efter först: värden api[.]nolimitent[.]xyz.

Attacken: hur den fungerar

Ett godartat skal över en dold nyttolast

Förpackningen har en vanlig yta. package.json förklarar a efterinstallation krok – 

text postinstall: node scripts/postinstall.js 

— och vid inspektion scripts/postinstall.js är ofarligt: ​​den installerar en Windows-kommandoshim och avslutas. Hooken är inte där beteendet finns. huvudsakliga och bin fälten pekar båda in i .annons/, en katalog vars inledande punkt håller den borta från vardagsmiljö ls utdata, och vars innehåll är enhetligt maskinförvrängt. Den statiska skannern räknade ~4 293 kodade nyttolastspann över .annons/ moduluppsättning; javascript-obfuscator är ett deklarerat utvecklingsberoende, vilket matchar sträng-array-rotationsformen för de bundlade filerna.

Delningen är den första signalen värd att namnge: installationskroken som en granskare skulle granska är ren, medan den operativa koden ligger en katalog bort, dold och obfuskerad, och nås endast när paketets exporterade startpunkt körs.

Åtkomst till Microsoft 365-postlådor med enhetskod

Modulen .ad/x12.js innehåller ramverkets mest betydelsefulla kapacitet. Den driver enhetsautentiseringstillståndet för Microsoft 365 OAuth 2.0:

text POST login[.]microsoftonline[.]com/common/oauth2/v2.0/devicecode 

Enhetskodbeviljandet är ett legitimt Microsoft-flöde utformat för inmatningsbegränsade enheter: en tjänst begär en kod, användaren skriver in den koden i microsoft.com/devicelogin` på en andra enhet och godkänner, och den begärande tjänsten tar emot tokens. När den begärande tjänsten tillhör någon annan än postlådans ägare, ger godkännandet den tredje parten en token. När en token har erhållits, .ad/x12.js` läser postlådan direkt via Microsoft Graph:

text GET graph[.]microsoft[.]com/v1.0/me/mailFolders/inbox/messages?$top=250&$select=from GET graph[.]microsoft[.]com/v1.0/me/mailFolders/sentitems/messages?$top=250&$select=toRecipients 

Ocuco-landskapet $select Projektioner hämtar avsändaradresser från inkorgen och mottagaradresser från skickade objekt – råmaterialet för att kartlägga ett offers korrespondenter. Detta är "adversary-in-the-middle"-åtkomst (AiTM) genom samtycke snarare än genom lösenordsinsamling: det finns ingen inloggningsuppgift för nätfiske i klassisk bemärkelse, bara en kod för att bli godkänd.

En motor för massutskick och SMS med mallar för personifiering

Runt brevlådeåtkomsten sitter en utskickare. Paketet skickar operatörsredigerbara datafiler — avsändarlistor (avsändare.txt, smtps.txt) och en mallfil (funktioner.txt) — vars platshållaradresser läses som ett utkastningsformulär för personifiering: security@apple.com, login-verifiering, OAuth-tjänst, fakturering och avsändare av kontomeddelanden mot en yourdomain.com Vikariatet som operatören ersätter. SMS-sidan har en telefonebook och gatewaykonfiguration. Utskickaren itererar operatörslevererade mottagarlistor och skickar via konfigurerade SMTP-reläer.

För att få länkar att landa, .ad/xu.js och .ad/xq.js skapa URL:er som utnyttjar tvetydighet i URL-parsning och klickspårning. Förfalskningsmönstren bäddar in en auktoritet som ser betrodd ut före en @ så det synliga prefixet skiljer sig från den verkliga värden:

text https://trusted[.]com@      https://trusted[.]com%40      https://trusted[.]com:80@ https://redirect[.]example[.]com/      https://track[.]example[.]com/click? 

Ramverket hämtar även favikoner från stora konsumenter och enterprise e-postleverantörer — en rutinmässig teknik för att rendera en övertygande leverantörsmärkt prompt eller landningssida.

Mål- och infrastrukturspaning

Flera moduler samlar in kontext innan de skickas. .ad/x0.js löser namn över DNS-över-HTTPS (dns[.]google/lös), .ad/xa.js frågor om WHOIS (api[.]whois[.]vu), Och .ad/x9.js kör GitHub-kodsökning (api[.]github[.]com/search/code?q=) — ett mönster som överensstämmer med att upptäcka exponerad e-postserverkonfiguration och SMTP-inloggningsuppgifter för att mata relälistan. .ad/xs.js frågar Wayback Machines CDX-index.

Kommando och kontroll

Över den fördunklade uppsättningen, .ad/x4.js refererar till operatorns slutpunkt:

text http://api[.]nolimitent[.]xyz:4100 

Värden delar med sig av sin obegränsad varumärke med förlagets eget namn, och : 4100 port är ramverkets call-home-kanal. Detta är den enskilt mest hållbara indikatorn för försvarare: ett paket, en utvecklararbetsstation eller en byggagent som når api[.]olimited[.]xyz har kört den här koden.

Indikatorer för kompromiss

Indikatorerna nedan är de som en försvarare kan agera på – grep en låsfil, blockera en värd eller söka i proxy- och DNS-loggar. Microsofts slutpunkter visas eftersom ramverket missbrukar dem; de är inte i sig skadliga och bör inte blockeras.

Indikator Typ Var Försvararens agerande
nolimit-agent (alla versioner 1.0.299–1.0.307) Paket npm Grep låsfiler / installationsloggar
api[.]nolimitent[.]xyz (:4100) C2-värd .ad/x4.js Blockera; sök i DNS- och proxyloggar
.ad/ dold mapp som huvud-/bin-mål Structure package.json Statisk signal i registergranskning
trusted[.]com@ / %40 / :80@ länkformulär URL-förfalskning .ad/xu.js, .ad/xq.js Inspektion av e-post-/proxy-URL
Enhetskodstilldelning + Graf inbox/sentitems läsa Beteende .ad/x12.js M365-inloggning + granskning av Graph-revision

Filhash som samlats in vid prioritering:

  • paket/.ad/x0.js — sha256 e4153bb614ee03ec456e6b5b41926385db6aae0e4f3e771d18e581571ad7ca2a

  • paket/paket.json — sha256 8618064f1f6146b4a8f0459aff9154dca1847e3936aa44f4d4cd37e127075644

En Microsoft 365-klientsignal värd att leta efter oberoende av detta paket: lyckade enhetskodsinloggningar följt omedelbart av grafläsningar av e-postMappar/inkorg och e-postMappar/skickade artiklar, särskilt från en session som användaren inte känner igen.

Attribuering och observerat beteende

Det som är observerbart förblir separerat från vem som står bakom det.

Observerbara fakta: paketet publiceras under användarnamnet nolimit-agent med en overifierad Gmail-adress och ingen länkad källkodsförvaring; dess package.json beskriver den som en "avancerad e-postavsändare" och taggar den med röda laget nyckelord; körtidskoden är koncentrerad i ett dolt, obfuskerat .annons/ katalog vars verktygskedja (javascript-obfuscator) är ett deklarerat beroende; och call-home-värden api[.]olimited[.]xyz återanvänder obegränsad varumärke. Detta är ett enda paket med ett operatörsstyrt infrastrukturlandmärke – inte ett kluster med flera paket, och ingen överlappning med en tidigare namngiven kampanj identifierades.

Ocuco-landskapet röda laget Nyckelordet ändrar inte klassificeringen. Legitima verktyg för offensiv säkerhet som levererar dubbelanvändningskapacitet gör det transparent: läsbar källkod, operatörslevererade mål och ingen dold anropsplats. Detta paket inverterar var och en av dessa egenskaper – dess operativa kod är obfuskerad och dold, och den pekar ut signaler till fast operatörsinfrastruktur snarare än ett mål som användaren tillhandahåller. Beteendet, inte etiketten, styr domen, som är skadlig.

Avsikten anges inte här. Inlägget beskriver vad koden gör – begär en enhetskod, läser en brevlåda via Graph, skickar massutskick via konfigurerade reläer, beaconar till en fast värd – och lämnar motivet ospecificerat.

Påverkan, trender och vägledning för försvarare

Två effekter vid installationstid spelar roll. För det första, alla utvecklare eller CI-agenter som installerar nolimit-agent tar ramverket till den värden och etablerar call-homet till api[.]olimited[.]xyzFör det andra sträcker sig enhetskodsfunktionen bortom den installerande värden: en Microsoft 365-postlåda vars ägare uppmanas att godkänna en presenterad kod läses direkt via Graph, utan att något lösenord någonsin passerar ledningen.

Den bredare trenden är att internalisera. Nätfiske med enhetskod (AiTM) har gått från en fristående nätfiskeinfrastruktur till ett paket i ett offentligt register – distribution av npm installera snarare än via en e-postlänk. Att paketera kitet på det här sättet byter nätfiskeoperatörens problem med webbhotell och länkleverans mot ett registers räckhåll, och döljer den operativa koden bakom en ren installationshook och en obfuskerad katalog med namnet dotfile som omintetgör en snabb manuell skimning.

För försvarare:

  • Register- och beroendegranskning. Behandla ett paket vars huvudsakliga/bin löses upp i en dold (punktprefixerad) katalog med enhetligt obfuskerad förstapartskod som högrisk enbart baserat på strukturen, oberoende av om installationskroken ser ren ut. Minifiering är inte obfuskation — grind på sträng-array-avkodarens signatur, inte på radlängden.
  • Microsoft 365-härdning. Begränsa auktoriseringsflödet för enhetskod med villkorlig åtkomst där det inte är operativt nödvändigt; enhetskodstilldelningar är en känd AiTM-vektor och behövs sällan av interaktiva användare. Granska för inloggningar med enhetskod följt av omedelbar uppräkning av Graph-postlådor.
  • Nätverksdetektering. Blockera och varna på api[.]olimited[.]xyzSök efter utgående DNS- och proxyloggar för den över hela utvecklar- och bygginfrastrukturen.
  • Detektering av e-postsökväg. Ocuco-landskapet användare@värd URL-förfalskningsformulär (betrodd[.]com@…) är detekterbara vid e-postgatewayen och proxyservern; flagga länkar vars auktoritetskomponent föregår en @.

Paketet var live på npm vid tidpunkten för analysen. Eftersom det dolda ramverket sträcker sig över hela den publicerade versionslinjen och den aktuella senaste taggen (1.0.307) har enhetskodsfunktionalitet, bör borttagning av registret omfatta alla versioner, inte bara en enskild bakåtversion. 

sca-tools-programvara-verktyg-för-kompositionsanalys
Prioritera, åtgärda och säkra dina programvarurisker
Skaffa ditt gratiskonto.
Inga kreditkort krävs.

Säkra din programvaruutveckling och leverans

med Xygeni-produktsviten