TL, RD
Un paquete PyPI chamado control de gcli incluíu unha ferramenta completa de acceso remoto para Windows: rexistro de pulsacións de teclas, captura de cámara web e micrófono, monitorización do portapapeis, acceso a credenciais do navegador, control de pantalla, persistencia, elevación de privilexios e uns "máis de 140 comandos" autoanunciados. Non ocultaba o que era: o propio resumo de PyPI do paquete describíao como unha "Ferramenta de acceso remoto a través de npoint.io".
O detalle no que paga a pena deterse é esa frase "vía npoint.io." En lugar de ter un servidor dedicado, o implante empregado npoint[.]io (un servizo gratuíto e lexítimo para aloxar pequenos documentos JSON) como o seu relé de comando e control. O operador escribe comandos nun bin JSON; o implante sondea ese bin, execútao e escribe os resultados. Non hai dominio propiedade dun atacante para bloquear, nin IP nova para sinalar: o tráfico vai a un servizo que os desenvolvedores usan todos os días.
Publicáronse seis versións en aproximadamente trece horas e media, cada unha máis capaz que a anterior. Todas elas foron puntuadas ml_predicted_seguro por un clasificador automatizado antes de que a revisión manual reclasificase a familia como maliciosa.
Anatomía do ataque
control de gcli instala o paquete de importación gcli, unha base de código Python de 35 módulos. Non hai tempo de instalación hooks — non se executa nada durante instalación de pipA capacidade reside nos propios módulos, invocándose unha vez que a ferramenta se executa, e o deseño do módulo semella unha folla de especificacións do produto:
| Área de capacidade | módulos |
|---|---|
| Vixilancia do hóspede | keylog, webcam, audio, clipboard, desktop, monitoring |
| Acceso a credenciais e datos | browser, forensics, fileops, transfer, users |
| Punto de apoio e escalada | persistence, elevator, registry, security |
| Recoñecemento de host e rede | system, processes, network_config, wifi, bluetooth, netutils |
| Mando e control | client, host, session, protocol, npoint, crypto, encrypt |
A canle de comandos é a parte interesante. A maioría das ferramentas de acceso remoto chegan a un servidor que o operador controla: un enderezo IP, un dominio ou un provedor de aloxamento que se pode informar e desconectar. control de gcli en vez diso trata un servizo JSON-bin gratuíto como punto morto. O npunto o módulo le e escribe pequenos documentos JSON en npoint[.]io sobre HTTPS ordinario; o cripto/cifrar os módulos envolven as cargas intercambiadas para que o contido do bin non sexan comandos de texto plano. O efecto é unha retransmisión cifrada e mediada:
- O operador coloca unha instrución (cifrada) nun bin JSON.
- O implante, que se executa no host vítima, sondea ese bin, descifra, executa un dos seus xestores de comandos e escribe o resultado (cifrado) de volta.
- Para un monitor de rede, a vítima simplemente está falando con npoint[.]io — un servizo cun motivo lexítimo para aparecer no tráfico dos desenvolvedores.
Aquí non hai unha descarga de segunda etapa nin un cargador ofuscado: a capacidade inclúese completa, en Python lexible, e o único "oculto" é a escolla da retransmisión e o cifrado das cargas útiles retransmitidas.
Vale a pena explicar por que un dead-drop de JSON-bin é operacionalmente atractivo, porque explica por que esperamos ver o patrón de novo:
- Sen punto final propiedade do operador. Non hai ningún dominio C2 para rexistrar, ningún VPS para alugar e nada que un defensor ou rexistrador poida confiscar. Retirada do paquete non toca a canle; retirada do canle significa pedirlle a un SaaS de propósito xeral que supervise un documento entre millóns.
- Branqueo de reputación. O HTTPS de saída a un servizo de desenvolvedor coñecido non supón ningunha das penalizacións de reputación que tería un dominio novo ou un enderezo IP sen procesar. Moitas configuracións de filtrado de saída permíteno implicitamente.
- Asincronía e negación. Un modelo de sondaxe (o implante recupera un documento nun intervalo en lugar de manter un socket aberto) produce tráfico que semella unha sondaxe periódica da API, non unha sesión interactiva. O cifrado do contido do documento significa que mesmo un analista que atopa o bin ve texto cifrado, non unha lista de comandos.
- Rotación trivialMover a unha caixa diferente ou a un servizo de notas/pegado completamente diferente supón un cambio de configuración dunha soa liña para o operador. Calquera lista de bloqueos asociada ao relé específico queda obsoleta no momento en que se envía.
A contrapartida que acepta o operador é o rendemento e a latencia: un relé de punto morto é máis lento e ten un ancho de banda menor que unha conexión directa. Para un implante de vixilancia e control que emite principalmente comandos curtos e recompila resultados ao longo do tempo, esa contrapartida é fácil de facer.
Timeline
A familia escalaba rapidamente. As marcas de tempo de creación de tíckets para as versións sinalizadas sitúan todo o arco observado dentro dunhas trece horas e media, e o reconto de evidencias do propio escáner creceu xunto co código, desde un par de sitios sinalizados na primeira versión ata catorce na última.
| versión | Visto por primeira vez (UTC) | Nota |
|---|---|---|
0.1.0 | 2026-07-21 12:59 | Carga inicial; superficie mínima sinalizada |
0.5.0 | 2026-07-21 18:01 | A capacidade expándese |
0.2.0 | 2026-07-21 18:03 | (numeración de versións non monótona coa orde de subida) |
0.6.0 | 2026-07-22 00:44 | Conxunto de módulos máis amplo |
0.7.0 | 2026-07-22 01:58 | Kit de ferramentas case completo |
0.7.1 | 2026-07-22 02:28 | Último; 35 módulos, capacidade completa |
Os números de versión non se publicaron en orde estrita, pero a dirección é clara: un primeiro corte pequeno e, a continuación, unha rápida iteración cara á versión 0.7.1 con todas as funcións. Esta é a forma dun proxecto en desenvolvemento activo que se vai enviando a un rexistro público a medida que medra, non un lanzamento puntual.
Indicadores de compromiso
Todos os indicadores seguintes confirmáronse co contido do paquete no disco e unha análise determinista de indicadores da versión 0.7.1; ningún é especulativo.
| tipo | Indicador |
|---|---|
| Paquete (PyPI) | gcli-control, versións 0.1.0, 0.2.0, 0.5.0, 0.6.0, 0.7.0, 0.7.1 |
| Importar paquete | gcli |
| Relé C2 | npoint[.]io (JSON-bin dead-drop; cargas útiles cifradas) |
| Repositorio declarado | github[.]com/gcli-control/gcli |
| Pegada dixital do comportamento | Módulos de vixilancia colocalizados: keylog, webcam, audio, clipboard, browser, ademais de persistencia, elevador e unha capa de comandos cliente/host/protocolo nun só paquete |
| Instalar hooks | Ningunha: a capacidade execútase no tempo de execución da ferramenta, non durante a instalación |
Nota do defensor: o sinal máis forte e duradeiro non é o dominio (un servidor de retransmisión rota trivialmente) senón o adaptala: un único paquete que agrupa tres ou máis primitivas de vixilancia do host distintas enruta un bucle de comandos/resposta a través dun servizo público de aloxamento de contidos. Bloqueo npoint[.]io Ao principio, non é práctico para a maioría das tendas; alertar sobre un proceso inesperado que captura dispositivos de entrada e se comunica cun servizo JSON-bin é moito máis robusto.
Comportamento observado e enmarcamento
Dúas cousas fan que esta mostra sexa inusual, e ambas son feitos observables en lugar de inferencias sobre o motivo.
Anunciábase a si mesmo. O resumo do paquete distribuído en PyPI enumeraba as capacidades en linguaxe sinxela: acceso remoto, control de escritorio, xestión de usuarios, cámara web, audio, rexistrador de teclas, persistencia, datos do navegador, WiFi, rexistro, "máis de 140 comandos". Non houbo ningún intento de facer pasar o código como un axudante de compilación, un encapsulador CLI ou unha utilidade de axente de IA, que é o disfrace máis común que vemos nos rexistros públicos. Se esa apertura reflicte unha ferramenta red-team publicada sen controis de acceso ou outra cousa é unha cuestión que o contido do paquete por si só non resolve; o que si é certo é que calquera persoa podía instalar un kit de ferramentas de acceso remoto e vixilancia de propósito xeral que funcionase con... PIP.
Baseouse na confianza nun servizo benigno. Uso npoint[.]io xa que o relé é a técnica definitoria. É un exemplo dun patrón máis amplo: enrutar C2 a través dun SaaS lexítimo (sitios de pegado, caixas JSON, chat webhooks, documentos na nube) para que o tráfico malicioso se mesture coa actividade normal do desenvolvedor e non haxa ningún punto final propiedade do operador para capturar. As cargas útiles do relé estaban cifradas, polo que o contido do bin non se lería como comandos para un observador casual.
Os sinais do editor son escasos e xenéricos. O paquete declarou un autor de "colaboradores de gcli" e unha licenza MIT, e apuntaba á súa páxina de inicio e aos campos do repositorio a github[.]com/gcli-control/gcli. Nada diso é verificación: unha cadea de autor é texto libre, unha cabeceira de licenza MIT non custa nada e un URL de repositorio nos metadatos do paquete é unha afirmación, non unha proba de procedencia. O patrón (un nome novo, un autor colectivo xenérico e unha organización/repositorio autorreferencial creado arredor do paquete) é o aspecto dun proxecto cando se crea especificamente para levar o código, en lugar dunha ferramenta establecida que casualmente desenvolveu unha función de control remoto. Anotámolo como observacións; son coherentes cunha distribución deseñada para un propósito, pero non a establecen por si mesmas.
Describimos a disposición como maliciosa en función da capacidade e da entrega: un implante completo e executable de acceso remoto e vixilancia, distribuído nun índice de paquetes público cun retransmisor encuberto. Non atribuímos un obxectivo nin un motivo.
Impacto, tendencias e o que poden facer os defensores
Un punto cego para a triaxe orientada ao disfrace. Moitas claves automatizadas de triaxe de paquetes no disfrazar sinais de malware típico do rexistro — manchas ofuscadas, tempo de instalación hooks, frases ingeniosas sobre a recollida de credenciais. Un paquete que é simplemente abertamente unha RAT, con código limpo e lexible e sen gancho de instalación, non presenta ningún deses indicadores e pode pasar por alto as heurísticas que esperan ocultación. Os sinais que detectan de forma fiable esta clase son estruturais en lugar de baseados no disfrace: un censo de capacidades (cantas primitivas de vixilancia do host distintas coexisten nun paquete) e unha análise de forma C2 (un bucle de comandos/resposta enrutado a través dun servizo de aloxamento de contidos de propósito xeral). Esas comprobacións execútanse independentemente de como de honestas ou ofuscado a embalaxe é.
A tendencia SaaS como C2. Abuso dun servizo de aloxamento lexítimo como punto morto non é novo, pero segue funcionando porque o custo defensivo de bloquear o servizo é alto e o custo ofensivo de cambiar de servizo é próximo a cero. Agarda máis. As defensas de rede relacionadas con dominios malos específicos caducan inmediatamente; as regras de comportamento ("este proceso le o portapapeis e a cámara web e despois fala cunha API de aloxamento de notas") non.
Un esbozo de detección de formigón. A regra duradeira non nomea npoint[.]io en absoluto. Combina dúas observacións que son comúns individualmente pero conxuntamente raras nun desenvolvedor normal ou servidor de CI:
alerta cando un único proceso, dentro dunha sesión, ambos:
(A) accede a unha primitiva de vixilancia do servidor: dispositivo de entrada (gancho de teclado/rato), cámara, micrófono, captura de pantalla, bucle de lectura do portapapeis ou un almacén de credenciais do navegador ("Login "Datos" / "Estado local" / DPAPI); E
(B) realiza solicitudes de saída a un servizo público de aloxamento de contidos / pegado / JSON-bin / chat-webhook e logo elévaas para a súa revisión, independentemente do servizo específico en (B).
Ningunha das dúas metades sospeita por si soa: moitas capturas de pantalla de ferramentas lexítimas e moitas publicacións JSON nunha API de aloxamento. A conxunción dentro dun proceso de curta duración é o sinal e sobrevive a calquera rotación de retransmisión.
Pasos prácticos para equipos:
- Trata as instalacións de paquetes públicos nos hosts de desenvolvedores e CI como un límite de execución, non como unha comodidade: un RAT nun axente de compilación é un RAT cos teus segredos.
- Preferir espellos internos na lista de permitidos; un paquete chamado literalmente polo control remoto e que describe un rexistrador de teclas nunca debería resolverse nun índice corporativo.
- Alerta sobre o combinación — captura de dispositivo de entrada ou de pantalla máis o tráfico de saída a un servizo de contido/pegado/JSON-bin — en lugar de facelo nunha única primitiva, que ten usos benignos de forma illada.
- Non confíes nunha puntuación de "seguro" automatizada como veredicto de terminal para paquetes con ampla capacidade de acceso do host; envíaos a revisión humana.
A familia de paquetes foi clasificada como maliciosa e remitida para a súa eliminación no rexistro. Dado que un C2 baseado en retransmisións non deixa ningún host propiedade do operador cara a un sumidoiro, o valor defensivo duradeiro está na pegada dixital do comportamento anterior, non en ningunha entrada individual da lista de bloqueo.





