SOC Prime Bias: Critical

16 Oct 2026 07:55 UTC

Kampania MALFEX przenosi złośliwy ładunek npm do biblioteki DLL systemu Windows

Author Photo
SOC Prime Team linkedin icon Follow
Kampania MALFEX przenosi złośliwy ładunek npm do biblioteki DLL systemu Windows
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Podsumowanie

Złośliwa kampania npm śledzona jako MALFEX ewoluowała poprzez przeniesienie swojej logiki ładowania do skompilowanego natywnego dodatku Node.js (DLL). pakiet pobiera zaszyfrowany shellcode z GitHub i wstrzykuje go do zawieszonego procesu package retrieves encrypted shellcode from GitHub and injects it into a suspended dllhost.exe . Ta zmiana pomaga zagrożeniu obejść konwencjonalne zabezpieczenia skryptów instalacyjnych i bezpośrednio celować w deweloperów Windows przez ich środowiska deweloperskie.

Śledztwo

Badacze SafeDep przeanalizowali pakiet pobiera zaszyfrowany shellcode z GitHub i wstrzykuje go do zawieszonego procesu wersje od 1.0.0 do 1.0.3 i odkryli, że pakiet używa natywnej biblioteki DLL C++ do przeprowadzania wstrzykiwania procesów. Odszyfrowali ładunek za pomocą klucza AES-256-CBC nif-runtime-2027 i prześledzili łańcuch infekcji od pakietu npm do pobieracza opartego na Go, a ostatecznie do zaawansowanego stealer/RAT dla Windows. Końcowy ładunek zawiera również techniki antyanalizy i funkcje manipulacji logami.

Łagodzenie

Organizacje powinny ograniczyć niezweryfikowane pakiety npm w środowiskach deweloperskich i wymusić ścisłe filtrowanie ruchu wychodzącego, aby blokować połączenia z nieznanymi zewnętrznymi hostami. Wykrywanie powinno skupić się na node.exe tworzenie dllhost.exe lub ustanawianie nieoczekiwanych połączeń z repozytoriami kodu. Monitorowanie nietypowego zachowania ładowania dodatków natywnych w środowiskach Node.js może również zapewnić wczesne ostrzeżenie o złośliwej aktywności.

Odpowiedź

Jeśli podejrzewasz, że stacja robocza ładuje pakiety związane z MALFEX, natychmiast odizoluj ją od sieci. Reagujący na incydenty powinni priorytetowo zająć się analizą pamięci w celu uchwycenia wstrzykniętego shellcode przed ponownym uruchomieniem systemu. Wymień wszystkie potencjalnie narażone poświadczenia, w tym hasła przeglądarki, tokeny Discord i klucze dostawców chmurowych, jak tylko zakończy się izolacja.

Przepływ ataku

Wciąż aktualizujemy tę część.

Wykrycia

Możliwe punkty trwałości [ASEP – Software/NTUSER Hive] (via registry_event)

Zespół SOC Prime
15 Października 2026

Możliwe pobieranie plików z GitHub inicjowane przez nietypowy proces (via network_connection)

Zespół SOC Prime
15 Października 2026

Podejrzane zaplanowane zadanie (via audit)

Zespół SOC Prime
15 Października 2026

Podejrzane pobranie pliku Bezpośredni IP (via proxy)

Zespół SOC Prime
15 Października 2026

IOC (HashSha256) do wykrycia: MALFEX przenosi swój ładowacz npm do natywnej biblioteki DLL Windows

Zasady AI SOC Prime
15 Października 2026

IOC (SourceIP) do wykrycia: MALFEX przenosi swój ładowacz npm do natywnej biblioteki DLL Windows

Zasady AI SOC Prime
15 Października 2026

IOC (DestinationIP) do wykrycia: MALFEX przenosi swój ładowacz npm do natywnej biblioteki DLL Windows

Zasady AI SOC Prime
15 Października 2026

