RegPhantom Backdoor: Analisi delle Minacce e Approfondimenti sulla Rilevazione
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
Rilevamenti
Possibile BYOVD – Bring Your Own Vulnerable Driver Attack (via audit)
Visualizza
Possibile BYOVD – Bring Your Own Vulnerable Driver Attack (via file_event)
Visualizza
IOC (HashSha256) per rilevare: Analisi della Minaccia del RegPhantom Backdoor Parte 1
Visualizza
IOC (HashSha256) per rilevare: Analisi della Minaccia del RegPhantom Backdoor Parte 2
Visualizza
Rileva Registrazione della Callback di Registro RegPhantom [Evento Registro di Windows]
Visualizza
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
- Obiettivo: Emulare il tentativo di RegPhantom di registrare una callback del registro in modalità kernel che intercetterà le operazioni del registro relative alle credenziali.
- Metodo: Caricare un driver minimo, intenzionalmente fallendo, che chiama
CmRegisterCallbackcon una routine di callback puntante aRegNtPreSetValueKey. Il driver passa intenzionalmente una struttura di registrazione malformata che si traduce inSTATUS_ACCESS_DENIED. - Risultato: Sysmon registra EventID 13 con
TargetObjectcontenente entrambiCmRegisterCallbackandRegNtPreSetValueKey,DettagliriportandoDimensione dati esattamente 56 byte (0x38), eStatoimpostato suSTATUS_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