Vírus que se multiplica sozinho utiliza blockchain para evitar detecções

ubuntu (24).png

Pesquisadores de segurança detectaram uma onda de pacotes maliciosos sendo publicados no npm, o maior repositório de bibliotecas JavaScript do mundo. Em menos de uma hora, o grupo criminoso TeamPCP havia comprometido 46 pacotes usados por desenvolvedores ao redor do mundo, 28 deles em menos de 60 segundos.

Os criminosos fizeram isso injetando um malware capaz de instalar uma backdoor persistente em qualquer máquina Linux que executasse a instalação. O ataque, batizado de CanisterWorm, estreou uma técnica inédita. Ele usa um canister na blockchain ICP como servidor de controle, tornando a infraestrutura do malware imune a bloqueios e derrubadas.

A ICP é uma blockchain descentralizada que não pode ser derrubada por autoridades ou bloqueada por provedores de internet.

O endereço do canister ICP aparece hardcoded na linha C_URL. A cada 50 minutos, o script contata esse endereço para receber a URL do payload mais recente — sem que o malware instalado na máquina precise ser alterado. Imagem: Aikido.

O que foi comprometido

Os 28 pacotes do escopo @EmilGroup foram os primeiros a ser infectados, seguidos de 16 pacotes do @opengov e outros três pacotes individuais: @teale.io/eslint-config, @airtm/uuid-base32 e @pypestream/floating-ui-dom.

Um escopo funciona como um namespace, um prefixo que agrupa pacotes de uma mesma organização. Comprometer um escopo inteiro significa que qualquer projeto que dependa de qualquer pacote daquele grupo está exposto.

Os 28 pacotes do @EmilGroup foram infectados em menos de 60 segundos.

ubuntu (23).png
O payload completo da backdoor Python viaja embutido como uma string base64 dentro do próprio script de instalação. Qualquer desenvolvedor que rodasse npm install já carregava o malware sem saber. Imagem: Aikido.

Como o ataque chega no computador da vítima

Todo pacote npm pode definir um script que roda automaticamente logo depois da instalação. Esse mecanismo se chama postinstall hook, e é legítimo. Geralmente ele é usado por desenvolvedores para tarefas como compilar código ou criar pastas necessárias.

O TeamPCP usou esse gancho para executar um arquivo chamado index.js assim que a vítima roda npm install. O terminal mostra uma instalação normal. Em segundo plano, o malware já está sendo instalado.

ubuntu (22).png
Na linha 53, o atacante deixou um comentário diretamente no código publicado no repositório oficial: “Hey charlie, I don’t write JS go easy on me!” — uma mensagem endereçada ao pesquisador da Aikido que estava documentando o ataque em tempo real, confirmando que o grupo acompanhava a cobertura enquanto operava. Imagem: Aikido

O script decodifica um backdoor em Python, uma porta dos fundos que permite acesso remoto não autorizado ao sistema. Ele então, o registra como um serviço persistente no Linux, usando o systemd, o gerenciador de processos do sistema operacional. 

O serviço se reinicia automaticamente a cada 5 segundos em caso de falha. Ele ainda sobrevive a reinicializações da máquina. Não é necessário ter senha de administrador para isso.

A blockchain como servidor de controle

O elemento que diferencia o CanisterWorm de ataques anteriores é que o malware não se conecta a um servidor convencional. Na verdade, ele contata um canister na rede ICP, uma blockchain onde o código roda distribuído em centenas de computadores ao redor do mundo.

O canister não entrega o malware diretamente. Ele apenas retorna uma URL em texto simples apontando para onde o payload real, o arquivo malicioso a ser executado, está hospedado. Esse modelo é chamado de dead-drop, uma técnica de espionagem adaptada para malware. Nela, o servidor de controle funciona como um intermediário que apenas aponta o caminho.

dados-blockchain
A rede ICP funciona como uma blockchain onde o código roda distribuído em centenas de computadores ao redor do mundo simultaneamente.

