SOC Prime Bias: Medio

26 Mar 2026 16:14

RegPhantom Backdoor: Analisi delle Minacce e Approfondimenti sulla Rilevazione

Author Photo
Ruslan Mikhalov Capo della Ricerca sulle Minacce presso SOC Prime linkedin icon Segui
RegPhantom Backdoor: Analisi delle Minacce e Approfondimenti sulla Rilevazione
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Riassunto

RegPhantom è un rootkit stealth per il kernel di Windows che consente ai processi in modalità utente con privilegi bassi di eseguire codice arbitrario nello spazio del kernel tramite un canale di comando nascosto basato sul registro di sistema. Il driver è firmato con certificati validi, si basa sul caricamento riflessivo di PE e rimuove gli artefatti di esecuzione una volta completato il suo compito. La sua architettura è progettata per eludere i controlli di firma dei driver evitando file o voci di registro persistenti. Pertanto, il rilevamento efficace dipende dall’identificazione del binario del driver stesso e dei modelli di codice distintivi che contiene.

Indagine

La ricerca ha esaminato diversi file .sys raccolti tra giugno e agosto 2025, rivelando una base di codice CFG offuscata condivisa e un meccanismo di intercettazione del registro basato su CmRegisterCallback. Il driver decripta un payload protetto da XOR di 56 byte, mappandolo riflessivamente nella memoria del kernel, lo esegue e poi cancella le prove. La cronologia dei campioni e l’uso dei certificati indicano un’attività di sviluppo continua associata a un attore di minacce legato alla Cina.

Mitigazione

I team di sicurezza dovrebbero bloccare i driver kernel non attendibili, monitorare l’uso sospetto di CmRegisterCallback and PsSetCreateThreadNotifyRoutine, e imporre la convalida dell’integrità al momento del lancio per i file dei driver. Le regole YARA dovrebbero essere distribuite per corrispondere alle sequenze di byte uniche del driver, mentre l’applicazione rigorosa della firma del codice dovrebbe rimanere in vigore. Monitorare i fallimenti di scrittura nel registro insoliti, specialmente eventi di accesso negato ripetuti, può anche rivelare il canale di comunicazione nascosto.

Risposta

Se viene scoperto RegPhantom, isolare l’endpoint compromesso, eliminare il driver dannoso e acquisire un dump completo della memoria del kernel per una revisione forense più approfondita. Revocare eventuali certificati di firma abusati e aggiornare gli archivi dei certificati attendibili secondo necessità. La caccia alle minacce dovrebbe quindi concentrarsi sul comportamento di intercettazione del registro del driver in tutto l’ambiente, seguita dalla rimedio di tutti i sistemi Windows potenzialmente esposti.

