TL; DR
Un pachet PyPI numit control gcli a livrat un instrument complet de acces la distanță pentru Windows: înregistrarea apăsărilor de taste, captura camerei web și a microfonului, monitorizarea clipboard-ului, acces prin acreditări de browser, controlul ecranului, persistență, creșterea privilegiilor și o auto-promovată „peste 140 de comenzi”. Nu a ascuns ce era: propriul rezumat PyPI al pachetului îl descria ca un „instrument de acces la distanță prin npoint.io".
Detaliul asupra căruia merită să ne oprim este acea frază „prin intermediul npoint.io.” În loc să apeleze la un server dedicat, implantul folosit npoint[.]io (un serviciu gratuit și legitim pentru găzduirea de documente JSON de mici dimensiuni) ca releu de comandă și control. Operatorul scrie comenzi într-un bin JSON; implantul interoghează acel bin, execută și scrie rezultatele înapoi. Niciun domeniu deținut de atacator de blocat, nicio adresă IP nouă de semnalat: traficul merge către un serviciu pe care dezvoltatorii îl folosesc zilnic.
Șase versiuni au fost publicate în aproximativ treisprezece ore și jumătate, fiecare mai capabilă decât precedenta. Fiecare dintre ele a fost punctată ml_predicted_safe de către un clasificator automat înainte ca revizuirea manuală să reclasifice familia ca fiind rău intenționată.
Anatomia atacului
control gcli instalează pachetul de import gcli, o bază de cod Python cu 35 de module. Nu există perioade de instalare hooks — nimic nu rulează în timpul pip installCapacitatea se află chiar în module, fiind invocată odată ce instrumentul rulează, iar aspectul modulului se citește ca o fișă tehnică a produsului:
| Zona de capabilitate | Modules |
|---|---|
| Supravegherea gazdei | keylog, webcam, audio, clipboard, desktop, monitoring |
| Acces la credențiale și date | browser, forensics, fileops, transfer, users |
| Punct de sprijin și escaladare | persistence, elevator, registry, security |
| Reconaștere gazdă și rețea | system, processes, network_config, wifi, bluetooth, netutils |
| Comandă și control | client, host, session, protocol, npoint, crypto, encrypt |
Canalul de comandă este partea interesantă. Majoritatea instrumentelor de acces la distanță ajung la un server controlat de operator - o adresă IP, un domeniu, un furnizor de găzduire care poate fi raportată și scoasă offline. control gcli în schimb tratează o serviciu JSON-bin gratuit ca dead-drop. punct n modulul citește și scrie documente JSON mici pe npoint[.]io prin HTTPS obișnuit; cripto/criptați modulele încapsulează sarcinile utile schimbate, astfel încât conținutul bin-urilor să nu fie comenzi în text simplu. Efectul este o transmisie mediată, criptată:
- Operatorul plasează o instrucțiune (criptată) într-un bin JSON.
- Implantul, care rulează pe gazda victimă, interoghează acel coș de date, decriptează, execută unul dintre handlerele sale de comenzi și scrie înapoi rezultatul (criptat).
- Pentru un monitor de rețea, victima pur și simplu vorbește cu npoint[.]io — un serviciu cu un motiv legitim de a apărea în traficul dezvoltatorilor.
Nu există o descărcare în a doua etapă și niciun încărcător ofuscat aici: capacitatea este livrată integral, în Python lizibil, iar singura „ascunzătoare” este alegerea retransmiterii și criptarea payload-urilor retransmise.
Merită explicat de ce un JSON-bin dead-drop este atractiv din punct de vedere operațional, deoarece explică de ce ne așteptăm să vedem din nou modelul:
- Niciun punct final deținut de operator. Nu există niciun domeniu C2 de înregistrat, niciun VPS de închiriat și nimic pe care un apărător sau un registrator să îl poată confisca. Eliminarea domeniului pachet nu atinge canalul; îndepărtarea canal înseamnă a cere unui SaaS de uz general să supravegheze un singur document dintre milioane.
- Spălarea reputației. Contul HTTPS de ieșire către un serviciu de dezvoltare cunoscut nu are nicio penalizare de reputație pe care o are un domeniu nou sau o adresă IP brută. Multe configurații de filtrare a ieșirilor permit implicit acest lucru.
- Asincronie și negabilitate. Un model de interogare — implantul preia un document la un interval în loc să mențină un socket deschis — produce trafic care arată ca o interogare API periodică, nu ca o sesiune interactivă. Criptarea conținutului documentului înseamnă că până și un analist care găsește coșul de date vede text cifrat, nu o listă de comenzi.
- Rotație trivialăMutarea într-o altă casetă sau într-un serviciu complet diferit de notițe/lipire reprezintă o modificare de configurație dintr-o singură linie pentru operator. Orice listă de blocaje asociată cu un anumit releu este învechită în momentul în care este expediată.
Compromisul pe care îl acceptă operatorul este reprezentat de debit și latență: un releu de tip „dead-drop” este mai lent și are o lățime de bandă mai mică decât o conexiune directă. Pentru un implant de supraveghere și control care emite în mare parte comenzi scurte și colectează rezultate în timp, acest compromis este ușor de făcut.
Companiei
Problemele au escaladat rapid. Marcajele temporale de creare a tichetelor pentru versiunile semnalizate plasează întregul arc observat în aproximativ treisprezece ore și jumătate, iar numărul de dovezi ale scanerului a crescut odată cu codul - de la câteva site-uri semnalate în prima versiune la paisprezece în cea mai recentă.
| Versiune | Prima apariție (UTC) | notițe |
|---|---|---|
0.1.0 | 2026-07-21 12:59 | Încărcare inițială; suprafață minimă semnalizată |
0.5.0 | 2026-07-21 18:01 | Capacitatea se extinde |
0.2.0 | 2026-07-21 18:03 | (numerotarea versiunilor nu este monotonă în ordinea de încărcare) |
0.6.0 | 2026-07-22 00:44 | Set de module mai larg |
0.7.0 | 2026-07-22 01:58 | Set de instrumente aproape complet |
0.7.1 | 2026-07-22 02:28 | Cel mai recent; 35 de module, capacitate completă |
Numerele de versiune nu au fost publicate în ordine strictă, dar direcția este clară: o primă mică modificare, apoi o iterație rapidă către versiunea completă 0.7.1. Aceasta este forma unui proiect aflat în dezvoltare activă, care este împins către un registru public pe măsură ce crește, nu o lansare singulară.
Indicatori de compromis
Toți indicatorii de mai jos au fost confirmați în raport cu conținutul pachetului de pe disc și cu o scanare deterministă a indicatorilor versiunii 0.7.1; niciunul nu este speculativ.
| Tip | Indicator |
|---|---|
| Pachet (PyPI) | gcli-control, versiunile 0.1.0, 0.2.0, 0.5.0, 0.6.0, 0.7.0, 0.7.1 |
| Import pachet | gcli |
| Releu C2 | npoint[.]io (JSON-bin dead-drop; sarcini utile criptate) |
| Depozit declarat | github[.]com/gcli-control/gcli |
| Amprentă comportamentală | Module de supraveghere colocate: keylog, webcam, audio, clipboard, browser, plus persistență, elevator și un strat de comenzi client/gazdă/protocol într-un singur pachet |
| Instalare hooks | Niciuna: funcționalitatea rulează în timpul execuției instrumentului, nu în timpul instalării |
Notă apărătorului: Cel mai puternic semnal durabil nu este domeniul (o gazdă de releu se rotește trivial), ci formaun singur pachet care include trei sau mai multe primitive distincte de supraveghere a gazdei și direcționează o buclă comandă/răspuns printr-un serviciu public de găzduire de conținut. Blocare npoint[.]io Alertarea directă este impracticabilă pentru majoritatea magazinelor; alertarea privind un proces neașteptat care capturează atât dispozitivele de intrare, cât și comunică cu un serviciu JSON-bin este mult mai robustă.
Comportament observat și încadrare
Două lucruri fac acest eșantion neobișnuit, și ambele sunt fapte observabile, mai degrabă decât deducții despre motiv.
Și-a făcut reclamă. Rezumatul pachetului distribuit pe PyPI enumera capabilitățile în limbaj simplu - acces la distanță, control desktop, gestionare utilizatori, cameră web, audio, keylogger, persistență, date browser, WiFi, registry, „peste 140 de comenzi”. Nu a existat nicio încercare de a prezenta codul ca un helper de compilare, un wrapper CLI sau un utilitar AI-agent, care este cea mai comună deghizare pe care o vedem în registrele publice. Dacă această deschidere reflectă un instrument red-team publicat fără controale de acces sau altceva este o întrebare pe care conținutul pachetului în sine nu o rezolvă; ceea ce este cert este că un set de instrumente funcțional, de uz general, pentru acces la distanță și supraveghere putea fi instalat de oricine cu... țâfnă.
Se baza pe încrederea într-un serviciu benign. Utilizarea npoint[.]io deoarece retransmiterea este tehnica definitorie. Este un exemplu al unui model mai larg - rutarea C2 printr-un SaaS legitim (site-uri de inserare, containere JSON, chat web)hooks, documente în cloud) astfel încât traficul rău intenționat să se amestece în activitatea normală a dezvoltatorului și să nu existe niciun endpoint deținut de operator care să fie confiscat. Sarcinile utile de pe releu au fost criptate, astfel încât conținutul bin-ului să nu fie citit ca comenzi pentru un observator ocazional.
Semnalele editorului sunt rare și generice. Pachetul a declarat un Autor de „contribuitori gcli” și o licență MIT și a indicat pagina principală și câmpurile repozitoriului către github[.]com/gcli-control/gcliNimic din toate acestea nu este o verificare: un șir de caractere autor este text liber, un antet de licență MIT nu costă nimic, iar o adresă URL a unui depozit în metadatele pachetului este o revendicare, nu o dovadă a provenienței. Modelul - un nume complet nou, un autor colectiv generic și o organizație/depozit autoreferențial creat în jurul pachetului - reprezintă aspectul unui proiect atunci când este creat special pentru a transporta codul, mai degrabă decât un instrument consacrat care întâmplător a dezvoltat o funcție de control de la distanță. Le menționăm ca observații; sunt consistente cu, dar nu stabilesc prin ele însele, o distribuție construită special.
Descriem dispozitivul ca fiind rău intenționat pe baza capacității și a modului de livrare: un implant complet, rulabil, de acces de la distanță și supraveghere, distribuit pe un index public de pachete cu un releu secret. Nu atribuim o țintă sau un motiv.
Impact, tendințe și ce pot face apărătorii
Un punct orb pentru triajul bazat pe deghizare. Multe chei automate de triere a coletelor pe deghizare semnale de malware tipic pentru registry — blob-uri ofuscate, în timpul instalării hooks, replici scurte despre recoltarea acreditărilor. Un pachet care este pur și simplu deschis un RAT, cu cod curat și ușor de citit și fără hook de instalare, nu prezintă niciuna dintre aceste indicatoare și poate trece peste euristicile care se așteaptă la ascundere. Semnalele care depistează în mod fiabil această clasă sunt structurale, mai degrabă decât bazate pe deghizare: un recensământ al capabilităților (câte primitive distincte de supraveghere a gazdei coexistă într-un singur pachet) și o analiză de tip C2-shape (o buclă comandă/răspuns rutată printr-un serviciu de găzduire de conținut de uz general). Aceste verificări se declanșează indiferent de cât de oneste sau disimulat ambalajul este.
Tendința SaaS-as-C2. Abuzul unui serviciu de găzduire legitim ca metodă de blocare a accesului nu este o noutate, dar continuă să funcționeze deoarece costul defensiv al blocării serviciului este ridicat, iar costul ofensiv al schimbării serviciilor este aproape zero. Așteptați-vă la mai multe astfel de situații. Apărarea rețelei bazată pe domenii specifice defecte se demodează imediat; regulile comportamentale („acest proces citește clipboard-ul și camera web, apoi comunică cu o API de găzduire a notițelor”) nu.
O schiță de detectare a betonului. Regula durabilă nu numește npoint[.]io deloc. Combină două observații care sunt comune individual, dar rare împreună pe un dezvoltator normal sau o gazdă CI:
alertă atunci când un singur proces, în cadrul unei sesiuni, ambele:
(A) accesează o primitivă de supraveghere a gazdei — dispozitiv de intrare (cuplă tastatură/mouse), cameră, microfon, captură de ecran, buclă de citire a clipboard-ului sau un depozit de acreditări de browser ("Login „Date” / „Stare locală” / DPAPI); ȘI
(B) face cereri către un serviciu public de găzduire de conținut / paste / JSON-bin / chat-webhook, apoi le trimite spre examinare, indiferent de serviciul specific din (B).
Niciuna dintre jumătăți nu este suspicioasă singură: o mulțime de capturi de ecran cu instrumente legitime și o mulțime de postări JSON către o API de găzduire. Conjuncția din interiorul unui proces de scurtă durată este semnalul și supraviețuiește oricărei rotații de retransmisie.
Pași practici pentru echipe:
- Tratați instalările de pachete publice pe gazdele dezvoltatorilor și CI ca pe o limită de execuție, nu ca pe o comoditate - un RAT pe un agent de compilare este un RAT cu secretele dvs.
- Preferați oglinzile interne incluse pe lista permisă; un pachet numit literalmente după telecomandă și care descrie un keylogger nu ar trebui să se rezolve niciodată pe un index corporativ.
- Alertă privind combinaţie — captură de ecran sau de dispozitiv de intrare plus trafic de ieșire către un serviciu content/paste/JSON-bin — mai degrabă decât pe o singură primitivă, care are utilizări benigne în mod izolat.
- Nu vă bazați pe un scor automat de „sigur” ca verdict de terminal pentru pachete cu capacitate largă de acces la gazdă; direcționați-le spre revizuire umană.
Familia de pachete a fost clasificată ca fiind malițioasă și trimisă pentru eliminare din registru. Deoarece un C2 bazat pe retransmisie nu lasă nicio gazdă deținută de operator să se confrunte cu un sinkhole, valoarea defensivă durabilă se află în amprenta comportamentală de mai sus, nu în nicio intrare singulară din lista de blocaje.





