TL; DR
Les paquets se suppriment automatiquement. En août, sur une période de quinze jours, un opérateur npm a publié neuf paquets sous neuf noms différents, à partir de sept comptes, puis en a retiré huit lui-même. La durée de disponibilité de chaque paquet est passée de treize heures à dix-sept minutes. Cette technique n'est pas exclusive à cet opérateur : sept autres paquets, provenant d'opérateurs non liés et contenant des données totalement différentes, ont été retirés par leurs auteurs respectifs après une durée médiane de 37.8 minutes. Le paquet est supprimé avant même que la plupart des mécanismes de protection ne s'exécutent, et l'installation a déjà eu lieu.
Tout ce que le registre expose est soumis à une rotation ; la charge utile, elle, ne l'est pas. Les neuf ont livré un octet-identique bin/ Dans le répertoire, les mêmes condensés SHA-256 ont été retrouvés sur trois noms de paquets et deux comptes, à quinze jours d'intervalle. L'identité du contenu est le seul signal de suivi que cet opérateur n'a pas enfreint, et c'est grâce au paquet unique qu'il n'a jamais retiré que ces données ont pu être analysées.
Les personnes qui l'installent ne sont pas des victimes et sont de toute façon fortement exposées. Cet outil n'est pas destiné aux développeurs : il contourne la surveillance des examens à distance grâce à la capture d'écran cachée, l'extraction de texte à l'écran et l'affichage des réponses en surimpression. qui que ce soit qui dirige npm install est le bénéficiaire visé plutôt que la cible. Ils exécutent également un programme binaire non signé qui déchiffre les cookies de leur navigateur, depuis un compte qui s'autodétruit en moins d'une heure. Ils ne peuvent ni obtenir de correctif, ni vérifier ultérieurement les actions effectuées, ni signaler les dommages sans révéler la raison de leur installation.
Écosystème: npm, même schéma observé sur PyPI. Période: Juin–août 2026.
La mesure
Le temps de présence correspond à l'intervalle entre l'apparition et la disparition d'un colis, calculé à partir des métadonnées du registre. Il s'agit de mesures, et non d'estimations.
| Forfait | Publié (UTC) | Laissé debout |
|---|---|---|
moidev | 2026-08-16 16:31 | 5h 58m |
moidevx | 2026-08-17 03:24 | 13h 23m |
moidevz | 2026-08-26 03:38 | 12h 56m |
moideva | 2026-08-26 18:58 | 1h 33m |
amicat | 2026-08-28 20:48 | 17m |
bmcat | 2026-08-28 21:17 | 47m |
eyevox | 2026-08-28 21:44 | 21m |
moidevh | 2026-08-31 03:22 | 47m |
Lue dans l'ordre de publication, la fenêtre de diffusion se réduit d'un facteur supérieur à quarante, passant de 13 h 23 min au maximum à 17 minutes au minimum. Les quatre premiers paquets durent en moyenne huit heures et demie ; les quatre derniers, trente-trois minutes. Le 28 août, trois paquets ont été publiés et retirés en l'espace de 77 minutes.
La contraction n'est pas progressive. Elle est concentrée entre le 26 et le 28 août, et ce qui a changé, c'est l'estimation par l'opérateur de la durée de vie sécuritaire d'un colis.
Chaque retrait ici est initié par l'éditeur. Le document d'enregistrement pour chacun affiche une liste de mainteneurs vide à côté d'un temps.non publié enregistrement — la signature d'une dépublication plutôt que d'un retrait. Un neuvième paquet, eyiouss, n'a jamais été retirée ; c'est la raison pour laquelle tout cela a pu être examiné.
Il existe un second régime de retrait qu'il ne faut pas confondre avec celui-ci. Dans lequel seul le version de la charge utile Si un colis est retiré et qu'il survit, la durée médiane est d'environ 73 heures sur 31 colis. Ces remplacements arrivent par lots prédéfinis et laissent une enveloppe vide. package.json déclarer un principal qui ne transmet aucun fichier — sa seule fonction étant de conserver le nom. Ce système est une opération de maintenance planifiée. Celui-ci est une fenêtre d'exposition optimisée.
Ce qui survit à la suppression
Neuf de ces forfaits sont gérés par un seul opérateur : moidev, moidevx, moidevz, moideva, moidevh, amicat, bmcat, œilvox et eyioussLes noms ne suivent aucune convention — quiconque suit le moidev Stem aurait manqué plus de la moitié d'entre elles — et elles ont été publiées à partir de sept comptes distincts, presque tous enregistrés sur des domaines de messagerie jetables.
Ce qu'ils ont en commun, c'est une entrée manifeste qui n'a aucune raison d'exister :
"bin": { "": "bin/kalamasha-tool.js" } } Nous avons conservé des copies de cinq d'entre elles avant leur retrait. Sur l'ensemble des cinq, l'intégralité poubelle/ Le répertoire est identique au niveau des octets :
| Fichier | SHA-256 |
|---|---|
bin/kalamasha-tool.js | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
bin/uia_extract.exe | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
bin/chrome_cookies.ps1 | 21b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a |
bin/stealth_capture.ps1 | c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c |
bin/uia_extract.py | c20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e |
bin/uia_get_text.ps1 | 4a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c |
Deux autres signaux corroborent cette hypothèse. Trois paquets ont été publiés à 03h24, 03h38 et 03h22 UTC les 17, 26 et 31 août, soit un intervalle de seize minutes réparti sur quinze jours et trois comptes distincts. De plus, deux de ces comptes étaient enregistrés sur le même domaine de messagerie jetable, établissant ainsi un lien entre eux, indépendamment du code.
Les comptes
Voici les comptes d'éditeurs npm qui ont envoyé la charge utile, avec le paquet téléchargé pour chacun et la durée pendant laquelle il est resté en ligne :
| Compte éditeur | Forfait | Domaine de messagerie | Laissé debout |
|---|---|---|---|
letol39119 | moidev:1.0.0 | hutdot.com (jetable) | 5h 58m |
so1d1a7i27 | moidevx:1.0.0 | ogzmail.com (jetable) | 13h 23m |
lololololol435678 | eyiouss:3.0.21, 3.0.22, 4.0.1 | ogzmail.com (jetable) | toujours publié |
tagadob568 | moidevz:1.0.0 | ebflyai.com (jetable) | 12h 56m |
tayihim489 | moideva:1.0.0 | prodbits.com (jetable) | 1h 33m |
sahihai123 | amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0 | Courriel Web consommateur | 17m / 47m / 21m |
heytoshan | moidevh:1.0.0 | Courriel Web consommateur | 47m |
so1d1a7i27 et lololololol435678 part l' ogzmail.com domaine d'enregistrement — le lien qui relie le compte hébergeant encore une copie active au compte qui a publié sous le nom moidev tige deux semaines plus tôt. sahihai123 a publié et retiré trois noms de paquets distincts dans un seul laps de temps de 77 minutes le 28 août. Heytoshan enregistré, publié moidevh, et l'a retirée 47 minutes plus tard ; cela reste la seule publication de ce compte.
Chacun de ces comptes n'est associé à aucune adresse électronique vérifiée, ne comporte aucun lien vers un système de contrôle de version vérifié et n'a publié aucun projet sans rapport avec le sujet. Six des sept comptes n'hébergent plus aucun contenu.
Un colis n'a jamais été retiré. eyiouss:4.0.1 Publiée depuis le 16 août, la campagne était encore exploitable au moment de la rédaction. Huit éléments étaient irrécupérables ; elle a été entièrement reconstituée à partir de celui qui restait. Un opérateur qui supprime systématiquement finira toujours par en laisser un.
Fonctionnement de l'outil
eyiouss:4.0.1 Sur npm, il se décrit comme un « utilitaire DOM haute performance et un outil de diagnostic pour les applications web modernes ». C'est un outil de capture d'écran et de récupération de réponses conçu pour fonctionner dans le cadre de la surveillance d'examens à distance, comme l'indique son code source.
Le lanceur copie l'environnement d'exécution Electron sous un faux nom de fichier avant de l'exécuter, et indique ce qu'il évite :
// 🛡️ NOM BINAIRE FURTIF : Ne doit PAS entrer en conflit avec le véritable Testpad ! const STEALTH_NAME = 'SearchApp.exe';
L'en-tête de ce même fichier l'appelle un Chien de garde fantôme anti-surveillant et implémente une boucle de réapparition qui s'atténue d'autant plus que le processus est rapidement tué. Ailleurs, le processus augmente sa propre priorité pour lutter contre la limitation de la fréquence du processeur lors de la surveillance, repousse l'application d'examen hors du premier plan lorsqu'elle prend le focus, et met fin à un processus enfant Safe Exam Browser avec taskkill /F /T.
La capture s'effectue via un script PowerShell intégré, exécuté avec la stratégie d'exécution désactivée et la fenêtre masquée. Le texte affiché à l'écran est capturé en parallèle grâce à l'automatisation de l'interface utilisateur Windows. Les images et le texte mis en file d'attente sont envoyés à une session de modèle de langage dans un navigateur intégré, et la réponse est affichée dans une fenêtre superposée toujours au premier plan. Cette connexion est délibérément différée, et le code en explique la raison. pour éviter une exposition permanente à NETSTAT.
Le colis est également expédié chrome_cookies.ps1, en tête EXTRACTEUR DE BISCUITS CHROME, qui déchiffre les cookies Chrome et Edge via DPAPI et lit la base de données de cookies de jusqu'à quatre profils de navigateur. Précisémentcisely : nous n’avons trouvé aucun script appelé par son nom dans les fichiers JavaScript fournis. Seule la partie consommatrice, qui injecte les cookies de session stockés dans le navigateur intégré, est présente et accessible.
La position des personnes qui l'installent
Personne n'installe ce logiciel par accident. Il n'a aucune fonction en dehors d'un examen supervisé et son résultat consiste en l'affichage des réponses en surimpression sur l'écran de l'utilisateur. La description trompeuse du paquet ne vise pas du tout l'installateur ; elle est destinée à dissimuler la présence du logiciel dans le registre et à toute personne effectuant un audit ultérieur de la machine. L'installateur sait ce qu'il installe ; la description existe pour que… record L'installation ne le reflète pas.
Les parties lésées sont des tiers qui n'ont jamais eu affaire à npm : l'établissement qui organise l'examen, les autres candidats et tous ceux qui, en aval, se fient à la valeur de cette certification.
Mais le programme d'installation n'est donc pas sûr, et c'est ce point qu'il convient de souligner, car c'est le modèle du paquet éphémère lui-même qui crée le risque.
Ils exécutent un fichier binaire non signé provenant de sources inconnues. uia_extract.exe Des fichiers compilés, sans source ni historique de compilation, proviennent d'un compte inexistant. Le même fichier, identifié par son hachage, a été republié par letol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123 et Heytoshan Pendant quinze jours. Aucun responsable à contacter, aucun dépôt à consulter, aucun historique à vérifier : toutes les personnes ayant participé à son déploiement se sont autodétruites.
Ils lui ont octroyé exactement les capacités dont les logiciels malveillants ont besoin. Un processus caché, s'exécutant sous un faux nom, déchiffre les cookies du navigateur, surveille l'écran en continu, désactive les logiciels de sécurité et redémarre automatiquement lorsqu'il est interrompu. Actuellement, le déchiffrement des cookies est limité aux domaines d'un seul fournisseur et concerne la session de l'utilisateur. Cette limitation ne nécessite qu'une seule ligne de code, et rien dans le modèle de distribution ne permettrait de la détecter en cas de changement : un nouveau nom, un nouveau compte, un nouveau fichier téléchargé.
Ils ne peuvent pas recevoir de réparation. Le paquet est retiré de la liste des paquets dans l'heure qui suit. Aucune mise à jour n'est proposée, aucun avertissement n'est fourni et il est impossible de savoir ultérieurement si la version installée diffère de celle de l'utilisateur. Le contenu de la machine reste inchangé.
Ils ne peuvent pas contrôler ce qu'ils ont géré. Leur fichier de verrouillage fait désormais référence à un paquet qui n'est plus résolu. S'ils souhaitent ultérieurement déterminer le contenu de leur machine (après un incident ou un litige), le registre ne contient aucune trace à leur fournir.
Et ils ne peuvent pas signaler les dommages. Un utilisateur compromis par cet outil ne peut pas signaler d'abus sans révéler la raison de son installation. Ce n'est pas un hasard. Les signalements d'abus du registre constituent un moyen privilégié de détecter les logiciels malveillants éphémères, et la base d'utilisateurs de cet opérateur est structurellement incapable de l'utiliser. Le seul adversaire restant est l'analyse automatisée, calibrée sur une fenêtre de dix-sept minutes.
La structure des victimes et le temps de séjour constituent un même fait observé à deux reprises. Cela explique également l'anomalie chronologique : si le retrait était motivé par la crainte de plaintes, le produit le plus populaire et le plus ancien serait retiré en premier. Or, ce ne fut pas le cas, car aucune plainte n'a été formulée.
Même schéma, opérateur différent
L'opérateur de surveillance n'est pas seul dans ce cas, et le parallèle le plus évident s'exécute sur une charge utile sans rapport.
Entre le 24 et le 27 août, quatre packages npm sont apparus sous des noms empruntés à des outils d'authentification à deux facteurs — auth-otp, clé secrète-2FA, secretkey2fa et clé secrète 2FA — totalisant seize versions. Chacune était publiée depuis son propre compte nouvellement enregistré (beayilol, jeanpaul686g, zzzalipay, dluuuuu), toutes sans adresse électronique vérifiée, aucune avec un lien de contrôle de version vérifié, aucune ne publiant quoi que ce soit d'autre. Chacune a été retirée par son propre éditeur.
Le code malveillant n'a rien à voir avec les logiciels d'examen. Il lit les identifiants de connexion des navigateurs et les jetons Discord, puis effectue une authentification Xbox Live sur le lanceur Minecraft pour récupérer un jeton d'actualisation. Voici l'installateur. is la victime au sens ordinaire du terme — c'est ce qui rend la comparaison utile, car le comportement lors de la délivrance est identique dans tous les cas.
Les quatre cycles se sont déroulés dans l'ordre de publication, à 274.9, 37.8, 37.6 et 35.7 minutes : une première tentative prolongée, puis une convergence vers une valeur stable. Trois autres paquets, appartenant à d'autres opérateurs, présentent le même comportement de retrait.
| Forfait | Opérateur | Laissé debout |
|---|---|---|
octopus-action | balise de reconnaissance | 2.5 min |
mt-ts-serverless-starter | balise de reconnaissance | 9.6 min |
2fa-secretkey | Noms de couverture 2FA | 35.7 min |
secretkey2fa | Noms de couverture 2FA | 37.6 min |
secretkey-2fa | Noms de couverture 2FA | 37.8 min |
auth-otp | Noms de couverture 2FA | 274.9 min |
hex-encode-utils | d’autres | 724.2 min |
Sept paquets, durée médiane de 37.8 minutes, aucun d'entre eux n'étant lié à un logiciel d'examen.
Trois charges utiles sans lien entre elles, trois ensembles de comptes sans lien entre eux, une technique partagée.
Pourquoi la fenêtre se ferme
Quelque chose a changé dans l'environnement du registre au cours de l'année 2026, et le candidat le plus évident est que la vitesse de numérisation est devenue plus rapide.
Jusqu'à récemment, les paquets malveillants étaient principalement détectés a posteriori : par un utilisateur qui remarque quelque chose, par un signalement en aval ou par une analyse périodique. Le délai de détection se mesurait en jours. Ce n'est plus la seule option. L'analyse quasi temps réel des paquets nouvellement publiés… Système d'alerte précoce aux logiciels malveillants de Xygeni parmi un nombre croissant de systèmes de ce type dans l'ensemble du secteur — réduit considérablement l'écart entre la publication et l'inspection.
Un opérateur confronté à cette situation a deux options : rendre le contenu plus difficile à identifier ou réduire sa durée de disponibilité. La seconde est moins coûteuse, ne nécessite aucune ingénierie et le registre fournit gratuitement ce mécanisme : pendant la période de dépublication de 72 heures de npm, un éditeur peut retirer unilatéralement un paquet, et le nom peut ensuite être réutilisé. Le retrait est gratuit pour l’opérateur.
Le timing est parfait. Les deux opérateurs mentionnés convergent vers une valeur et la maintiennent au lieu de la laisser dériver, ce qui caractérise un paramètre optimisé et non une simple question de commodité. Le paramètre sur lequel ils ont convergé (quelques dizaines de minutes) est préétabli.cisoù il devrait se trouver pour passer une inspection automatisée tout en laissant le package installable suffisamment longtemps pour atteindre son public.
Cela reste une hypothèse. Les données temporelles ne permettent pas de distinguer une réponse à une analyse d'une réponse à une application du registre, ni de la maturation opérationnelle normale liée à l'apprentissage mutuel entre ces opérateurs. Ce que l'on peut affirmer sans tirer de conclusions est plus précis, mais tout aussi utile : La fenêtre d'exposition est désormais suffisamment courte pour que tout contrôle dépendant de l'inspection d'un colis après publication soit une course contre la montre fixée par l'opérateur. Les contrôles qui ne dépendent pas de l'inspection (mise en quarantaine par ancienneté, scripts d'installation désactivés) ne sont pas affectés par cette concurrence, ce qui est la raison pratique de les préférer.
Que faire à ce sujet
Quarantaine par âge. Aucun élément du tableau de durée de séjour n'a survécu treize heures. Une politique interdisant l'installation d'une version de dépendance avant 72 heures d'existence les aurait toutes exclues sans rien détecter.
Désactiver les scripts d'installation par défaut. –Ignorer-scripts supprime le mécanisme de distribution dont dépendent les programmes de vol d'identifiants présents dans ce corpus. Cela ne protège pas contre un outil exécuté délibérément par l'utilisateur, ce qui est le cas avantcisIl s'agit là de la distinction qu'il est important de comprendre.
Considérez toute disparition comme un incident de sécurité. Alerte en cas de défaillance d'une dépendance installée. Les preuves sont conservées dans le fichier de verrouillage, et non dans le registre.
Suivez le contenu, pas les noms. Les six condensés ci-dessus correspondent quel que soit le nom du paquet, le compte de l'éditeur ou la chaîne de version — chaque champ que cet opérateur a démontré modifier. Une règle côté registre stipulant qu'un compte nouvellement enregistré retirant son unique paquet en moins d'une heure constitue un comportement suspect aurait été déclenchée pour chaque paquet ici, sur la seule base des métadonnées.
Et si vous envisagez d'installer un élément de cette catégorie : Les caractéristiques qui rendent la détection difficile pour un registre sont les mêmes qui vous laissent sans recours. Il n'y a pas d'éditeur responsable, pas de procédure de mise à jour, et aucune trace des opérations effectuées.
Indicateurs
| Type | Valeur |
|---|---|
| Fichier | bin/kalamasha-tool.js — non-standard point d'entrée des poubelles |
| SHA-256 | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
| SHA-256 | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
| Processus | SearchApp.exe écrit à côté d'un environnement d'exécution Electron légitime |
| COMPORTEMENT | powershell -ExecutionPolicy Bypass -File au windowsHide: true |
| COMPORTEMENT | taskkill /F /T ciblant un processus de navigateur d'examen sécurisé |
| Métadonnées | Liste de responsables vide à côté d'un time.unpublished record |
| hybrides | letol39119, so1d1a7i27, lolololol435678, tagadob568, tayihim489, sahihai123, heytoshan |
| Inscription | ogzmail.com, hutdot.com, ebflyai.com, prodbits.com — domaines de messagerie jetable |
Références
- politique de dépublication de npm — le délai de 72 heures pendant lequel un éditeur peut retirer un paquet sans intervention.







