TL, RD
nolimit-agent é un paquete npm cuxas versións publicadas — 1.0.299 ata 1.0.307, publicados durante catro días, dende o 26/06/2026 ata o 29/06/2026, cada un contén un marco completo de phishing e correo masivo dentro dun directorio oculto e totalmente ofuscado. En todas as versións, a entrada principal resólvese en .ad/x0.js, un dos ~86 ficheiros nun cartafol chamado dotfile que contén aproximadamente 4,200 blobs de matrices de cadeas de javascript-obfuscator; o gancho de instalación e o deseño da entrada son idénticos en toda a liña.
Detrás da ofuscación atópase un Fluxo de código de dispositivo OAuth de Microsoft 365 (login[.]microsoftonline[.]com/common/oauth2/v2.0/devicecode) que, unha vez aprobado un código, le a caixa de entrada de Outlook da vítima e os elementos enviados a través da API de Microsoft Graph; un motor de envío masivo de SMTP e SMS impulsado por listas de destinatarios proporcionadas polo operador; modelos de mensaxes de suplantación de marca; construción de ligazóns de redirección aberta; e recoñecemento a través de DNS sobre HTTPS, WHOIS e busca de código GitHub. Balizas de tráfico en tempo de execución para a infraestrutura do operador en api[.]nolimitent[.]xyz:4100.
Afectados: calquera persoa que instale calquera versión do paquete e calquera Caixa de correo de Microsoft 365 cuxo propietario aproba un código de dispositivo presentado a través del. A versión máis recente, 1.0.307, é a etiqueta máis recente actual e ten a mesma capacidade de correo electrónico de código de dispositivo: o código malicioso non está limitado a unha única versión anterior.
Gravedade: críticoEcosistema afectado: npmO único indicador que hai que buscar primeiro: o anfitrión api[.]nolimitent[.]xyz.
O ataque: como funciona
Unha cuncha benigna sobre unha carga útil oculta
O envase presenta unha superficie ordinaria. paquete.json declara unha postinstalación gancho –
text postinstall: node scripts/postinstall.js — e na inspección scripts/postinstalación.js é inofensivo: instala un shim de comandos de Windows e sae. O comportamento non reside no gancho. O Inicio caixa ambos os campos apuntan a .anuncio/, un directorio cuxo punto inicial o mantén fóra do uso casual ls saída e cuxo contido está uniformemente ofuscado pola máquina. O escáner estático contou ~4,293 tramos de carga útil codificada en todo o .anuncio/ conxunto de módulos; javascript-ofuscator é unha dependencia de desenvolvemento declarada, que coincide coa forma de rotación de matrices de cadeas dos ficheiros agrupados.
A división é o primeiro sinal que paga a pena nomear: o gancho de instalación que un revisor examinaría está limpo, mentres que o código operativo se atopa a un directorio de distancia, oculto e ofuscado, alcanzable só cando se executa o punto de entrada exportado do paquete.
Acceso ao correo electrónico con código de dispositivo de Microsoft 365
O módulo .ad/x12.js leva a capacidade máis importante do marco de traballo. Impulsa a concesión de autorización de dispositivos Microsoft 365 OAuth 2.0:
text POST login[.]microsoftonline[.]com/common/oauth2/v2.0/devicecode A concesión de código de dispositivo é un fluxo lexítimo de Microsoft deseñado para dispositivos con restricións de entrada: un servizo solicita un código, o usuario escribe ese código en microsoft.com/dispositivologin` nun segundo dispositivo e aproba, e o servizo solicitante recibe tokens. Cando o servizo solicitante pertence a alguén que non sexa o propietario do correo electrónico, a aprobación entrega un token a ese terceiro. Unha vez obtido un token, `.ad/x12.js` lee a caixa de correo directamente a través de 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 o $select As proxeccións extraen os enderezos dos remitentes da caixa de entrada e os enderezos dos destinatarios dos elementos enviados, a materia prima para mapear os correspondentes dunha vítima. Trátase dun acceso de tipo adversario no medio (AiTM) por consentimento en lugar de por captura de contrasinal: non hai credenciais para o phishing no sentido clásico, só un código para obter a aprobación.
Un motor de correo masivo e SMS con modelos de suplantación de identidade
Arredor do acceso ao buzón atópase un correo. O paquete envía ficheiros de datos editables polo operador: listas de remitentes (remitentes.txt, smts.txt) e un ficheiro de modelo (funcións.txt) — cuxos enderezos provisorios se len como unha folla de casting para a suplantación de identidade: seguridade@apple.com, login-verificación, servizo OAuth, facturación e remitentes de notificacións de contas contra un yourdomain.com substituír o operador. O lado do SMS leva un teléfonoebook e configuración da pasarela. O servidor de correo itera as listas de destinatarios subministradas polo operador e envía a través de retransmisións SMTP configuradas.
Para facer que as ligazóns aterren, .ad/xu.js .ad/xq.js crear URLs que aproveiten a ambigüidade da análise de URLs e o seguimento de clics. Os patróns de falsificación incrustan unha autoridade de aparencia fiable antes dun @ polo que o prefixo visible difire do servidor real:
text https://trusted[.]com@ https://trusted[.]com%40 https://trusted[.]com:80@ https://redirect[.]example[.]com/ https://track[.]example[.]com/click? A estrutura tamén colle favicons dos principais consumidores e enterprise provedores de correo: unha técnica habitual para renderizar unha páxina de destino ou unha indicación de marca convincente para o provedor.
Recoñecemento de obxectivos e infraestruturas
Varios módulos recompilan contexto antes de envialos. .ad/x0.js resolve nomes a través de DNS sobre HTTPS (dns[.]google/resolve), .ad/xa.js consultas WHOIS (api[.]whois[.]vu) E .ad/x9.js executa a busca de código de GitHub (api[.]github[.]com/busca/código?q=) — un patrón consistente co descubrimento da configuración exposta do servidor de correo e das credenciais SMTP para alimentar a lista de retransmisión. .ad/xs.js consulta o índice CDX de Wayback Machine.
Comando e control
A través do conxunto ofuscado, .ad/x4.js fai referencia ao punto final do operador:
text http://api[.]nolimitent[.]xyz:4100 O anfitrión comparte o seu sen límite marca coa propia denominación da editorial e a : 4100 o porto é a canle de chamada á casa da estrutura. Este é o indicador individual máis duradeiro para os defensores: un paquete, unha estación de traballo de desenvolvedor ou un axente de compilación que chega api[.]nolimitent[.]xyz executou este código.
Indicadores de compromiso
Os indicadores seguintes son aqueles sobre os que pode actuar un defensor: grep a lockfile, bloquear un host ou buscar proxy e rexistros DNS. Os puntos finais de Microsoft aparecen porque o framework os utiliza de forma abusiva; non son maliciosos en si mesmos e non se deben bloquear.
| Indicador | tipo | Onde | Acción do defensor |
|---|---|---|---|
nolimit-agent (todas as versións 1.0.299–1.0.307) | Paquete | npm | Ficheiros de bloqueo Grep / rexistros de instalación |
api[.]nolimitent[.]xyz (:4100) | Host C2 | .ad/x4.js | Bloquear; buscar rexistros de DNS + proxy |
.ad/ directorio oculto como destino principal/bin | estrutura | package.json | Sinal estático na revisión do rexistro |
trusted[.]com@ / %40 / :80@ formularios de ligazón | URL falsa | .ad/xu.js, .ad/xq.js | Inspección de URL de correo/proxy |
Concesión de código de dispositivo + Gráfico inbox/sentitems ler | Comportamento | .ad/x12.js | Inicio de sesión en M365 + revisión da auditoría de Graph |
Copias hash de ficheiros capturadas na triaxe:
- paquete/.ad/x0.js — sha256 e4153bb614ee03ec456e6b5b41926385db6aae0e4f3e771d18e581571ad7ca2a
- paquete/paquete.json — sha256 8618064f1f6146b4a8f0459aff9154dca1847e3936aa44f4d4cd37e127075644
Un sinal de arrendatario de Microsoft 365 que paga a pena buscar independentemente deste paquete: inicios de sesión correctos co código do dispositivo seguidos inmediatamente de lecturas de gráfico de Cartafoles de correo/caixa de entrada Cartafoles/sentimentos de correo, especialmente dunha sesión que o usuario non recoñece.
Atribución e comportamento observado
O que é observable permanece separado de quen está detrás del.
Feitos observables: o paquete publícase baixo o nome comercial axente sen límite cun enderezo de Gmail non verificado e sen repositorio de orixe vinculado; o seu paquete.json descríbeo como un "remitente de correo electrónico avanzado" e etiquétao co equipo vermello palabra clave; o código de execución está concentrado nun espazo oculto e ofuscado .anuncio/ directorio cuxa cadea de ferramentas (javascript-ofuscator) é unha dependencia declarada; e o servidor de chamada a casa api[.]nolimitent[.]xyz reutiliza o sen límite marca. Trátase dun único paquete cun punto de referencia de infraestrutura controlado polo operador, non dun clúster de varios paquetes, e non se identificou ningunha superposición cunha campaña nomeada previamente.
o equipo vermello A palabra clave non cambia a clasificación. As ferramentas lexítimas de seguridade ofensiva que inclúen capacidade de dobre uso fano de forma transparente: código fonte lexible, obxectivos subministrados polo operador e sen chamada de inicio oculta. Este paquete inverte cada unha desas propiedades: o seu código operativo está ofuscado e oculto e envía balizas a unha infraestrutura fixa do operador en lugar de a un obxectivo subministrado polo usuario. O comportamento, non a etiqueta, rexe o veredicto, que é malicioso.
Aquí non se afirma a intención. A publicación describe o que fai o código (solicitar un código de dispositivo, ler unha caixa de correo a través de Graph, enviar correo masivo a través de relés configurados, enviar unha baliza a un host fixo) e non especifica o motivo.
Impacto, tendencias e orientación para os defensores
Dous efectos no tempo de instalación importan. En primeiro lugar, calquera desenvolvedor ou axente de CI que instale axente sen límite leva a estrutura a ese host e establece a chamada de inicio a api[.]nolimitent[.]xyzEn segundo lugar, a capacidade de código de dispositivo esténdese máis alá do host de instalación: unha caixa de correo de Microsoft 365 cuxo propietario é inducido a aprobar un código presentado léese directamente a través de Graph, sen que ningún contrasinal cruce nunca o cable.
A tendencia máis xeneralizada é a de internalizar. A suplantación de identidade por código de dispositivo (AiTM) pasou dunha infraestrutura de suplantación de identidade independente a un paquete nun rexistro público: distribución por npm instalar en lugar de mediante unha ligazón enviada por correo electrónico. Empaquetar o kit deste xeito sacrifica o problema de aloxamento e entrega de ligazóns do operador de phishing polo alcance dun rexistro e agocha o código operativo detrás dun gancho de instalación limpo e un directorio ofuscado chamado dotfile que impide unha rápida revisión manual.
Para os defensores:
- Revisión do rexistro e das dependencias. Tratar un paquete cuxo Inicio/caixa resólvese nun directorio oculto (con prefixo de punto) de código propio uniformemente ofuscado como de alto risco só pola estrutura, independentemente de se o gancho de instalación parece limpo. A minificación non é ofuscación: porta na sinatura do descodificador de matrices de cadeas, non na lonxitude da liña.
- Endurecemento de Microsoft 365. Restrinxir o fluxo de autorización do código do dispositivo con acceso condicional onde non sexa necesario desde o punto de vista operativo; as concesións de código do dispositivo son un vector de AiTM coñecido e os usuarios interactivos raramente as necesitan. Auditar os inicios de sesión do código do dispositivo seguidos da enumeración inmediata do correo de Graph.
- Detección de rede. Bloquear e alertar activado api[.]nolimitent[.]xyzBusca rexistros de DNS e proxy de saída en toda a infraestrutura de desenvolvedores e compilacións.
- Detección de rutas de correo. o usuario@host Formularios de URL falsos (de confianza[.]com@…) son detectables na pasarela de correo e no proxy; marcan as ligazóns cuxo compoñente de autoridade precede a un @.
O paquete estaba dispoñible en npm no momento da análise. Dado que a estrutura oculta abrangue toda a liña de versións publicadas e a actual última A etiqueta (1.0.307) contén a capacidade de código do dispositivo, a eliminación do rexistro debería abarcar todas as versións, non só unha única versión anterior.




