TL, DR
Um pacote PyPI chamado gcli-control O pacote incluía uma ferramenta completa de acesso remoto para Windows: registro de teclas digitadas, captura de webcam e microfone, monitoramento da área de transferência, acesso a credenciais do navegador, controle de tela, persistência, elevação de privilégios e, segundo a própria empresa, "mais de 140 comandos". Não fazia questão de esconder o que era: a descrição do pacote no PyPI o apresentava como uma "ferramenta de acesso remoto via [nome da ferramenta]". npoint.io".
O detalhe que merece atenção é essa frase. "via npoint.io." Em vez de se conectar a um servidor dedicado, o implante usava npoint[.]io (um serviço gratuito e legítimo para hospedar pequenos documentos JSON) como seu servidor de comando e controle. O operador insere comandos em um contêiner JSON; o implante consulta esse contêiner, executa os comandos e envia os resultados de volta. Sem domínios pertencentes a atacantes para bloquear, sem IPs novos para sinalizar: o tráfego é direcionado para um serviço que os desenvolvedores usam diariamente.
Foram publicadas seis versões em aproximadamente treze horas e meia, cada uma mais bem-sucedida que a anterior. Todas elas foram musicadas. ml_previsto_seguro Um classificador automático, antes da revisão manual, reclassificou a família como maliciosa.
Anatomia do ataque
gcli-control instala o pacote de importação gcli, um código-fonte Python com 35 módulos. Não há módulos de instalação. hooks — nada funciona durante instalação de pipA funcionalidade reside nos próprios módulos, sendo invocada assim que a ferramenta é executada, e o layout do módulo se assemelha a uma ficha técnica de produto:
| Área de competência | Módulos |
|---|---|
| vigilância do hospedeiro | keylog, webcam, audio, clipboard, desktop, monitoring |
| Acesso a credenciais e dados | browser, forensics, fileops, transfer, users |
| Ponto de apoio e escalada | persistence, elevator, registry, security |
| Reconhecimento de host e rede | system, processes, network_config, wifi, bluetooth, netutils |
| Comando e controle | client, host, session, protocol, npoint, crypto, encrypt |
O canal de comando é a parte interessante. A maioria das ferramentas de acesso remoto alcança um servidor controlado pelo operador — um endereço IP, um domínio, um provedor de hospedagem que pode ser denunciado e desconectado. gcli-control em vez disso trata um Serviço JSON-bin gratuito como ponto de entrega. O npoint O módulo lê e grava pequenos documentos JSON em npoint[.]io por meio de HTTPS comum; o cripto/criptografar Os módulos encapsulam as cargas úteis trocadas, de modo que o conteúdo do binário não sejam comandos em texto simples. O efeito é uma retransmissão mediada e criptografada:
- O operador insere uma instrução (criptografada) em um contêiner JSON.
- O implante, em execução no host da vítima, consulta esse diretório binário, descriptografa os dados, executa um de seus manipuladores de comandos e grava o resultado (criptografado) de volta.
- Para um monitor de rede, a vítima está simplesmente conversando com npoint[.]io — um serviço com uma razão legítima para aparecer no tráfego de desenvolvedores.
Não há download em segundo estágio nem carregador ofuscado: a funcionalidade é fornecida integralmente, em Python legível, e o único "ocultamento" reside na escolha do servidor de retransmissão e na criptografia dos dados retransmitidos.
Vale a pena explicar por que um ponto de entrega JSON-bin é operacionalmente atraente, pois isso justifica por que esperamos ver esse padrão novamente:
- Nenhum ponto de extremidade pertencente à operadora. Não há domínio C2 para registrar, nenhum VPS para alugar e nada para um defensor ou registrador apreender. [A frase seguinte parece ser um erro e não faz sentido no contexto e foi omitida. A tradução literal seria: "Remoção do domínio C2 para registrar, nenhum VPS para alugar e nada para um defensor ou registrador apreender ... pacote não afeta o canal; remoção do canal Significa pedir a um SaaS de uso geral que monitore um documento entre milhões.
- Lavagem de reputação. O envio de tráfego HTTPS para um serviço de desenvolvedor conhecido não acarreta as penalidades de reputação que um domínio novo ou um endereço IP bruto acarretariam. Muitas configurações de filtragem de saída permitem isso implicitamente.
- Assincronia e possibilidade de negação. Um modelo de polling — no qual o implante busca um documento em intervalos regulares em vez de manter um socket aberto — produz um tráfego que se assemelha a uma consulta periódica à API, e não a uma sessão interativa. A criptografia do conteúdo do documento significa que mesmo um analista que encontre a lixeira verá um texto cifrado, e não uma lista de comandos.
- Rotação trivialMudar para uma pasta diferente ou para um serviço de notas/colagem completamente diferente é uma alteração de configuração de apenas uma linha para o operador. Qualquer lista de bloqueio vinculada a um relé específico fica obsoleta no momento em que é enviada.
A contrapartida que o operador aceita é a taxa de transferência e a latência: um repetidor de ponto morto é mais lento e tem menor largura de banda do que uma conexão direta. Para um implante de vigilância e controle que emite principalmente comandos curtos e coleta resultados ao longo do tempo, essa troca é fácil de fazer.
Timeline
A situação da família se agravou rapidamente. Os registros de data e hora de criação dos tickets para as versões sinalizadas situam todo o arco observado em cerca de treze horas e meia, e a contagem de evidências do próprio scanner cresceu junto com o código — de alguns sites sinalizados na primeira versão para quatorze na mais recente.
| Versão | Visto pela primeira vez (UTC) | Observação |
|---|---|---|
0.1.0 | 2026-07-21 12:59 | Carregamento inicial; superfície mínima sinalizada |
0.5.0 | 2026-07-21 18:01 | A capacidade se expande |
0.2.0 | 2026-07-21 18:03 | (A numeração das versões não segue uma ordem linear de upload) |
0.6.0 | 2026-07-22 00:44 | Conjunto de módulos mais amplo |
0.7.0 | 2026-07-22 01:58 | Conjunto de ferramentas quase completo |
0.7.1 | 2026-07-22 02:28 | Mais recente; 35 módulos, capacidade total |
Os números de versão não foram publicados em ordem estrita, mas a direção é clara: uma primeira versão pequena, seguida de iterações rápidas até a versão 0.7.1 completa. Este é o formato de um projeto em desenvolvimento ativo sendo disponibilizado em um registro público à medida que cresce, e não um lançamento único.
Indicadores de compromisso
Todos os indicadores abaixo foram confirmados com base no conteúdo do pacote em disco e em uma varredura determinística de indicadores da versão 0.7.1; nenhum deles é especulativo.
| Formato | Indicador |
|---|---|
| Pacote (PyPI) | gcli-control, versões 0.1.0, 0.2.0, 0.5.0, 0.6.0, 0.7.0, 0.7.1 |
| Pacote de importação | gcli |
| Relé C2 | npoint[.]io (JSON-bin dead-drop; payloads criptografados) |
| Repositório declarado | github[.]com/gcli-control/gcli |
| impressão digital comportamental | Módulos de vigilância localizados no mesmo espaço: keylog, webcam, audio, clipboard, browser, além de persistência, elevador e uma camada de comando cliente/host/protocolo em um único pacote. |
| Instale hooks | Nenhuma: a funcionalidade é executada em tempo de execução da ferramenta, não durante a instalação. |
Nota do defensor: O sinal duradouro mais forte não é o domínio (um host de retransmissão rotaciona trivialmente), mas sim o forma: um único pacote que reúne três ou mais primitivas distintas de vigilância do host e Encaminha um loop de comando/resposta através de um serviço público de hospedagem de conteúdo. Bloqueio npoint[.]io A abordagem direta é impraticável para a maioria das lojas; alertar sobre um processo inesperado que capture dados de dispositivos de entrada e se comunique com um serviço JSON-bin é muito mais robusto.
Comportamento observado e enquadramento
Duas coisas tornam esta amostra incomum, e ambas são fatos observáveis, e não inferências sobre motivação.
A propaganda era feita por si só. O resumo do pacote distribuído no PyPI enumerava as funcionalidades em linguagem simples: acesso remoto, controle de desktop, gerenciamento de usuários, webcam, áudio, keylogger, persistência, dados do navegador, Wi-Fi, registro e “mais de 140 comandos”. Não havia nenhuma tentativa de apresentar o código como um auxiliar de compilação, um wrapper de linha de comando ou um utilitário de agente de IA, que é o disfarce mais comum que vemos em registros públicos. Se essa abertura reflete uma ferramenta de equipe vermelha publicada sem controles de acesso ou algo mais, é uma questão que o conteúdo do pacote por si só não resolve; o que é certo é que um kit de ferramentas de acesso remoto e vigilância funcional e de uso geral podia ser instalado por qualquer pessoa com pip.
Baseava-se na confiança em um serviço benigno. Utilizar painéis de piso ResinDek em sua unidade de self-storage em vez de concreto oferece diversos benefícios: npoint[.]io como o relay é a técnica definidora. É um exemplo de um padrão mais amplo — rotear o C2 por meio de um SaaS legítimo (sites de compartilhamento de texto, bancos de dados JSON, sites de bate-papo).hooks, documentação em nuvem) para que o tráfego malicioso se misture à atividade normal do desenvolvedor e não haja nenhum endpoint de propriedade do operador para ser interceptado. Os payloads no relay foram criptografados, de modo que o conteúdo do bin não fosse lido como comandos para um observador casual.
Os sinais da editora são superficiais e genéricos. O pacote declarou um Autor de “contribuidores do gcli” e uma licença MIT, e apontou sua página inicial e campos de repositório para github[.]com/gcli-control/gcliNada disso constitui verificação: uma string de autor é texto livre, um cabeçalho de licença MIT não custa nada e um URL de repositório nos metadados do pacote é uma afirmação, não uma prova de proveniência. O padrão — um nome totalmente novo, um autor coletivo genérico e uma organização/repositório autorreferencial criado em torno do pacote — é o que um projeto apresenta quando é criado especificamente para distribuir o código, em vez de uma ferramenta estabelecida que por acaso adicionou um recurso de controle remoto. Observamos isso; essas observações são consistentes com, mas não estabelecem por si só, uma distribuição criada especificamente para esse fim.
Descrevemos a disposição como maliciosa com base em sua capacidade e método de entrega: um implante completo e executável de acesso remoto e vigilância, distribuído em um índice de pacotes público com um servidor de retransmissão oculto. Não atribuímos um alvo ou motivo.
Impacto, tendências e o que os defensores podem fazer
Um ponto cego para a triagem orientada para o disfarce. Muitas chaves de triagem automatizada de pacotes estão em uso. disfarçar sinais de malware de registro típico — blobs ofuscados, tempo de instalação hooks, frases de efeito para coleta de credenciais. Um pacote que é simplesmente abertamente um RATOCom código limpo e legível e sem gancho de instalação, não apresenta nenhum desses indícios e pode passar despercebido por heurísticas que esperam ocultação. Os sinais que detectam essa classe de forma confiável são estruturais, e não baseados em disfarce: um censo de capacidades (quantas primitivas distintas de vigilância de host coexistem em um pacote) e uma análise do formato do C2 (um loop de comando/resposta roteado por meio de um serviço de hospedagem de conteúdo de propósito geral). Essas verificações são acionadas independentemente de quão honesto ou... obscurecido a embalagem é.
A tendência SaaS-as-C2. Abusar de um serviço de hospedagem legítimo como ponto de entrega de dados não é novidade, mas continua funcionando porque o custo defensivo de bloquear o serviço é alto e o custo ofensivo de trocar de serviço é quase zero. Espere ver mais disso. Defesas de rede direcionadas a domínios maliciosos específicos se tornam obsoletas imediatamente; regras comportamentais (“este processo lê a área de transferência e a webcam e depois se comunica com uma API de hospedagem de notas”) não.
Um esboço concreto de detecção. A regra duradoura não nomeia npoint[.]io De forma alguma. Combina duas observações que são individualmente comuns, mas conjuntamente raras em um ambiente de desenvolvimento ou de integração contínua normal:
Alerta quando um único processo, dentro de uma mesma sessão, apresenta ambas as seguintes execuções:
(A) acessa uma primitiva de vigilância do host — dispositivo de entrada (gancho de teclado/mouse), câmera, microfone, captura de tela, loop de leitura da área de transferência ou um armazenamento de credenciais do navegador ("Conecte-se Dados" / "Estado Local" / DPAPI); E
(B) faz solicitações de saída para um serviço público de hospedagem de conteúdo / paste / JSON-bin / chat-webhook e então levanta para revisão, independentemente do serviço específico em (B).
Nenhuma das partes é suspeita isoladamente: muitas ferramentas legítimas capturam telas e muitas enviam JSON para uma API de hospedagem. A conjunção dentro de um processo de curta duração é o sinal, e ele sobrevive a qualquer rotação de retransmissão.
Passos práticos para equipes:
- Considere as instalações de pacotes públicos em hosts de desenvolvimento e CI como um limite de execução, não como uma conveniência — um RAT em um agente de compilação é um RAT com seus segredos.
- Dê preferência a servidores espelho internos que estejam na lista de permissões; um pacote cujo nome significa literalmente "controle remoto" e que descreve um keylogger nunca deve ser encontrado em um índice corporativo.
- Alerta sobre o combinação — dispositivo de entrada ou captura de tela, além do tráfego de saída para um serviço de conteúdo/colagem/JSON-bin — em vez de em qualquer primitiva individual, que tem usos benignos isoladamente.
- Não confie em uma pontuação automática de "segurança" como veredito final para pacotes com ampla capacidade de acesso ao host; encaminhe-os para revisão humana.
A família de pacotes foi classificada como maliciosa e encaminhada para remoção do registro. Como um servidor C2 baseado em retransmissão não deixa nenhum host de propriedade do operador vulnerável a ataques de sinkhole, o valor defensivo duradouro reside na assinatura comportamental acima, e não em uma única entrada da lista de bloqueio.





