Pesquisadores de segurança cibernética descobriram um conjunto de pacotes maliciosos no npm (gerenciador de pacotes do JavaScript) projetados para distribuir um Trojan de Acesso Remoto (RAT, na sigla em inglês) voltado para Windows.
A lista de pacotes identificados é a seguinte:
- aes-decode-runner-pro (145 downloads)
- postcss-minify-selector (256 downloads)
- postcss-minify-selector-parser (615 downloads)
Todos os pacotes foram publicados ao longo do último mês por um usuário do npm chamado "abdrizak" e continuam disponíveis para download no repositório até o momento da publicação.
"O aes-decode-runner-pro e o postcss-minify-selector-parser se apresentam como pacotes de criptografia AES e codec personalizado e dependem do pacote legítimo postcss-selector-parser", afirmou a JFrog em uma análise. "O postcss-minify-selector se apresenta como um minificador de seletores do PostCSS e depende do postcss-minify-selector-parser."
Quanto ao "postcss-minify-selector-parser", o nome é uma referência ao postcss-selector-parser, uma biblioteca amplamente utilizada no npm, com mais de 127 milhões de downloads semanais. Independentemente do pacote baixado, a cadeia de ataque leva à implantação do mesmo malware para Windows.
Os pacotes vêm com um dropper (programa instalador) em JavaScript que grava um script PowerShell ("settings.ps1") no disco e o executa. O script PowerShell atua então como um downloader (programa de descarga) para uma carga útil de próximo estágio, obtida de um servidor externo ("nvidiadriver[.]net") por meio do utilitário "curl.exe".
A carga útil recuperada é um arquivo ZIP, do qual é extraído um script em Visual Basic ("update.vbs") executado pelo "wscript.exe". Também acompanha o arquivo ZIP um runtime do Python, um loader (carregador) em Python ("loader.py") e uma série de módulos de extensão Python (*.pyd) compilados com o Nuitka.
O Visual Basic é responsável por configurar o ambiente Python no host comprometido e iniciar o script "loader.py", que dispara a lógica central do malware. O RAT é capaz de coletar informações do host, extrair credenciais do Google Chrome, reunir dados de extensões do Chrome, executar comandos de shell e baixar e enviar arquivos de e para um servidor de comando e controle (C2) ("95.216.92[.]207:8080").
Esses recursos são implementados por meio de um conjunto de módulos de extensão nativos em Python:
- config.pyd, que contém constantes, IDs de comandos, URL do C2 e nomes de chaves de registro;
- api.pyd, que gerencia a troca de pacotes HTTP com o C2;
- audiodriver.pyd, que conduz o loop principal de orquestração do RAT;
- command.pyd, que faz o perfil do host, executa verificações de máquina virtual (VM), transferência de arquivos e execução de comandos de shell;
- auto.pyd, que realiza o roubo de credenciais e extensões do Chrome, contornando proteções de criptografia vinculada ao aplicativo (ABE, na sigla em inglês);
- util.pyd, que funciona como utilitário de manipulação de arquivos tar/gzip.
"Este caso mostra como um pequeno pacote do tipo parser pode esconder uma carga útil de múltiplos estágios para Windows, parecendo estar relacionado a ferramentas de build legítimas com uso semanal massivo", afirmou a JFrog. "Para os defensores, a lição importante é tratar dependências de build com nomes semelhantes como possíveis mecanismos de distribuição, e não apenas como ruído inofensivo de nomenclatura."
A descoberta coincide com outras três campanhas que miram o ecossistema do npm e do TypeScript:
- Um pacote malicioso chamado "apintergrationpost" que distribui um RAT para Linux completo, batizado de MYRA, alegando ser um cliente de integração em Node.js para exercícios autorizados de red team (simulação de ataque). "Ele compila um rootkit nativo em C durante a instalação, estabelece três mecanismos independentes de persistência, se disfarça de serviço systemd, oferece execução sem arquivos e fornece acesso interativo a shell com transmissão de tela ao vivo", disse a SafeDep.
- Um pacote malicioso chamado "@withgoogle/stitch-sdk" que se passa pela ferramenta de design Stitch AI do Google, mas traz recursos para roubar credenciais de desenvolvedores de oito fontes (Claude Code, git config, ~/.git-credentials, chaves públicas SSH, GitHub CLI, configuração do npm, ~/.npmrc e ~/.docker/config.json) e as exfiltra para um domínio controlado pelo atacante ("stitch-production[.]org/api/v1").
- Um conjunto de cinco pacotes ("procwire", "routecraft", "endpointmap", "bytecraft" e "staticlayer") que distribui um binário dropper em hosts Windows a partir de um servidor externo e o executa durante a instalação no npm. O pacote "routecraft" lista "procwire" como dependência, enquanto este lista "endpointmap" e "bytecraft" como dependências. O último pacote, "staticlayer", foi projetado para rodar no lado do servidor e entregar arquivos a um cliente que apresente exatamente o User-Agent (identificador de navegador) do dropper.
Usuários que tenham instalado qualquer um dos pacotes acima são orientados a removê-los imediatamente, apagar quaisquer artefatos criados por eles e rotacionar (substituir) credenciais nas máquinas de desenvolvedor afetadas.
As descobertas também coincidem com um ataque à cadeia de suprimentos que mira a ferramenta de grafo de conhecimento "gonex-AI/Understand-Anything" para enviar uma carga maliciosa que "envia sinal de atividade (beacon) para um de três servidores C2 pré-definidos, exfiltra um marcador de campanha, descriptografa via XOR e executa um cliente bot baixado e, em seguida, resolve de forma independente um comando de segundo estágio a partir de um endereço na blockchain do Tron cuja transação mais recente codifica um hash de transação da BNB Smart Chain (BSC) carregando a carga útil ativa".
A atividade se sobrepõe a uma operação norte-coreana de ataque à cadeia de suprimentos chamada PolinRider, que foi observada injetando JavaScript ofuscado em arquivos de configuração de desenvolvedores legítimos em quase 2.000 repositórios comprometidos no GitHub, com o objetivo de distribuir um downloader e stealer (programa ladrão de dados) conhecido como BeaverTail, que abre caminho para o backdoor (porta de acesso oculta) InvisibleFerret.
"Esse ataque combina três elementos que, isoladamente, são familiares, mas que, juntos, abrem uma lacuna de detecção: uma descrição de pull request (solicitação de merge de código) falsa e elaborada, com evidências de teste fabricadas, um diff (comparativo de alterações) que esconde sua carga útil em espaços em branco horizontais e um C2 de dois estágios, no qual o segundo estágio utiliza infraestrutura pública de blockchain como um canal de escrita única e leitura universal", disse a SafeDep.