"graph TB %% Class Definitions Section classDef technique fill:#ffcc99 classDef action fill:#99ccff classDef operator fill:#ff9900 classDef builtin fill:#cccccc %% Node definitions step_persistence["<b>Passo</b> – Persistenza tramite driver malevolo firmato caricato all’avvio utilizzando un certificato di firma del codice valido."] class step_persistence action tech_boot_autostart["<b>Tecnica</b> – <b>T1547.009 Driver e Moduli di Kernel</b><br/>Caricare driver malevolo all’avvio del sistema per ottenere persistenza e ottenere privilegi in modalità kernel."] class tech_boot_autostart technique tech_code_signing["<b>Tecnica</b> – <b>T1553.002 Sovvertire Controlli di Fiducia: Firma del Codice</b><br/>Sfruttare un certificato di firma del codice legittimo per aggirare l’enforcement della firma del driver."] class tech_code_signing technique tech_priv_esc["<b>Tecnica</b> – <b>T1068 Sfruttamento per Escalonamento di Privilegi</b><br/>Il driver del kernel concede privilegi a livello di sistema al codice dell’attaccante.""" class tech_priv_esc technique step_hook_registration["<b>Passo</b> – Il driver registra callback di sistema per nascondere la propria presenza e intercettare le operazioni."] class step_hook_registration action tech_rootkit["<b>Tecnica</b> – <b>T1014 Rootkit</b><br/>Installare componenti rootkit in modalità kernel e registrare callback per nascondere attività malevole."] class tech_rootkit technique step_registry_channel["<b>Passo</b> – Canale di comando nascosto che utilizza scritture nel registro intercettate e decriptate dal driver."] class step_registry_channel action tech_query_registry["<b>Tecnica</b> – <b>T1012 Query del Registro</b><br/>Leggere i valori del registro per ricevere comandi o dati di configurazione.""" class tech_query_registry technique tech_deobfuscate["<b>Tecnica</b> – <b>T1140 Deoffuscare/Decodificare File o Informazioni</b><br/>Decriptare payload criptato XOR recuperato dal registro.""" class tech_deobfuscate technique step_reflective_load["<b>Passo</b> – Caricare un payload PE riflessivo nella memoria del kernel utilizzando un caricatore personalizzato."] class step_reflective_load action tech_reflective_loading["<b>Tecnica</b> – <b>T1620 Caricamento di Codice Riflessivo</b><br/>Caricare ed eseguire codice direttamente dalla memoria senza toccare il disco.""" class tech_reflective_loading technique step_memory_wipe["<b>Passo</b> – Cancellare la memoria allocata e rimuovere gli artefatti temporanei dopo l’esecuzione."] class step_memory_wipe action tech_clear_persistence["<b>Tecnica</b> – <b>T1070.009 Cancellare la Persistenza</b><br/>Cancellare le tracce di moduli caricati e artefatti di persistenza correlati.""" class tech_clear_persistence technique step_hook_hijack["<b>Passo</b> – Il payload dirotta i puntatori di hook del driver per mantenere la persistenza e nascondere ulteriormente l’attività."] class step_hook_hijack action %% Connections showing flow step_persistence –>|uses| tech_boot_autostart step_persistence –>|subverts| tech_code_signing step_persistence –>|enables| tech_priv_esc step_persistence –>|leads_to| step_hook_registration step_hook_registration –>|implements| tech_rootkit step_hook_registration –>|leads_to| step_registry_channel step_registry_channel –>|accesses| tech_query_registry step_registry_channel –>|performs| tech_deobfuscate step_registry_channel –>|leads_to| step_reflective_load step_reflective_load –>|executes| tech_reflective_loading step_reflective_load –>|leads_to| step_memory_wipe step_memory_wipe –>|clears| tech_clear_persistence step_memory_wipe –>|leads_to| step_hook_hijack step_hook_hijack –>|maintains| tech_rootkit "

Flusso di Attacco

Esecuzione della Simulazione

Prerequisito: La Verifica Pre-volo di Telemetria e Base deve essere superata.

Razionale: Questa sezione dettaglia l’esatta esecuzione della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente i TTP identificati e puntare a generare l’esatta telemetria prevista dalla logica di rilevamento.

  • Narrativa di Attacco & Comandi

    1. Obiettivo: Emulare il tentativo di RegPhantom di registrare una callback del registro in modalità kernel che intercetterà le operazioni del registro relative alle credenziali.
    2. Metodo: Caricare un driver minimo, intenzionalmente fallendo, che chiama CmRegisterCallback con una routine di callback puntante a RegNtPreSetValueKey. Il driver passa intenzionalmente una struttura di registrazione malformata che si traduce in STATUS_ACCESS_DENIED.
    3. Risultato: Sysmon registra EventID 13 con TargetObject contenente entrambi CmRegisterCallback and RegNtPreSetValueKey, Dettagli riportando Dimensione dati esattamente 56 byte (0x38), e Stato impostato su STATUS_ACCESS_DENIED.
  • Script per Test di Regressione (PowerShell + codice sorgente C del driver incorporato – compilare sull’host di destinazione)

    # --------------------------------------------------------------
    # Step 1: Scrivere il codice sorgente del driver minimo su disco
    # --------------------------------------------------------------
    $driverSource = @"
    #include <ntddk.h>
    
    // Callback falso – mai chiamato
    NTSTATUS DummyCallback(
        _In_ PVOID CallbackContext,
        _In_ PVOID Argument1,
        _In_ PVOID Argument2
    )
    {
        UNREFERENCED_PARAMETER(CallbackContext);
        UNREFERENCED_PARAMETER(Argument1);
        UNREFERENCED_PARAMETER(Argument2);
        return STATUS_SUCCESS;
    }
    
    extern "C" NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
    {
        UNREFERENCED_PARAMETER(DriverObject);
        UNREFERENCED_PARAMETER(RegistryPath);
    
        // Utilizzare intenzionalmente una dimensione errata (56 byte) e richiedere una registrazione del callback
        // che sarà rifiutata con STATUS_ACCESS_DENIED.
        UNICODE_STRING altitude = RTL_CONSTANT_STRING(L"1234.5678.90ab");
        LARGE_INTEGER cookie = {0};
    
        // Forzare un fallimento passando un puntatore a callback nullo (simula una richiesta malformata)
        NTSTATUS status = CmRegisterCallback(DummyCallback, NULL, &cookie);
    
        // Sovrascrivere lo stato per imitare la condizione esatta vista da RegPhantom
        status = STATUS_ACCESS_DENIED; // 0xC0000022
    
        // Mantenere il driver caricato per un breve periodo per permettere a Sysmon di catturare l'evento
        LARGE_INTEGER interval;
        interval.QuadPart = -10 * 1000000; // 1 secondo
        KeDelayExecutionThread(KernelMode, FALSE, &interval);
    
        // Annullare la registrazione prima di scaricare
        CmUnregisterCallback(cookie);
    
        return STATUS_SUCCESS;
    }
    "@
    $srcPath = "$env:TEMPRegPhantomStub.c"
    $srcPath | Set-Content -Value $driverSource -Encoding ASCII
    
    # --------------------------------------------------------------
    # Step 2: Compilare il driver (richiede Visual Studio Build Tools)
    # --------------------------------------------------------------
    Write-Host "Compilazione del driver in corso – richiede Windows Driver Kit (WDK) e VS Build Tools."
    $compileCmd = "cl /nologo /W3 /WX- /O2 /DUNICODE /D_UNICODE /Zi /MD /LD $srcPath /link /OUT:`"$env:TEMPRegPhantomStub.sys`""
    & cmd /c $compileCmd
    
    # --------------------------------------------------------------
    # Step 3: Caricare il driver (deve essere eseguito come Amministratore)
    # --------------------------------------------------------------
    Write-Host "Caricamento del driver per attivare il tentativo di registrazione..."
    $driverPath = "$env:TEMPRegPhantomStub.sys"
    sc create RegPhantomStub binPath= $driverPath type= kernel start= demand
    sc start RegPhantomStub
    
    # --------------------------------------------------------------
    # Step 4: Dare tempo a Sysmon di ingerire l'evento
    # --------------------------------------------------------------
    Start-Sleep -Seconds 5
    
    # --------------------------------------------------------------
    # Step 5: Scaricare ed eliminare il driver
    # --------------------------------------------------------------
    sc stop RegPhantomStub
    sc delete RegPhantomStub
    Remove-Item -Path $driverPath -Force
    Remove-Item -Path $srcPath -Force
    
    Write-Host "Simulazione completata. Verificare il rilevamento nel proprio SIEM."
  • Comandi di Pulizia (se il driver non è stato possibile compilare o caricare)

    # Assicurarsi che eventuali servizi di driver parzialmente creati siano rimossi
    if (Get-Service -Name RegPhantomStub -ErrorAction SilentlyContinue) {
        sc stop RegPhantomStub
        sc delete RegPhantomStub
    }
    # Rimuovere file residui
    Remove-Item -Path "$env:TEMPRegPhantomStub.*" -Force -ErrorAction SilentlyContinue