TL; DR
Un pacchetto PyPI denominato gcli-control ha distribuito uno strumento completo di accesso remoto a Windows: registrazione della pressione dei tasti, acquisizione di webcam e microfono, monitoraggio degli appunti, accesso con credenziali del browser, controllo dello schermo, persistenza, elevazione dei privilegi e "oltre 140 comandi" autoproclamati. Non ha nascosto di cosa si trattasse: il riepilogo PyPI del pacchetto stesso lo descriveva come uno "strumento di accesso remoto tramite npoint.io".
Il dettaglio su cui vale la pena soffermarsi è quella frase "tramite npoint.io." Invece di chiamare casa un server dedicato, l'impianto utilizzato npoint[.]io (un servizio gratuito e legittimo per l'hosting di piccoli documenti JSON) come relay di comando e controllo. L'operatore scrive i comandi in un contenitore JSON; il malware interroga quel contenitore, esegue i comandi e scrive i risultati. Nessun dominio di proprietà dell'attaccante da bloccare, nessun nuovo indirizzo IP da segnalare: il traffico va a un servizio che gli sviluppatori usano ogni giorno.
Sei versioni furono pubblicate in circa tredici ore e mezza, ognuna più capace della precedente. Ognuna di esse fu valutata ml_predicted_safe da un classificatore automatico prima della revisione manuale che ha riclassificato la famiglia come dannosa.
Attacco anatomico
gcli-control installa il pacchetto di importazione gcli, una codebase Python composta da 35 moduli. Non ci sono istruzioni di installazione hooks — durante non viene eseguito nulla installazione pipLa funzionalità risiede nei moduli stessi, viene richiamata all'avvio dello strumento e la struttura dei moduli è simile a una scheda tecnica del prodotto:
| Area di competenza | moduli |
|---|---|
| sorveglianza dell'host | keylog, webcam, audio, clipboard, desktop, monitoring |
| Credenziali e accesso ai dati | browser, forensics, fileops, transfer, users |
| Punto d'appoggio e escalation | persistence, elevator, registry, security |
| Ricognizione di host e rete | system, processes, network_config, wifi, bluetooth, netutils |
| Comando e controllo | client, host, session, protocol, npoint, crypto, encrypt |
La parte interessante è il canale di comando. La maggior parte degli strumenti di accesso remoto raggiunge un server controllato dall'operatore: un indirizzo IP, un dominio, un provider di hosting che può essere segnalato e disattivato. gcli-control invece tratta un Servizio JSON-bin gratuito come punto di consegna segreto.. npoint il modulo legge e scrive piccoli documenti JSON su npoint[.]io tramite HTTPS ordinario; il crypto/cifrare I moduli incapsulano i payload scambiati in modo che il contenuto del bin non sia costituito da comandi in chiaro. L'effetto è un relay mediato e crittografato:
- L'operatore inserisce un'istruzione (crittografata) in un contenitore JSON.
- Il malware, in esecuzione sul computer della vittima, interroga quel contenitore, decifra il contenuto, esegue uno dei suoi gestori di comandi e riscrive il risultato (crittografato).
- Per un monitor di rete, la vittima sta semplicemente parlando npoint[.]io — un servizio che ha una ragione legittima per apparire nel traffico degli sviluppatori.
Non è previsto alcun download in una seconda fase né alcun caricatore offuscato: la funzionalità viene fornita completa, in Python leggibile, e l'unico "occultamento" consiste nella scelta del relay e nella crittografia dei payload inoltrati.
Vale la pena spiegare perché un punto di consegna non raggiungibile tramite JSON-bin sia operativamente vantaggioso, perché questo chiarisce perché ci aspettiamo di rivedere questo schema:
- Nessun endpoint di proprietà dell'operatore. Non c'è alcun dominio C2 da registrare, nessun VPS da noleggiare e niente che un difensore o un registrar possa sequestrare. Rimozione del pacchetto non tocca il canale; rimozione del canale significa chiedere a un SaaS generico di controllare un documento tra milioni.
- Riciclaggio di reputazione. Il traffico HTTPS in uscita verso un servizio per sviluppatori ben noto non comporta le penalizzazioni di reputazione che si avrebbero con un dominio nuovo o un indirizzo IP grezzo. Molte configurazioni di filtraggio in uscita lo consentono implicitamente.
- Asincronia e negabilità. Un modello di polling, in cui il malware scarica un documento a intervalli regolari anziché mantenere una connessione aperta, produce un traffico che assomiglia a un polling periodico delle API, non a una sessione interattiva. La crittografia del contenuto del documento fa sì che anche un analista che trovi la cartella bin visualizzi il testo cifrato, non un elenco di comandi.
- rotazione banaleIl passaggio a un contenitore diverso, o a un servizio di note/incolla completamente diverso, richiede all'operatore una sola modifica di configurazione. Qualsiasi lista di blocco associata a uno specifico relay è obsoleta nel momento stesso in cui viene inviata.
Il compromesso che l'operatore accetta è tra velocità di trasmissione e latenza: un collegamento diretto è più lento e ha una larghezza di banda inferiore rispetto a una connessione diretta. Per un impianto di sorveglianza e controllo che emette principalmente comandi brevi e raccoglie risultati nel tempo, questo compromesso è facilmente accettabile.
timeline
La situazione è degenerata rapidamente. I timestamp di creazione dei ticket per le versioni segnalate collocano l'intero arco osservato in circa tredici ore e mezza, e il numero di prove raccolte dallo scanner è cresciuto di pari passo con il codice, passando da un paio di siti segnalati nella prima versione a quattordici nell'ultima.
| Versione | Prima apparizione (UTC) | Note: |
|---|---|---|
0.1.0 | 2026-07-21 12:59 | Caricamento iniziale; superficie minima contrassegnata |
0.5.0 | 2026-07-21 18:01 | Le capacità si espandono |
0.2.0 | 2026-07-21 18:03 | (la numerazione delle versioni non è monotona rispetto all'ordine di caricamento) |
0.6.0 | 2026-07-22 00:44 | Set di moduli più ampio |
0.7.0 | 2026-07-22 01:58 | Kit di strumenti quasi completo |
0.7.1 | 2026-07-22 02:28 | Ultimo modello; 35 moduli, piena funzionalità |
I numeri di versione non sono stati pubblicati in ordine rigoroso, ma la direzione è chiara: una prima versione ridotta, seguita da una rapida iterazione verso la versione 0.7.1 completa di tutte le funzionalità. Questo è il modello di un progetto in fase di sviluppo attivo, che viene rilasciato su un registro pubblico man mano che cresce, non un rilascio unico e definitivo.
Indicatori di compromesso
Tutti gli indicatori riportati di seguito sono stati confermati confrontandoli con il contenuto del pacchetto su disco e con una scansione deterministica degli indicatori della versione 0.7.1; nessuno di essi è speculativo.
| Tipo | |
|---|---|
| Pacchetto (PyPI) | gcli-control, versioni 0.1.0, 0.2.0, 0.5.0, 0.6.0, 0.7.0, 0.7.1 |
| Pacchetto di importazione | gcli |
| Relè C2 | npoint[.]io (Trasferimento di dati non autorizzato tramite JSON-bin; payload crittografati) |
| Repository dichiarato | github[.]com/gcli-control/gcli |
| impronta comportamentale | Moduli di sorveglianza collocati nello stesso luogo: keylog, webcam, audio, clipboard, browser, oltre a persistenza, ascensore e un livello di comando client/host/protocollo in un unico pacchetto |
| Installazione hooks | Nessuno: la funzionalità viene eseguita durante l'esecuzione dello strumento, non durante l'installazione. |
Nota del difensore: il segnale più forte e duraturo non è il dominio (un host di relay ruota banalmente) ma il shape: un singolo pacchetto che raggruppa tre o più primitive distinte di sorveglianza dell'host and instrada un ciclo comando/risposta attraverso un servizio pubblico di hosting di contenuti. Bloccante npoint[.]io Una soluzione diretta è impraticabile per la maggior parte dei negozi; un sistema di allerta per processi imprevisti che acquisiscono input dai dispositivi e comunicano con un servizio JSON-bin è molto più efficace.
Comportamento osservato e inquadramento
Due elementi rendono questo campione insolito, ed entrambi sono fatti osservabili piuttosto che inferenze sul movente.
Si è pubblicizzato da solo. Il riepilogo del pacchetto distribuito su PyPI elencava le funzionalità in linguaggio semplice: accesso remoto, controllo del desktop, gestione utenti, webcam, audio, keylogger, persistenza, dati del browser, WiFi, registro, "oltre 140 comandi". Non c'era alcun tentativo di spacciare il codice per un helper di compilazione, un wrapper CLI o un'utilità per agenti AI, che è il travestimento più comune che vediamo nei registri pubblici. Se questa apertura rifletta uno strumento per red team pubblicato senza controlli di accesso o qualcos'altro è una questione che il solo contenuto del pacchetto non risolve; quel che è certo è che un toolkit funzionante per l'accesso remoto e la sorveglianza di uso generale era installabile da chiunque con seme.
Si basava sulla fiducia riposta in un servizio innocuo. utilizzando npoint[.]io poiché il relay è la tecnica determinante. È un esempio di un modello più ampio: instradare C2 attraverso un SaaS legittimo (siti di incolla, contenitori JSON, chat web)hooks(documentazione cloud) in modo che il traffico dannoso si mimetizzi con la normale attività di sviluppo e non vi sia alcun endpoint di proprietà dell'operatore da sequestrare. I payload sul relay erano crittografati, quindi il contenuto del bin non sarebbe stato interpretato come comandi da un osservatore occasionale.
I segnali provenienti dagli editori sono deboli e generici. Il pacchetto ha dichiarato un Autore di “collaboratori gcli” e una licenza MIT, e ha indirizzato i campi della sua homepage e del repository a github[.]com/gcli-control/gcliNiente di tutto ciò costituisce una verifica: la stringa dell'autore è testo libero, l'intestazione della licenza MIT non costa nulla e l'URL del repository nei metadati del pacchetto è un'affermazione, non una prova di provenienza. Lo schema – un nome completamente nuovo, un autore collettivo generico e un'organizzazione/repository autoreferenziale creato attorno al pacchetto – è ciò che appare un progetto quando viene avviato specificamente per contenere il codice, piuttosto che uno strumento già esistente che per caso ha sviluppato una funzionalità di controllo remoto. Notiamo queste osservazioni; sono coerenti con, ma di per sé non stabiliscono, una distribuzione creata appositamente.
Descriviamo il sistema come malevolo in base alle sue capacità e alla modalità di distribuzione: un impianto completo e funzionante per l'accesso remoto e la sorveglianza, distribuito tramite un indice di pacchetti pubblico con un relay nascosto. Non attribuiamo un obiettivo specifico né un movente.
Impatto, tendenze e cosa possono fare i difensori
Un punto cieco per il triage orientato al travestimento. Molte chiavi automatizzate per la selezione dei pacchetti sul travestimento segnali di tipico malware di registro — blocchi offuscati, tempo di installazione hooks, frasi brevi per la raccolta delle credenziali. Un pacchetto che è semplicemente apertamente un RATTO, con codice pulito e leggibile e senza hook di installazione, non presenta nessuno di questi indizi e può eludere le euristiche che si aspettano l'occultamento. I segnali che catturano in modo affidabile questa classe sono strutturali piuttosto che basati sul travestimento: un censimento delle capacità (quanti primitivi di sorveglianza host distinti coesistono in un pacchetto) e un'analisi della forma C2 (un ciclo comando/risposta instradato attraverso un servizio di hosting di contenuti generico). Questi controlli si attivano indipendentemente da quanto onesto o offuscato la confezione è.
La tendenza SaaS-as-C2. L'abuso di un servizio di hosting legittimo come punto di accesso non sicuro non è una novità, ma continua a funzionare perché il costo difensivo del blocco del servizio è elevato, mentre il costo offensivo del cambio di servizio è pressoché nullo. È prevedibile un aumento di questo fenomeno. Le difese di rete basate su specifici domini dannosi diventano obsolete immediatamente; le regole comportamentali ("questo processo legge gli appunti e la webcam e poi comunica con un'API di hosting di note") no.
Uno schema di rilevamento concreto. La regola duratura non nomina npoint[.]io in assoluto. Combina due osservazioni che sono singolarmente comuni ma insieme rare su un normale host di sviluppo o CI:
avviso quando un singolo processo, all'interno di una sessione, entrambi:
(A) accede a un primitivo di sorveglianza dell'host: dispositivo di input (hook per tastiera/mouse), fotocamera, microfono, acquisizione dello schermo, ciclo di lettura degli appunti o archivio delle credenziali del browser ("Login Dati" / "Stato locale" / DPAPI); E
(B) effettua richieste in uscita a un servizio pubblico di hosting di contenuti / paste / JSON-bin / chat-webhook e poi le sottopone a revisione, indipendentemente dal servizio specifico in (B).
Nessuna delle due metà è sospetta di per sé: molti strumenti legittimi effettuano screenshot e molti inviano dati JSON a un'API di hosting. La congiunzione all'interno di un processo di breve durata è il segnale, e sopravvive a qualsiasi rotazione del relè.
Passaggi pratici per i team:
- Considerate l'installazione di pacchetti pubblici sugli host di sviluppo e di integrazione continua come un limite di esecuzione, non come una comodità: un RAT su un agente di build è un RAT che ha accesso ai vostri segreti.
- Preferisci i mirror interni consentiti; un pacchetto che ha letteralmente un nome che richiama il controllo remoto e descrive un keylogger non dovrebbe mai essere risolto in un indice aziendale.
- Avviso sul combinazione — dispositivo di input o acquisizione dello schermo più traffico in uscita verso un servizio di contenuto/incolla/JSON-bin — piuttosto che su una singola primitiva, che ha usi innocui se isolatamente.
- Non affidatevi a un punteggio automatico di "sicurezza" come verdetto definitivo per i pacchetti con ampie capacità di accesso all'host; inviateli a un esaminatore umano.
La famiglia di pacchetti è stata classificata come dannosa e segnalata per la rimozione dal registro. Poiché un C2 basato su relay non lascia alcun host di proprietà dell'operatore a rischio di intrusione, il valore difensivo duraturo risiede nell'impronta comportamentale sopra descritta, non in una singola voce della blacklist.





