TL; DR
nolimit-agent est un package npm dont les versions publiées — 1.0.299 par 1.0.307, publiés sur quatre jours, du 26 au 29 juin 2026 — chacun comporte un Cadre complet de phishing et de courrier de masse dans un répertoire caché et entièrement obscurci. Dans chaque version, l'entrée principale aboutit à .ad/x0.js, l'un des ~86 fichiers dans un dossier nommé dotfile contenant environ 4 200 blobs de tableaux de chaînes javascript-obfuscator ; le hook d'installation et la disposition de l'entrée sont identiques sur toute la ligne.
Derrière l'obscurcissement se cache un Flux de code d'appareil OAuth de Microsoft 365 (login[.]microsoftonline[.]com/common/oauth2/v2.0/devicecodeUne fois le code approuvé, le système accède à la boîte de réception Outlook et aux éléments envoyés de la victime via l'API Microsoft Graph ; il utilise un moteur d'envoi SMTP et SMS en masse alimenté par des listes de destinataires fournies par l'opérateur ; il crée des modèles de messages usurpant l'identité de la marque ; il construit des liens de redirection ouverts ; et il effectue une reconnaissance via DNS-over-HTTPS, WHOIS et la recherche de code GitHub. Des balises de trafic sont envoyées en temps réel à l'infrastructure de l'opérateur. api[.]nolimitent[.]xyz:4100.
Personnes concernées : toute personne installant une version quelconque du paquet, et toute Boîte aux lettres Microsoft 365 dont le propriétaire approuve un code d'appareil présenté par son intermédiaire. La version la plus récente, 1.0.307, est la dernière étiquette actuelle et possède la même capacité de boîte aux lettres de code d'appareil — le code malveillant n'est pas limité à une seule version antérieure.
Gravité: critiqueÉcosystème touché : NPMLe premier indicateur à rechercher : l’hôte api[.]nolimitent[.]xyz.
L'attaque : comment elle fonctionne
Une enveloppe inoffensive dissimulant une charge utile cachée
L'emballage présente une surface ordinaire. package.json déclare un post-installation crochet -
text postinstall: node scripts/postinstall.js — et lors de l'inspection scripts/postinstall.js est inoffensif : il installe un shim de commande Windows et se termine. Le comportement ne réside pas dans le hook. principal et coffre Les deux champs pointent vers .annonce/, un répertoire dont le point initial le distingue des répertoires informels ls sortie, et dont le contenu est uniformément obfusqué par machine. L'analyseur statique a dénombré environ 4 293 segments de charge utile encodée dans le .annonce/ ensemble de modules ; javascript-obfuscateur est une dépendance de développement déclarée, qui correspond à la forme de rotation des tableaux de chaînes des fichiers groupés.
Cette séparation est le premier signal digne d'être mentionné : le programme d'installation qu'un examinateur scruterait est propre, tandis que le code opérationnel se trouve dans un répertoire distinct, caché et obscurci, accessible uniquement lorsque le point d'entrée exporté du paquet est exécuté.
Accès à la boîte aux lettres par code d'appareil Microsoft 365
Le module .ad/x12.js Elle renferme la fonctionnalité la plus importante du framework. Elle gère l'autorisation d'accès aux appareils via Microsoft 365 OAuth 2.0 :
text POST login[.]microsoftonline[.]com/common/oauth2/v2.0/devicecode L'octroi de code de périphérique est un flux Microsoft légitime conçu pour les périphériques à capacité de saisie limitée : un service demande un code, l'utilisateur saisit ce code dans microsoft.com/deviceloginsur un deuxième appareil, l'autorisation est accordée et le service demandeur reçoit des jetons. Si le service demandeur appartient à une personne autre que le propriétaire de la boîte aux lettres, l'autorisation attribue un jeton à ce tiers. Une fois le jeton obtenu, `.ad/x12.js` lit directement la boîte aux lettres 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 Le $select Les projections extraient les adresses des expéditeurs de la boîte de réception et celles des destinataires des éléments envoyés — les données brutes permettant de cartographier les correspondants d’une victime. Il s’agit d’un accès de type « attaquant du milieu » (AiTM) avec consentement plutôt qu’avec capture de mot de passe : aucun identifiant n’est requis pour l’hameçonnage au sens classique du terme, seulement un code d’autorisation.
Un moteur d'envoi de courriels et de SMS en masse avec des modèles d'usurpation d'identité
Autour de l'accès à la boîte aux lettres se trouve un expéditeur. Le colis contient des fichiers de données modifiables par l'opérateur — des listes d'expéditeurs (expéditeurs.txt, smtps.txt) et un fichier modèle (fonctions.txt) — dont les adresses provisoires ressemblent à une fiche de casting pour usurpation d'identité : sécurité@apple.com, login-vérification, service OAuth, facturation et expéditeurs de notifications de compte contre un yourdomain.com L'opérateur remplaçant assure la liaison. Le service SMS utilise un numéro de téléphone.ebook et la configuration de la passerelle. Le système de messagerie parcourt les listes de destinataires fournies par l'opérateur et envoie les messages via les relais SMTP configurés.
Pour que les liens atterrissent, .ad/xu.js et .ad/xq.js Créez des URL qui exploitent l'ambiguïté de l'analyse syntaxique des URL et le suivi des clics. Les modèles d'usurpation intègrent une autorité d'apparence fiable avant une URL. @ Le préfixe visible diffère donc de l'hôte réel :
text https://trusted[.]com@ https://trusted[.]com%40 https://trusted[.]com:80@ https://redirect[.]example[.]com/ https://track[.]example[.]com/click? Le système récupère également les favicons des principaux sites de consommateurs et enterprise Fournisseurs de messagerie — une technique courante pour créer une page d'accueil ou une page de destination convaincante aux couleurs du fournisseur.
Reconnaissance des cibles et des infrastructures
Plusieurs modules recueillent le contexte avant l'envoi. .ad/x0.js résout les noms via DNS-over-HTTPS (dns[.]google/resolve), .ad/xa.js requêtes WHOIS (api[.]whois[.]vu), Et .ad/x9.js effectue une recherche de code GitHub (api[.]github[.]com/search/code?q=) — un modèle cohérent avec la découverte de la configuration exposée du serveur de messagerie et des informations d'identification SMTP pour alimenter la liste de relais. .ad/xs.js interroge l'index CDX de la Wayback Machine.
Commander et contrôler
Dans cet ensemble obscurci, .ad/x4.js fait référence au point de terminaison de l'opérateur :
text http://api[.]nolimitent[.]xyz:4100 L'hôte partage son illimité la marque avec le nom propre de l'éditeur, et le : 4100 Le port est le canal de communication principal du framework. C'est l'indicateur le plus fiable pour les équipes de sécurité : un paquet, un poste de travail de développeur ou un agent de compilation qui atteint ce port. api[.]nolimitent[.]xyz a exécuté ce code.
Indicateurs de compromis
Les indicateurs ci-dessous permettent à un défenseur d'agir : analyser un fichier de verrouillage, bloquer un hôte ou consulter les journaux de proxy et DNS. Les terminaux Microsoft apparaissent car le framework les utilise à mauvais escient ; ils ne sont pas malveillants en eux-mêmes et ne doivent pas être bloqués.
| Indicateur | Type | Destination | Action du défenseur |
|---|---|---|---|
nolimit-agent (toutes les versions 1.0.299–1.0.307) | Forfait | NPM | Rechercher les fichiers de verrouillage / journaux d'installation |
api[.]nolimitent[.]xyz (:4100) | Hôte C2 | .ad/x4.js | Bloquer ; rechercher les journaux DNS et proxy |
.ad/ répertoire caché comme cible main/bin | Structure | package.json | Signal statique dans l'examen du registre |
trusted[.]com@ / %40 / :80@ formulaires de lien | Usurpation d'URL | .ad/xu.js, .ad/xq.js | Inspection des URL de messagerie/proxy |
Autorisation de code de périphérique + Graphique inbox/sentitems lire | Comportement | .ad/x12.js | Connexion à M365 + Examen d'audit des graphiques |
Hachages de fichiers capturés lors du triage :
- package/.ad/x0.js — sha256 e4153bb614ee03ec456e6b5b41926385db6aae0e4f3e771d18e581571ad7ca2a
- package/package.json — sha256 8618064f1f6146b4a8f0459aff9154dca1847e3936aa44f4d4cd37e127075644
Un signal concernant un locataire Microsoft 365 qu'il convient de rechercher indépendamment de ce package : des connexions réussies par code d'appareil suivies rapidement de lectures Graph de Dossiers mail/boîte de réception et CourrielDossiers/éléments envoyés, notamment à partir d'une session que l'utilisateur ne reconnaît pas.
Attribution et comportement observé
Ce qui est observable reste distinct de ceux qui en sont à l'origine.
Constatations : le paquet est publié sous le nom d'utilisateur agent nolimit avec une adresse Gmail non vérifiée et aucun dépôt source lié ; son package.json décrit ce logiciel comme un « expéditeur d'e-mails avancé » et l'étiquette avec le équipe rouge mot-clé ; le code d’exécution est concentré dans un emplacement caché et obfusqué .annonce/ répertoire dont la chaîne d'outils (javascript-obfuscateur) est une dépendance déclarée ; et l'hôte d'appel à domicile api[.]nolimitent[.]xyz réutilise le illimité marque. Il s'agit d'un forfait unique avec un seul point de repère d'infrastructure contrôlé par un opérateur — et non d'un ensemble de forfaits multiples, et aucun chevauchement avec une campagne précédemment nommée n'a été identifié.
Le équipe rouge Le mot-clé ne modifie pas la classification. Les outils de sécurité offensive légitimes offrant une double fonctionnalité le font de manière transparente : code source lisible, cibles fournies par l’opérateur et absence de communication cachée avec le serveur. Ce logiciel inverse chacune de ces propriétés : son code opérationnel est obscurci et masqué, et il communique avec l’infrastructure fixe de l’opérateur plutôt qu’avec une cible fournie par l’utilisateur. C’est le comportement, et non l’étiquette, qui détermine le verdict : malveillant.
L'intention n'est pas explicitée ici. L'article décrit les actions du code — demande d'un code d'appareil, lecture d'une boîte aux lettres via Graph, envoi de courriels groupés via des relais configurés, envoi d'une balise vers un hôte fixe — sans préciser le motif.
Impact, tendances et conseils aux défenseurs
Deux effets liés à l'installation sont importants. Premièrement, tout développeur ou agent CI qui installe agent nolimit installe le framework sur cet hôte et établit l'appel au serveur d'origine. api[.]nolimitent[.]xyzDeuxièmement, la fonctionnalité de code de périphérique étend sa portée au-delà de l'hôte d'installation : une boîte aux lettres Microsoft 365 dont le propriétaire est amené à approuver un code présenté est lue directement via Graph, sans qu'aucun mot de passe ne transite jamais sur le réseau.
La tendance générale est à l'internalisation. Le phishing par code d'appareil (AiTM) est passé d'une infrastructure de phishing autonome à un package sur un registre public — distribué par npm installer Plutôt que par un lien envoyé par courriel, ce mode de distribution du kit remplace le problème d'hébergement et de distribution du lien de l'opérateur de phishing par la portée d'un registre, et dissimule le code opérationnel derrière un programme d'installation propre et un répertoire obfusqué nommé par un fichier point, empêchant ainsi une inspection manuelle rapide.
Pour les défenseurs :
- Examen du registre et des dépendances. Traiter un colis dont principal/coffre Cela aboutit à un répertoire caché (dont le nom commence par un point) contenant du code propriétaire uniformément obfusqué, considéré comme à haut risque sur la seule base de sa structure, indépendamment de l'apparence du programme d'installation. La minification n'est pas de l'obfuscation : le contrôle s'effectue sur la signature du décodeur de tableaux de chaînes, et non sur la longueur des lignes.
- Renforcement de la sécurité de Microsoft 365. Limitez le flux d'autorisation par code d'appareil à l'aide de l'accès conditionnel lorsqu'il n'est pas nécessaire au fonctionnement ; les autorisations par code d'appareil constituent un vecteur d'attaque connu et sont rarement utilisées par les utilisateurs interactifs. Effectuez un audit des connexions par code d'appareil, suivi d'une énumération immédiate des boîtes aux lettres Graph.
- Détection du réseau. Bloquer et alerter sur api[.]nolimitent[.]xyzRecherchez ce problème dans les journaux DNS sortants et les journaux de proxy à travers l'infrastructure de développement et de construction.
- Détection du chemin du courrier. Le utilisateur@hôte Formulaires d'usurpation d'URL (trusted[.]com@…) sont détectables au niveau de la passerelle de messagerie et du proxy ; signalez les liens dont le composant d'autorité précède un @.
Le paquet était disponible sur npm au moment de l'analyse. Étant donné que le framework caché s'étend sur toute la lignée des versions publiées et sur la version actuelle derniers L'étiquette (1.0.307) contient la capacité de code de périphérique, la suppression du registre doit couvrir chaque version, et non seulement une seule version antérieure.