A consequência prática é que os atacantes podem trocar o payload a qualquer momento. Todas as máquinas infectadas buscam uma nova instrução a cada 50 minutos e baixam automaticamente o que for encontrado. Não é necessário tocar no malware instalado.

O canister também tem um kill switch embutido, que permite que se a URL retornada contiver “youtube.com”, o malware entra em modo dormente e não faz nada. No momento em que este artigo foi escrito, o endereço apontava para um vídeo do YouTube. Isso pode mudar a qualquer instante.

O worm aprende a se espalhar sozinho

Cerca de uma hora após a primeira onda, o TeamPCP atualizou o pacote @teale.io/eslint-config com uma versão mais perigosa. O worm deixou de ser uma ferramenta manual.

A nova versão adicionou uma função que, durante a instalação, vasculha o computador da vítima em busca de tokens de autenticação do npm. Um token funciona como uma senha que permite publicar pacotes em nome de uma conta. Quem tem esse token pode colocar código novo no repositório como se fosse o dono legítimo.

shai-hulud.png
O que torna a infraestrutura de controle do CanisterWorm estruturalmente resistente a qualquer tentativa de remoção.

O malware procura esses tokens em três lugares: o arquivo .npmrc do usuário, o .npmrc do projeto atual e as variáveis de ambiente do sistema. Esse último ponto é especialmente crítico em ambientes corporativos, onde pipelines de CI/CD frequentemente armazenam tokens diretamente nas variáveis de ambiente da máquina. 

CI/CD são sistemas automatizados de construção e publicação de software, como GitHub Actions.

Se encontrar qualquer token, o malware dispara o worm como processo independente em segundo plano. O processo continua rodando mesmo que a instalação seja cancelada.

O que acontece em um ambiente corporativo

O cenário mais preocupante é o de equipes de desenvolvimento. Um desenvolvedor instala o pacote infectado. O malware encontra o token da empresa, que tem permissão para publicar em dezenas de pacotes internos. Em menos de 60 segundos, todos esses pacotes viram novos vetores de infecção.

Quando os colegas desse desenvolvedor instalarem qualquer um desses pacotes, em suas máquinas ou em pipelines automatizados, o ciclo se repete. Cada novo token encontrado é um novo ponto de partida para outra rodada de propagação.

ilustracao-de-caveira-e-codigo-binario
Diferente de um servidor convencional, não há um ponto central que autoridades possam derrubar ou provedores possam bloquear.

O TeamPCP testou esse mecanismo em quatro ondas progressivas antes de ativar a versão final, trocando payloads reais por strings inválidas para validar a cadeia de propagação sem armar o malware de fato. A versão final combina autopropagação com a backdoor ICP ativa.

O que fazer se os pacotes foram instalados

Desenvolvedores que instalaram qualquer pacote dos escopos @EmilGroup ou @opengov entre 20 e 21 de março devem verificar imediatamente se o serviço pgmon está ativo com o comando systemctl –user status pgmon.service.

Os arquivos do malware ficam em ~/.local/share/pgmon/service.py e ~/.config/systemd/user/pgmon.service. Os arquivos temporários do payload ficam em /tmp/pglog e /tmp/.pg_state.

ransomware-interlock-evolui-e-preocupa-especialistas
O malware se instala sem solicitar senha de administrador e persiste no sistema mesmo após reinicializações

Qualquer token npm acessível na máquina deve ser considerado comprometido e revogado imediatamente no painel do npmjs.com. O malware já pode ter coletado e usado esse token — e os pacotes publicados a partir dele precisam ser auditados.

Acompanhe o TecMundo nas redes sociais. Para mais notícias de segurança e tecnologia, inscreva-se em nossa newsletter e canal do YouTube.



Fonte TecMundo

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

9 + 3 = ?
Reload

Please enter the characters shown in the CAPTCHA to verify that you are human.