Pacotes falsos de corretor ortográfico no PyPI entregavam RAT em Python

Pacotes falsos de corretor ortográfico no PyPI entregavam RAT em Python

Os pacotes spellcheckerpy e spellcheckpy se passavam por ferramentas de verificação ortográfica, ocultavam um downloader em um dicionário basco e passaram a executar uma carga RAT na versão spellcheckpy 1.2.0.

ComponentePacotes Python spellcheckerpy e spellcheckpy publicados no PyPI como falsos corretores ortográficos.
VetorCarga Base64 escondida em resources/eu.json.gz, acionada por lógica de extração associada à função test_file e, em spellcheckpy 1.2.0, executada ao importar SpellChecker.
ImpactoInstalação de um downloader capaz de buscar um RAT em Python, identificar o host comprometido, interpretar comandos recebidos e executá-los.
PrioridadeRemover os pacotes de ambientes Python, auditar dependências instaladas e procurar comunicação com updatenet[.]work e 172.86.73[.]139.
VersõesAs três primeiras versões continham o payload e o gatilho ausente; spellcheckpy 1.2.0, publicada em 21 de janeiro de 2026, adicionou execução obfuscada.
ArtefatosArquivo resources/eu.json.gz, chave spellchecker, domínio defangado updatenet[.]work e IP defangado 172.86.73[.]139.
Resumo técnico

Dois pacotes maliciosos publicados no Python Package Index foram identificados como falsos corretores ortográficos. Os nomes usados foram spellcheckerpy e spellcheckpy, ambos já removidos do repositório, mas apenas depois de acumularem pouco mais de 1.000 downloads em conjunto. A escolha do tema não foi aleatória: ferramentas de correção ortográfica são dependências plausíveis em automações, aplicações de texto, pipelines de validação e projetos que processam conteúdo de usuário, o que reduz a suspeita durante uma revisão superficial do pacote.

A técnica principal consistiu em ocultar a carga dentro de um arquivo que parecia pertencer a recursos linguísticos legítimos. Em vez de concentrar a lógica maliciosa em __init__.py, padrão mais comum em pacotes Python abusivos, o operador inseriu um payload codificado em Base64 dentro de resources/eu.json.gz, arquivo descrito como contendo frequências de palavras em basco derivadas do pacote legítimo pyspellchecker. Essa escolha desloca o foco da inspeção para um recurso compactado de dados, menos revisado do que código executável direto.

A campanha teve uma etapa de preparação. As três primeiras versões carregavam e decodificavam a carga, mas não a executavam. A mudança operacional ocorreu com spellcheckpy 1.2.0, publicada em 21 de janeiro de 2026, quando foi acrescentado um gatilho obfuscado que executava o payload durante a importação de SpellChecker. Esse padrão indica uma estratégia de reduzir ruído nas versões iniciais e ativar a capacidade maliciosa depois que o pacote já tinha presença no ecossistema.

Fluxo técnico

A cadeia começa quando o pacote é instalado e seu conteúdo aparenta fornecer funcionalidade de spellchecking. O arquivo resources/eu.json.gz funciona como esconderijo para um downloader codificado. O comportamento malicioso é associado à extração do arquivo por meio da função test_file, com parâmetros ligados ao idioma eu, codificação utf-8 e à chave spellchecker. Ao processar esse conteúdo, a lógica localiza uma entrada chamada spellchecker, recupera o material codificado e prepara a primeira etapa da cadeia.