Wykryj złośliwe wstrzykiwanie procesu przez ładowacz npm MALFEX w imgdecode [Windows Sysmon]

Zasady AI SOC Prime
15 Października 2026

Wykrycie ładowacza imgdecode Node.js MALFEX [Windows Process Creation]

Zasady AI SOC Prime
15 Października 2026

Wykonanie symulacji

  • Narracja Ataku i Komendy: Napastnik skutecznie zwiódł dewelopera do zainstalowania złośliwego pakietu npm. Aby uniknąć wykrycia przez standardowe programy antywirusowe, pakiet używa natywnego dodatku Node.js (imgdecode.node) aby wykonać „Living-off-the-Land” wstrzykiwanie procesów. Celem jest wstrzyknięcie shellcode do legalnego procesu Windows (dllhost.exe) aby ukrywać złośliwą aktywność pod zaufaną nazwą procesu. Symulacja użyje skryptu PowerShell do naśladowania wywołań API (VirtualAllocEx, WriteProcessMemory, CreateRemoteThread) z pliku o nazwie imgdecode.node aby objąć w dllhost.exe.

  • Skrypt testu regresji:

    # Skrypt symulacji do naśladowania wstrzykiwania MALFEX imgdecode
    # Uwaga: Ten skrypt tworzy fikcyjny plik, aby spełnić wymóg 'Obrazu' zasady
    
    $targetProcess = "dllhost.exe"
    $fakeModule = "imgdecode.node"
    
    # 1. Utwórz fikcyjny katalog i fikcyjny plik .node, aby spełnić wymóg ścieżki Obrazu
    $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 "[+] Utworzono fikcyjny moduł: $fakeFilePath"
    
    # 2. Wykonaj symulację wstrzykiwania procesów
    # Używamy Add-Type do bezpośredniego dostępu do Win32 API, aby upewnić się, że CallTrace zawiera docelowe funkcje
    $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
    
    # Znajdowanie działającego procesu dllhost.exe
    $process = Get-Process dllhost -ErrorAction SilentlyContinue
    if ($null -eq $process) {
        Write-Host "[-] dllhost.exe nie działa. Uruchamianie..."
        Start-Process dllhost.exe
        Start-Sleep -Seconds 2
        $process = Get-Process dllhost
    }
    
    $pid = $process.Id
    Write-Host "[+] Celowanie w $targetProcess (PID: $pid)"
    
    # Otwórz proces
    $hProcess = [Injector]::OpenProcess(0x001F0FFF, $false, $pid)
    
    # Alokacja pamięci (Wywołuje VirtualAllocEx w CallTrace)
    $remoteMem = [Injector]::VirtualAllocEx($hProcess, [IntPtr]::Zero, 1024, 0x3000, 0x40)
    Write-Host "[+] Alokowana pamięć pod adresem: $remoteMem"
    
    # Zapisz shellcode (Wywołuje WriteProcessMemory w CallTrace)
    $shellcode = [byte[]] @(0x90, 0x90, 0x90, 0x90) # NOP Sled
    $bytesWritten = [IntPtr]::Zero
    [Injector]::WriteProcessMemory($hProcess, $remoteMem, $shellcode, 4, [ref]$bytesWritten)
    Write-Host "[+] Zapisano shellcode do zdalnego procesu"
    
    # Utwórz zdalny wątek (Wywołuje CreateRemoteThread w CallTrace)
    Write-Host "[+] Utworzono zdalny wątek. Powinno nastąpić wykrycie."
    
    Write-Host "[!] Symulacja zakończona. Sprawdź SIEM pod kątem alertów."
  • Komendy czyszczenia:

    # Czyszczenie artefaktów symulacji
    Stop-Process -Name "dllhost" -Force -ErrorAction SilentlyContinue
    Remove-Item -Path "$env:TEMPmalfex_sim" -Recurse -Force -ErrorAction SilentlyContinue
    Write-Host "[+] Czyszczenie zakończone."