Campanha MALFEX Move Carregador npm Malicioso para um DLL do Windows
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
Uma campanha maliciosa do npm rastreada como MALFEX evoluiu ao mover sua lógica de carregador para um addon nativo Node.js compilado (DLL). O imgdecode pacote recupera shellcode criptografado do GitHub e o injeta em um dllhost.exe processo suspenso. Essa mudança ajuda a ameaça a contornar proteções de script de instalação convencionais e direcionar desenvolvedores do Windows diretamente por meio de seus ambientes de desenvolvimento.
Investigação
Pesquisadores do SafeDep analisaram imgdecode as versões 1.0.0 até 1.0.3 e descobriram que o pacote usa uma DLL nativa em C++ para realizar a injeção de processo. Eles descriptografaram a carga útil com a chave AES-256-CBC nif-runtime-2027 e traçaram a cadeia de infecção desde o pacote npm até um downloader baseado em Go e, finalmente, a um avançado stealer/RAT do Windows. A carga final também inclui técnicas anti-análise e funcionalidades de manipulação de logs.
Mitigação
As organizações devem restringir pacotes npm não verificados dentro de ambientes de desenvolvimento e impor um filtro de saída rigoroso para bloquear conexões com hosts externos desconhecidos. A detecção deve se concentrar em node.exe surgindo dllhost.exe ou estabelecendo conexões inesperadas a repositórios de código. Monitorar comportamentos incomuns de carregamento de addons nativos em ambientes Node.js também pode fornecer um alerta antecipado de atividade maliciosa.
Resposta
Se uma estação de trabalho for suspeita de carregar pacotes relacionados ao MALFEX, isole-a imediatamente da rede. Os respondedores de incidentes devem priorizar a forense de memória para capturar shellcode injetado antes de reiniciar o sistema. Troque todas as credenciais potencialmente expostas, incluindo senhas de navegador, tokens do Discord e chaves de provedor de nuvem, assim que o isolamento estiver completo.
Fluxo de Ataque
Ainda estamos atualizando esta parte.
Detecções
Possíveis Pontos de Persistência [ASEPs – Software/NTUSER Hive] (via evento de registro)
Possível Download de Arquivo do Github Iniciado Por Processo Incomum (via conexão de rede)
Tarefa Agendada Suspeita (via auditoria)
Download de Arquivo Suspeito Direto IP (via proxy)
IOCs (HashSha256) para detectar: MALFEX Move Seu Carregador npm para uma DLL Nativa do Windows
IOCs (SourceIP) para detectar: MALFEX Move Seu Carregador npm para uma DLL Nativa do Windows
IOCs (DestinationIP) para detectar: MALFEX Move Seu Carregador npm para uma DLL Nativa do Windows
Detectar Injeção de Processo Malicioso pelo Carregador npm MALFEX em imgdecode [Windows Sysmon]
Detecção de Carregador Node.js MALFEX imgdecode [Criação de Processo no Windows]
Execução de Simulação
-
Narrativa e Comandos de Ataque: O adversário conseguiu enganar um desenvolvedor a instalar um pacote npm malicioso. Para evitar a detecção por AVs padrão, o pacote usa um addon nativo Node.js (
imgdecode.node) para executar a injeção de processo “Living-off-the-Land”. O objetivo é injetar shellcode em um processo legítimo do Windows (dllhost.exe) para ocultar a atividade maliciosa sob um nome de processo confiável. A simulação usará um script PowerShell para imitar as chamadas de API (VirtualAllocEx,WriteProcessMemory,CreateRemoteThread) a partir de um arquivo nomeadoimgdecode.nodepara direcionardllhost.exe. -
Script de Teste de Regressão:
# Script de simulação para imitar a injeção imgdecode MALFEX # Nota: Este script cria um arquivo dummy para corresponder ao requisito de 'Imagem' da regra $targetProcess = "dllhost.exe" $fakeModule = "imgdecode.node" # 1. Crie um diretório dummy e o arquivo .node fake para satisfazer o requisito de caminho da Imagem $tempDir = Join-Path $env:TEMP "malfex_sim" New-Item -ItemType Directory -Force -Path $tempDir | Out-Null $fakeFilePath = Join-Path $tempDir $fakeModule New-Item -ItemType File -Force -Path $fakeFilePath | Out-Null Write-Host "[+] Criado módulo dummy: $fakeFilePath" # 2. Realizar Simulação de Injeção de Processo # Usamos Add-Type para acessar APIs Win32 diretamente para garantir que o CallTrace contenha as funções alvo $code = @" using System; using System.Runtime.InteropServices; public class Injector { [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll")] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll")] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out IntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); [DllImport("kernel32.dll")] public static extern uint GetCurrentProcessId(); } "@ Add-Type -TypeDefinition $code # Encontrar um processo dllhost.exe em execução $process = Get-Process dllhost -ErrorAction SilentlyContinue if ($null -eq $process) { Write-Host "[-] dllhost.exe não está em execução. Iniciando um..." Start-Process dllhost.exe Start-Sleep -Seconds 2 $process = Get-Process dllhost } $pid = $process.Id Write-Host "[+] Alvejando $targetProcess (PID: $pid)" # Abrir Processo $hProcess = [Injector]::OpenProcess(0x001F0FFF, $false, $pid) # Alocar Memória (Aciona VirtualAllocEx em CallTrace) $remoteMem = [Injector]::VirtualAllocEx($hProcess, [IntPtr]::Zero, 1024, 0x3000, 0x40) Write-Host "[+] Memória alocada em: $remoteMem" # Escrever Shellcode (Aciona WriteProcessMemory em CallTrace) $shellcode = [byte[]] @(0x90, 0x90, 0x90, 0x90) # NOP Sled $bytesWritten = [IntPtr]::Zero [Injector]::WriteProcessMemory($hProcess, $remoteMem, $shellcode, 4, [ref]$bytesWritten) Write-Host "[+] Shellcode escrito no processo remoto" # Criar Thread Remota (Aciona CreateRemoteThread em CallTrace) Write-Host "[+] Criou thread remota. A detecção deve acionar agora." Write-Host "[!] Simulação Completa. Verifique o SIEM para alerta." -
Comandos de Limpeza:
# Limpar artefatos de simulação Stop-Process -Name "dllhost" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPmalfex_sim" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "[+] Limpeza completa."