"Um ninja sábio não procura um inimigo que ele não entende completamente." - Splinter de Teenage Mutant Ninja Turtles
Como um escritor técnico apaixonado por ficção científica, uma das partes mais emocionantes do meu trabalho na Sonatype é quando tenho a oportunidade de colaborar com a equipe de pesquisa de segurança.
Desde que encontramos
Não é uma ocorrência rara: eles avaliam constantemente centenas de pacotes suspeitos de registros de código aberto para determinar se são realmente maliciosos. Durante esse procedimento, eles identificam padrões familiares entre os pacotes e, às vezes, ao reconhecerem fortes semelhanças, realizam pesquisas adicionais para rastrear o ator/campanha por trás deles.
Entre a última semana de 2022 e o início de 2023, nosso sistema de IA sinalizou pacotes suspeitos carregados no registro PyPI, incluindo pyrologin
, easytimestamp
, discorder
, discord-dev
, style.py
e pythonstyles
. Nossos pesquisadores de segurança olharam para eles e confirmaram que eram realmente maliciosos. E após uma análise mais aprofundada, eles notaram que esses pacotes adicionavam uma série de recursos que não são vistos com frequência no malware Python.
No que se tornou uma estratégia de fato, os agentes mal-intencionados ocultam uma carga útil no arquivo setup[.]py
, de modo que os desenvolvedores só precisam usar uma simples instalação de pip para serem infectados. Nesse caso, eles lançariam inadvertidamente um script do PowerShell que baixa um arquivo ZIP para instalar bibliotecas que permitem ao invasor controlar o mouse e o teclado da vítima, fazer capturas de tela e criar conexões remotas ocultas. Além disso, esses pacotes também exfiltram informações confidenciais como senhas, cookies e dados da carteira de criptomoedas e até tentam instalar uma ferramenta para acesso remoto. Nossos achados estiveram de acordo com
No entanto, o pesquisador de segurança Carlos Fernandez estava tendo uma sensação assombrosa de déjà vu. Durante a semana após a divulgação dos pacotes, lembranças de ter visto versões anteriores desse malware passaram por sua mente. Um agente de ameaça pode ter desenvolvido seu malware ao longo do tempo, mas precisávamos ter certeza, então coloquei meu chapéu OSINT para ajudá-lo a ver se havia alguma verdade em sua intuição.
Olhando para trás em nosso banco de dados, em 25 de setembro de 2022, um pacote chamado pygradient
foi carregado no repositório PyPI. Nossa IA o sinalizou como suspeito e nossos pesquisadores de segurança confirmaram que continha malware e que agrupava as fontes de outro pacote chamado pystyle
. Ambas as bibliotecas são de autoria de
O ladrão W4SP possui persistência (ele é reativado toda vez que os usuários reiniciam o PC), ofuscação (o autor promete que é totalmente indetectável) e técnicas de esteganografia para ocultar cargas polimórficas e altamente ofuscadas em um arquivo de imagem. O malware envia todas as contas Discord, cartões de crédito, senhas e carteiras criptográficas da vítima de volta ao invasor por meio de um endereço de webhook Discord codificado. Os malfeitores interessados neste malware o compraram pagando cerca de 20 USD em criptografia.
Originalmente, o pystyle
não tinha uma natureza maliciosa - um pacote inofensivo para estilizar e colorir a saída do console para melhorar a legibilidade e a experiência do usuário. Mas, de acordo com a pesquisa da Phylum, uma vez que se tornou popular (o pacote ainda está ativo no PyPI e acumula mais de 40.000 downloads todos os meses), eles decidiram adicionar o malware W4SP em alguns lançamentos.
Pacotes de código aberto como pystyle
podem atuar como agentes adormecidos por meses, apenas para serem ativados posteriormente por seu próprio autor para fins maliciosos. Uma jogada arriscada, já que seu pacote popular pode ser descoberto por pesquisadores de segurança como nós, que o denunciarão como malicioso e o removerão para sempre. É por isso que eles geralmente criam novos pacotes onde incluem o código-fonte de uma biblioteca inócua, adicionam algum tipo de carga maliciosa e a carregam com um novo nome: algo genérico, de aparência benigna e aparência inocente. Um nome como pygradient
.
Depois de dar uma olhada mais de perto com Carlos, descobrimos que esse malware proto-RAT mutante carecia de alguns dos recursos das versões de dezembro: embora também lançasse um script do PowerShell e exfiltrasse dados confidenciais, ele não usava cargas codificadas em base64 ou uma lista de permissões txt para evitar a auto-infecção. De certa forma, era uma variante mais suave e menos sofisticada.
Mas então analisamos os pacotes carregados no início de novembro, incluindo paintpy
, devicespoof
e devicespoofer
, e depois de nos aprofundarmos, encontramos a confirmação de nossa suspeita: o malware estava realmente evoluindo.
Embora BillyTheGoat não esteja ativo no GitHub desde novembro, ainda encontramos malware baseado em suas criações ou roubados diretamente deles, principalmente por um usuário que aparentemente mora em Portugal chamado
Este usuário carregou um pacote recentemente removido no PyPI chamado pystilez
, falsamente creditado a BillyTheGoat no que parecia
Checkmarxapicolor
(junto com variações com nomes semelhantes) que incluía um link de servidor Discord em seu código malicioso. O perfil do administrador vinculado a uma conta Steam verificada e o nome “zeeckt” apareceu como um dos apelidos do Steam do invasor.
Um pesquisador de segurança postou uma das cargas úteis do zeeckt para fins educacionais e recebeu uma resposta interessante do co-autor do ladrão W4SP:
Que irônico para o seu ladrão ser roubado.
O mesmo autor, aparentemente um desenvolvedor Python de 17 anos, reitera sua frustração em um arquivo README em seu perfil do GitHub:
Não sabemos exatamente qual código malicioso zeeckt roubou de outros criminosos, mas uma coisa é certa: esse nome continua a aparecer em campanhas de malware em registros de código aberto.
Carlos recentemente encontrou mais quatro pacotes porforenitq
, forenith
, forenity
e forenitz
. Após uma investigação mais aprofundada, ele os marcou como maliciosos e os denunciou ao PyPI para serem removidos. O caso mais rápido levou cerca de 20 minutos desde a publicação até a exclusão.
Olhando para setup[.]py
em forenitq
, Carlos encontrou o seguinte payload de primeiro estágio:
O invasor cria três arquivos temporários que baixam e executam binários do Windows a partir de URLs específicos usando o comando "start". Mesmo que os slugs /rat
e /clip
sejam sugestivos de intenção maliciosa, não poderíamos confirmar essa suposição sem olhar sob o capô.
No momento da redação deste artigo, a página hospedada em hxxp://20[.]226[.]18[.]203
ainda está ativa e mostra apenas um link para um convite do Discord que já expirou ou é privado.
Carlos notou que a embalagem estava se passando por popular
Depois de desofuscar o arquivo RAT, ele encontrou uma linha que carrega um possível sequestrador de área de transferência, mas as especificidades dela foram codificadas em base64:
Após a decodificação, obtemos um código Python projetado para sequestrar a área de transferência da vítima para substituir o endereço pretendido da carteira de criptomoedas pelo endereço do invasor:
Ele procura padrões específicos como bitcoin (bc1), Ethereum (0x), Monero (4) e l itecoin (L ou M ou 3) e, quando um padrão é encontrado, substitui o endereço pretendido pelo endereço da carteira de criptomoeda do invasor .
O código usa o
Além disso, descobrimos mais técnicas que esse mutante RAT usa para evitar a detecção: uma carga útil de primeiro estágio adicionada ao arquivo forenitq/ansi[.]py
em vez de setup[.]py
e uma carga útil polimórfica de segundo estágio que muda toda vez que você executa o binário.
O atacante também adicionou um novo comando e controle com um menu de ajuda bem completo — e desta vez se fala português:
Como você pode ver, agentes mal-intencionados estão ansiosos para roubar seus fundos criptográficos e credenciais do sistema para penetrar ainda mais em sua infraestrutura. Seu malware RAT continua mudando para ser mais evasivo e prejudicial para os desenvolvedores. Portanto, se você não está protegendo sua cadeia de suprimentos de software hoje, considere agir para fazer isso o mais rápido possível.
hxxp://20[.]226[.]18[.]203/inject/tCxFLYLT6ViY9ZnP
hxxp://20[.]226[.]18[.]203/clip
hxxp://20[.]226[.]18[.]203/rat