TL; DR
Un package PyPI nommé gcli-control Il proposait un outil complet d'accès à distance pour Windows : enregistrement des frappes au clavier, capture webcam et microphone, surveillance du presse-papiers, accès aux identifiants du navigateur, contrôle de l'écran, persistance, élévation de privilèges et, comme il le mettait en avant, « plus de 140 commandes ». Il ne cachait pas sa véritable nature : son propre résumé sur PyPI le décrivait comme un « outil d'accès à distance via npoint.io".
Le détail qui mérite qu'on s'y attarde est cette phrase "via npoint.io." Au lieu de se connecter à un serveur dédié, l'implant utilisait npoint[.]io Il utilise un service gratuit et légitime d'hébergement de petits fichiers JSON comme relais de commande et de contrôle. L'opérateur écrit des commandes dans un conteneur JSON ; le programme malveillant interroge ce conteneur, exécute les commandes et renvoie les résultats. Aucun domaine appartenant à l'attaquant à bloquer, aucune nouvelle adresse IP à signaler : le trafic transite par un service utilisé quotidiennement par les développeurs.
Six versions furent publiées en treize heures et demie environ, chacune plus aboutie que la précédente. Chacune d'elles était accompagnée d'une partition. ml_prédit_sûr par un classificateur automatisé avant qu'un examen manuel ne reclassifie la famille comme malveillante.
Anatomie de l'attaque
gcli-control installe le package d'importation gcli, un code source Python composé de 35 modules. Aucune installation n'est requise. hooks — rien ne fonctionne pendant installer pipCette fonctionnalité réside dans les modules eux-mêmes, elle est activée une fois l'outil lancé, et la structure des modules ressemble à une fiche technique de produit :
| Domaine de compétences | Modules |
|---|---|
| Surveillance des hôtes | keylog, webcam, audio, clipboard, desktop, monitoring |
| Accès aux informations d'identification et aux données | browser, forensics, fileops, transfer, users |
| Point d'appui et escalade | persistence, elevator, registry, security |
| Reconnaissance de l'hôte et du réseau | system, processes, network_config, wifi, bluetooth, netutils |
| Commande et contrôle | client, host, session, protocol, npoint, crypto, encrypt |
Le canal de commande est l'élément intéressant. La plupart des outils d'accès à distance se connectent à un serveur contrôlé par l'opérateur — une adresse IP, un nom de domaine, un fournisseur d'hébergement — qui peut être signalé et mis hors service. gcli-control au lieu de cela, traite un Service JSON-bin gratuit comme boîte de dépôtL’ npoint Ce module lit et écrit de petits documents JSON sur npoint[.]io via HTTPS ordinaire ; le la cryptomonnaie/crypter Les modules encapsulent les données échangées afin que leur contenu ne soit pas constitué de commandes en clair. Il en résulte un relais chiffré et médiatisé.
- L'opérateur dépose une instruction (cryptée) dans un conteneur JSON.
- L'implant, exécuté sur l'hôte victime, interroge ce fichier binaire, le déchiffre, exécute l'un de ses gestionnaires de commandes et réécrit le résultat (chiffré).
- Pour un observateur de réseau, la victime communique simplement avec npoint[.]io — un service ayant une raison légitime d'apparaître dans le trafic des développeurs.
Il n'y a pas de téléchargement en deuxième étape ni de chargeur obscurci ici : la fonctionnalité est livrée complète, en Python lisible, et le seul « masquage » concerne le choix du relais et le chiffrement des charges utiles relayées.
Il convient d'expliquer pourquoi un dépôt mort JSON-bin est intéressant d'un point de vue opérationnel, car cela explique pourquoi nous nous attendons à revoir ce schéma :
- Aucun point de terminaison appartenant à l'opérateur. Il n'y a pas de domaine C2 à enregistrer, pas de VPS à louer, et rien qu'un défenseur ou un registrar puisse saisir. Suppression du paquet ne touche pas à la chaîne ; suppression de la indirect cela revient à demander à un logiciel SaaS généraliste de contrôler un document parmi des millions.
- Blanchiment de réputation. L'envoi de requêtes HTTPS sortantes vers un service de développement reconnu n'entraîne aucune pénalité de réputation, contrairement à un domaine récent ou à une adresse IP brute. De nombreuses configurations de filtrage du trafic sortant l'autorisent implicitement.
- Asynchronie et possibilité de déni. Un modèle d'interrogation périodique — l'implant récupère un document à intervalles réguliers au lieu de maintenir une connexion ouverte — génère un trafic qui ressemble à une interrogation périodique d'API, et non à une session interactive. Le chiffrement du contenu du document garantit que même un analyste qui découvre la corbeille ne verra que du texte chiffré, et non une liste de commandes.
- Rotation trivialeLe passage à un autre dossier ou à un service de prise de notes/collage différent ne nécessite qu'une seule ligne de configuration de la part de l'opérateur. Toute liste de blocage associée à un relais spécifique est obsolète dès son envoi.
Le compromis que l'opérateur accepte concerne le débit et la latence : un relais de type « dépôt mort » est plus lent et offre une bande passante inférieure à celle d'une connexion directe. Pour un dispositif de surveillance et de contrôle qui émet principalement des commandes brèves et collecte les résultats au fil du temps, ce compromis est facile à accepter.
Forum
La situation au sein de la famille s'est rapidement aggravée. Les horodatages de création des tickets pour les versions signalées situent l'ensemble de l'arc observé en l'espace d'environ treize heures et demie, et le nombre de preuves relevées par le scanner a augmenté en même temps que le code — passant de quelques sites signalés dans la première version à quatorze dans la dernière.
| Version | Première observation (UTC) | Note |
|---|---|---|
0.1.0 | 2026-07-21 12:59 | Téléchargement initial ; surface signalée minimale |
0.5.0 | 2026-07-21 18:01 | Les capacités s'étendent |
0.2.0 | 2026-07-21 18:03 | (La numérotation des versions n'est pas monotone par rapport à l'ordre de téléchargement) |
0.6.0 | 2026-07-22 00:44 | Ensemble de modules plus large |
0.7.0 | 2026-07-22 01:58 | Boîte à outils quasi complète |
0.7.1 | 2026-07-22 02:28 | Dernière version ; 35 modules, fonctionnalités complètes |
Les numéros de version n'ont pas été publiés dans un ordre strict, mais la direction est claire : une première version allégée, puis des itérations rapides jusqu'à la version 0.7.1 complète. Il s'agit là de la structure d'un projet en développement actif, déployé sur un registre public au fur et à mesure de son évolution, et non d'une version unique et instantanée.
Indicateurs de compromis
Tous les indicateurs ci-dessous ont été confirmés par rapport au contenu du paquet sur disque et à une analyse déterministe des indicateurs de la version 0.7.1 ; aucun n'est spéculatif.
| Type | Indicateur |
|---|---|
| Paquet (PyPI) | gcli-control, versions 0.1.0, 0.2.0, 0.5.0, 0.6.0, 0.7.0, 0.7.1 |
| package d'importation | gcli |
| Relais C2 | npoint[.]io (JSON-bin deaddrop ; charges utiles chiffrées) |
| Dépôt déclaré | github[.]com/gcli-control/gcli |
| Empreinte comportementale | Modules de surveillance colocalisés : keylog, webcam, audio, clipboard, browser, plus la persistance, l'ascenseur et une couche de commandes client/hôte/protocole dans un seul package |
| Installer hooks | Aucune : cette fonctionnalité s’exécute lors de l’exécution de l’outil, et non lors de l’installation. |
Note du défenseur : Le signal le plus fort et le plus durable n'est pas le domaine (un hôte relais effectue une rotation triviale) mais le forme: un seul paquet qui regroupe trois primitives de surveillance d'hôte distinctes ou plus et achemine une boucle commande/réponse via un service d'hébergement de contenu public. Blocage npoint[.]io Cette méthode pure et simple est impraticable pour la plupart des magasins ; alerter sur un processus inattendu qui capture les périphériques d’entrée et communique avec un service JSON-bin est beaucoup plus fiable.
Comportement observé et cadrage
Deux éléments rendent cet échantillon inhabituel, et il s'agit de faits observables plutôt que de suppositions sur les motivations.
Elle faisait sa propre publicité. Le résumé du paquet distribué sur PyPI énumérait clairement ses fonctionnalités : accès à distance, contrôle du bureau, gestion des utilisateurs, webcam, audio, enregistreur de frappe, persistance, données de navigation, Wi-Fi, registre et « plus de 140 commandes ». Aucune tentative n'était faite pour faire passer le code pour un outil d'aide à la compilation, une interface en ligne de commande ou un utilitaire d'agent d'IA, dissimulation pourtant courante sur les registres publics. Déterminer si cette ouverture reflète un outil de test d'intrusion publié sans contrôle d'accès ou autre chose reste une question que le contenu du paquet ne permet pas de trancher. Ce qui est certain, c'est qu'une boîte à outils fonctionnelle et polyvalente d'accès à distance et de surveillance était installable par quiconque. pépin.
Elle reposait sur la confiance en un service bienveillant. L'utilisation de npoint[.]io Le relais étant la technique déterminante, il illustre un modèle plus général : l’acheminement des communications C2 via une plateforme SaaS légitime (sites de partage de fichiers, conteneurs JSON, messagerie instantanée).hooks(voir la documentation cloud) afin que le trafic malveillant se fonde dans l'activité normale des développeurs et qu'aucun point d'accès appartenant à l'opérateur ne puisse être intercepté. Les charges utiles sur le relais étaient chiffrées, de sorte que le contenu du répertoire binaire ne pouvait pas être interprété comme des commandes par un observateur non averti.
Les signaux de l'éditeur sont minces et génériques. Le colis a déclaré un Auteur de « contributeurs gcli » et d'une licence MIT, et a orienté sa page d'accueil et ses champs de dépôt vers github[.]com/gcli-control/gcliRien de tout cela ne constitue une vérification : la mention d’un auteur est libre de droits, l’en-tête de licence MIT est gratuit et l’URL d’un dépôt dans les métadonnées du paquet est une affirmation, non une preuve de provenance. Ce schéma – un nom inédit, un auteur collectif générique et une organisation/un dépôt autoréférentiel créé autour du paquet – correspond à ce à quoi ressemble un projet conçu spécifiquement pour héberger le code, plutôt qu’à un outil existant auquel on aurait ajouté une fonctionnalité de contrôle à distance. Nous le mentionnons à titre d’observations ; ces éléments sont cohérents avec l’idée d’une distribution dédiée, mais ne la constituent pas à eux seuls.
Nous qualifions cette disposition de malveillante en raison de ses capacités et de son mode de diffusion : un dispositif complet et fonctionnel d’accès et de surveillance à distance, distribué via un index de paquets public avec un relais clandestin. Nous n’attribuons ni cible ni mobile.
Impact, tendances et ce que les défenseurs peuvent faire
Un angle mort pour le triage axé sur le déguisement. De nombreuses clés de triage automatisé des colis sur le déguisement signaux de logiciel malveillant typique du registre — blobs obfusqués, temps d'installation hooks, des phrases percutantes pour valoriser les références. Un package qui est simplement ouvertement un RATAvec un code propre et lisible et sans point d'installation, ce type de programme ne présente aucun de ces indices et peut échapper aux heuristiques qui s'attendent à une dissimulation. Les signaux qui permettent de détecter ce type de programme de manière fiable sont d'ordre structurel plutôt que liés au camouflage : un recensement des capacités (combien de primitives de surveillance d'hôtes distinctes coexistent dans un même package) et une analyse de la structure du C2 (une boucle de commande/réponse acheminée via un service d'hébergement de contenu générique). Ces vérifications sont déclenchées indépendamment du degré d'honnêteté ou de la fiabilité du programme. obfusqué l'emballage l'est.
La tendance SaaS-as-C2. L'utilisation abusive d'un service d'hébergement légitime comme boîte de dépôt n'est pas nouvelle, mais elle reste efficace car le coût défensif du blocage du service est élevé, tandis que le coût offensif du changement de service est quasi nul. Il faut s'attendre à ce que ce phénomène se développe. Les défenses réseau ciblant des domaines malveillants spécifiques deviennent obsolètes ; les règles comportementales (« ce processus lit le contenu du presse-papiers et la webcam, puis communique avec une API d'hébergement de notes ») restent valides.
Un croquis de détection concret. La règle durable ne nomme pas npoint[.]io Cela combine deux observations courantes individuellement, mais rares conjointement sur un environnement de développement ou d'intégration continue classique :
alerte lorsqu'un seul processus, au sein d'une même session, les deux :
(A) accède à une primitive de surveillance de l'hôte — périphérique d'entrée (crochet clavier/souris), caméra, microphone, capture d'écran, boucle de lecture du presse-papiers ou magasin d'informations d'identification du navigateur ("Login Données" / "État local" / DPAPI); ET
(B) effectue des requêtes sortantes vers un service public d'hébergement de contenu / de collage / de JSON-bin / de chat-webhook puis les soumet à un examen, quel que soit le service spécifique mentionné en (B).
Aucune des deux parties n'est suspecte prise individuellement : de nombreux outils légitimes effectuent des captures d'écran et envoient des données JSON à une API d'hébergement. La conjonction au sein d'un processus éphémère constitue le signal, et ce signal persiste malgré toute rotation de relais.
Étapes pratiques pour les équipes :
- Considérez l'installation de packages publics sur les hôtes de développement et d'intégration continue comme une limite d'exécution, et non comme une commodité : un RAT sur un agent de construction est un RAT qui détient vos secrets.
- Privilégiez les miroirs internes autorisés ; un paquet portant littéralement le nom d’un contrôle à distance et décrivant un enregistreur de frappe ne devrait jamais être résolu sur un index d’entreprise.
- Alerte concernant le combinaison — périphérique d'entrée ou capture d'écran plus trafic sortant vers un service de contenu/collage/JSON-bin — plutôt que sur une seule primitive, qui a des utilisations bénignes isolées.
- Ne vous fiez pas à un score « sûr » automatisé comme verdict définitif pour les paquets disposant de larges capacités d'accès à l'hôte ; soumettez-les à un examen humain.
Ce groupe de paquets a été classé comme malveillant et soumis à une procédure de suppression dans le registre. Étant donné qu'un serveur de commande et de contrôle (C2) utilisant un relais ne laisse aucun hôte appartenant à l'opérateur pour y rediriger les données, la valeur défensive durable réside dans l'empreinte comportementale décrite ci-dessus, et non dans une simple entrée de liste de blocage.