Nas versões iniciais, essa etapa apenas buscava e decodificava o payload sem executar a carga, o que limita sinais comportamentais em sandboxes que não analisam a evolução entre versões. Em spellcheckpy 1.2.0, o operador adicionou execução obfuscada acionada no momento em que SpellChecker` era importado. Esse detalhe é relevante porque a importação de uma classe é uma ação esperada por aplicações legítimas, testes unitários e ferramentas de linting, permitindo que a execução ocorra sem uma chamada explícita suspeita no código da aplicação consumidora.

A primeira etapa atua como downloader para obter um RAT em Python a partir do domínio defangado updatenet[.]work. A carga remota é descrita como capaz de coletar características do host comprometido, interpretar comandos recebidos e executá-los. O domínio foi registrado no fim de outubro de 2025 e aparece associado ao IP defangado 172.86.73[.]139, gerenciado pela RouterHosting LLC, também conhecida como Cloudzy. Esse dado sustenta hunting de infraestrutura, mas não deve ser tratado isoladamente como atribuição definitiva do operador.

Há um histórico próximo no mesmo tema. Em novembro de 2025, outro pacote chamado spellcheckers foi observado com capacidade de recuperar e executar um RAT, e há suspeita de relação entre os dois conjuntos de ataques. A semelhança está no abuso de pacotes Python com aparência de ferramenta ortográfica, no uso de download de carga remota e na tentativa de se misturar a dependências aparentemente úteis.

Superfície afetada

A superfície exposta envolve ambientes que instalaram spellcheckerpy ou spellcheckpy a partir do PyPI antes da remoção. O risco alcança estáções de desenvolvimento, ambientes virtuais Python, imagens de contêiner, jobs de integração contínua, notebooks, pipelines de teste e aplicações que importaram SpellChecker. Como a execução maliciosa foi vinculada à importação, um projeto afetado não precisa necessariamente chamar uma função de rede suspeita; a inicialização de código Python pode ser suficiente para disparar a cadeia na versão ativada.

A exposição também alcança caches e artefatos de build. Mesmo após a remoção do pacote do PyPI, cópias podem permanecer em mirrors internos, diretórios de cache de instaladores, imagens base, lockfiles, artefatos de CI/CD e ambientes de desenvolvimento recriados a partir de dependências antigas. Em supply chain Python, a contenção não termina com a indisponibilidade pública do pacote: é necessário validar onde ele foi baixado, empacotado e reutilizado.

O caso se conecta a um padrão mais amplo de abuso de ecossistemas de pacotes. O mesmo conjunto de observações inclui pacotes npm voltados a spear phishing contra funcionários de empresas industriais e de energia em França, Alemanha, Espanha, Emirados Árabes Unidos e Estados Unidos, além de um pacote que se passava por biblioteca de interface e implantava o stealer G_Wagon. Também há o risco de slopsquatting, em que agentes de IA citam pacotes inexistentes que podem ser posteriormente registrados por operadores maliciosos.

  • Ambientes Python que instalaram spellcheckerpy ou spellcheckpy antes da remoção do PyPI.
  • Projetos que importaram SpellChecker, especialmente com spellcheckpy 1.2.0.
  • Caches de dependências, imagens de contêiner, lockfiles e mirrors internos contendo os pacotes removidos.
  • Telemetria de rede com consultas ou conexões para updatenet[.]work ou 172.86.73[.]139.
Hunting e telemetria

A investigação deve começar por inventário de dependências. Equipes devem procurar referências a spellcheckerpy, spellcheckpy e spellcheckers em arquivos de requisitos, lockfiles, manifests de ambiente, histórico de builds, imagens de contêiner e caches de pacotes. A presença do arquivo resources/eu.json.gz dentro de artefatos Python suspeitos merece inspeção, principalmente quando ele contém uma chave spellchecker com conteúdo codificado que não se comporta como dicionário comum.

No endpoint, sinais úteis incluem execução de Python associada a processos de build ou aplicação que iniciam comunicação externa inesperada, importações de SpellChecker seguidas por atividade de rede, criação de processos filhos a partir do interpretador Python e comportamento de fingerprinting do host. Como a primeira etapa busca uma carga remota, a ausência de arquivo final no disco não elimina o risco; o ambiente pode ter executado apenas o downloader ou falhado ao alcançar a infraestrutura externa.

Na rede, a prioridade é revisar DNS, proxy, EDR e logs de firewall para o domínio updatenet[.]work e o IP 172.86.73[.]139, ambos defangados aqui para evitar links ativos. A análise deve considerar janelas temporais posteriores à instalação dos pacotes e, em especial, depois de 21 de janeiro de 2026, data da versão que passou a executar a carga. Em ambientes com inspeção TLS ou registros de proxy, conexões originadas de hosts de desenvolvimento e runners de CI merecem atenção especial.

  • Referências a spellcheckerpy, spellcheckpy ou spellcheckers em manifests, lockfiles e caches de pacotes.
  • Presença de resources/eu.json.gz com chave spellchecker e conteúdo Base64 incomum.
  • Processos Python iniciando comunicação externa após importação de SpellChecker.
  • Consultas DNS, conexões proxy ou alertas EDR envolvendo updatenet[.]work e 172.86.73[.]139.
Mitigação

A resposta deve remover imediatamente os pacotes afetados de ambientes ativos e bloquear sua reintrodução em políticas de dependência. Projetos que usaram spellcheckerpy ou spellcheckpy precisam ser reconstruídos a partir de dependências confiáveis, com limpeza de caches locais e de CI/CD. Imagens de contêiner produzidas durante o período de exposição devem ser tratadas como potencialmente contaminadas até que a lista de pacotes e os artefatos internos sejam validados.

Depois da remoção, a investigação deve verificar se houve execução do downloader e se a comunicação com a infraestrutura externa ocorreu. Caso haja evidência de contato com updatenet[.]work ou 172.86.73[.]139, o host deve ser isolado para análise, porque a carga descrita possui capacidade de execução de comandos. A contenção deve incluir revisão de variáveis de ambiente, segredos acessíveis ao processo Python, credenciais de cloud, tokens de repositório, chaves de CI/CD e permissões associadas ao ambiente comprometido.

Para reduzir recorrência, equipes devem exigir pinagem de versões, revisão de novas dependências, bloqueio de pacotes removidos, verificação de arquivos compactados dentro de bibliotecas e monitoramento de mudanças entre versões. O caso mostra que versões dormentes podem preparar o terreno antes da ativação; por isso, a aprovação de um pacote não deve se basear apenas em uma versão inicial aparentemente inofensiva. Dependências sugeridas por agentes de IA, documentação copiada ou arquivos de habilidade em Markdown e YAML também precisam ser verificadas contra registros reais antes de entrarem em pipelines.

  • Remover spellcheckerpy, spellcheckpy e artefatos relacionados de ambientes, caches e imagens.
  • Bloquear o domínio updatenet[.]work e revisar eventos envolvendo 172.86.73[.]139.
  • Recriar ambientes afetados a partir de dependências validadas e revisar segredos acessíveis ao Python.
  • Adicionar controle de aprovação para novas dependências e verificação de pacotes sugeridos por automação ou IA.

Postar um comentário

0 Comentários