Pesquisadores de cibersegurança descobriram um pacote malicioso do npm ligado à campanha de ataque à cadeia de suprimentos de software MALFEX, divulgada recentemente.
Chamado “imgdecode”, o pacote foi publicado no registro em 30 de setembro de 2026 por um usuário identificado como “malfexteste8”. Até a publicação desta matéria, havia sido baixado 979 vezes e continuava disponível no npm. A versão mais recente é a 1.0.3.
“O pacote npm imgdecode oculta um loader malicioso em um complemento compilado para Node.js”, afirmou a SafeDep. “Seu arquivo JavaScript, de nove linhas, carrega uma biblioteca de vínculo dinâmico (DLL) do Windows. Quando um programa Node.js executa require('imgdecode') em um terminal do Windows, a DLL tenta baixar shellcode criptografado do GitHub. Em seguida, descriptografa a resposta e injeta o resultado em um novo processo do dllhost.exe.”
Documentada inicialmente pela Checkmarx e pela CloudSEK, MALFEX é uma campanha prolongada atribuída a um threat actor desconhecido, que publica pacotes maliciosos no npm desde 6 de agosto de 2023 para comprometer sistemas Windows. Os pacotes foram publicados por meio de cinco contas: malfexkkj, malfex_user, malfexteste2, malfexteste3 e malfexteste4.
Entre os oito pacotes identificados, três funcionavam como loaders do Overlord RAT. Outros três, “cdn-img-fetch”, “img-to-native” e “native-runner”, atuavam em conjunto para baixar e executar um infostealer para Node.js. Uma terceira forma de infecção usava um gancho postinstall para executar JavaScript capaz de se conectar a um servidor externo e obter um arquivo binário de uma etapa posterior, ainda não identificado.
O threat actor por trás da campanha parece reagir às divulgações públicas e à remoção de pacotes do npm. Em até dois dias, publicou substitutos para “native-runner” e “img-to-native”, chamados “runhelper” e “imgbundle”. A primeira versão do “imgdecode” foi publicada na mesma data. A sequência dos eventos foi a seguinte:
- 26 de setembro de 2026: publicação das versões 1.0.0 de cdn-img-fetch, img-to-native e native-runner.
- 28 de setembro de 2026, às 16h06 UTC: o npm removeu native-runner e img-to-native.
- 30 de setembro de 2026, às 3h29 UTC: publicação da versão 1.0.0 de imgbundle, substituto de img-to-native.
- 30 de setembro de 2026, às 3h37 UTC: publicação da versão 1.0.0 de runhelper, substituto de native-runner.
- 30 de setembro de 2026, às 16h13 UTC: runhelper foi removido do npm.
- 30 de setembro de 2026, às 22h32 UTC: publicação da versão 1.0.0 de imgdecode.
- 30 de setembro de 2026, às 23h07 UTC: publicação da versão 1.0.1 de imgdecode.
- 1º de outubro de 2026, às 17h48 UTC: publicação da versão 1.0.2 de imgdecode.
- 7 de outubro de 2026, às 23h06 UTC: o npm removeu imgbundle.
- 8 de outubro de 2026, às 13h03 UTC: o npm removeu cdn-img-fetch.
- 11 de outubro de 2026, às 22h09 UTC: publicação da versão 1.0.3 de imgdecode.
A cadeia de infecção do infostealer para Node.js chama atenção porque nenhum dos pacotes tinha um gancho de instalação. Em vez disso, o código malicioso é executado quando “native-runner” é carregado. O pacote declara “img-to-native” como dependência, que, por sua vez, também declara “img-to-native” como dependência.
A função de cada pacote é a seguinte:
- cdn-img-fetch baixa o arquivo “banner.png” de um repositório do GitHub (“cavecrew/proj”) e extrai um bloco de dados criptografado.
- img-to-native descriptografa o bloco com a chave “malfexteam2027” e grava o conteúdo no disco como um executável Go em “%APPDATA%\Microsoft\Windows\node_runtime_helper.exe”.
- native-runner executa esse arquivo Go, que então baixa o binário do infostealer, chamado “setup.exe” ou “movinlike”, do endereço “104.234.65[.]75:700”.
Apresentado como um utilitário auxiliar para “executar arquivos binários nativos em projetos Node.js”, o “runhelper” tem funcionamento semelhante ao do “native-runner” e foi desenvolvido para executar código malicioso. Sua principal função é localizar um arquivo JPG (“cdn-img-fetch/.runtime/rt.jpg”), extrair dele shellcode, copiá-lo para uma área executável da memória e executá-lo usando o Koffi, um módulo de interface de função externa (FFI) para Node.js.
“Seis horas depois que runhelper foi removido do npm, o operador publicou imgdecode com uma DLL compilada para executar o shellcode”, afirmou a SafeDep. “A partir da versão 1.0.1, a DLL também baixa e descriptografa o payload. As versões 1.0.1 e 1.0.2 ainda executam require('imgbundle') antes de carregar a DLL. A versão 1.0.3 remove essa dependência e não precisa de nenhum outro pacote MALFEX.”
Assim como o “runhelper”, a versão 1.0.0 do “imgdecode” espera que o “imgbundle” grave um arquivo no caminho “cdn-img-fetch/.runtime/”. Quando o arquivo fica disponível, o pacote lê seu conteúdo para a memória e o envia a um complemento nativo do Node.js para decodificação.
O complemento é uma DLL de 64 bits criada com o Microsoft Visual C++ (MSVC). Primeiro, verifica se está sendo executada em um terminal de desenvolvedor. Depois, busca um arquivo JPG (“banner.jpg”) no mesmo repositório, “cavecrew/proj”, descriptografa o payload incorporado usando a chave “nif-runtime-2027” e injeta o resultado no “dllhost.exe”.
“Após a descriptografia, a DLL verifica os primeiros bytes dos dados descriptografados”, explicou a SafeDep. “Se corresponderem à assinatura de um arquivo JPEG ou PNG, a DLL interrompe a execução. A inferência é que o operador poderia desativar o loader servindo conteúdo criptografado que, após a descriptografia, resultasse em uma imagem. O fornecimento de uma imagem comum, por outro lado, em geral faria a descriptografia falhar antes dessa verificação.”
Embora a conta “cavecrew” no GitHub não esteja mais acessível, uma captura de tela do arquivo de imagem, preservada pelo Internet Archive e datada de 6 de outubro de 2026, mostra que se trata do mesmo programa de download baseado em Go usado para obter o infostealer para Node.js e a ferramenta de acesso remoto “movinlike”, hospedados em “104.234.65[.]75:700”.
O aplicativo Node.js inclui um arquivo .env com um endereço de comando e controle (C2), “104.234.65[.]75:7007”, e uma chave de licença MALFEX. Isso indica o uso de um criador de malware ou sistema de licenciamento para produzir esses payloads.
Antes de coletar dados, o malware realiza verificações contra análise para detectar máquinas virtuais, sandboxes e ferramentas como Process Monitor e Wireshark. Em seguida, busca arquivos com frases-semente e extensões específicas, como .kdbx, .pem, .ppk e .env. Também coleta dados de navegadores baseados no Chromium, Discord, Telegram, carteiras de criptomoedas e aplicativos de jogos, incluindo Steam, Epic Games, Riot, Battle.net, Minecraft e Ubisoft.
O malware também pode estabelecer uma conexão com o servidor C2 pelo protocolo WebSocket e receber comandos para executar comandos de shell, transferir arquivos, controlar processos, acessar a área de transferência, capturar telas e simular entradas de mouse e teclado. Para manter a persistência, cria uma chave Run no Registro do Windows e uma tarefa agendada chamada “MicrosoftEdgeUpdateService”.
Desenvolvedores que instalaram qualquer um dos pacotes mencionados devem considerar seus sistemas Windows potencialmente comprometidos, isolá-los, verificar entradas de persistência e trocar as credenciais. Se frases-semente tiverem sido armazenadas nesses sistemas, também devem transferir os fundos para novas carteiras.
Publicidade
Vibecoding cria 10x mais sistemas, 20x mais vulneráveis. E quem ganha com isso é a galera do hacking ético e pentest. Quer ser pago para invadir sistemas? Então você tem que aprender com a Solyd que são os melhores do Brasil. Saiba mais...