RegPhantom Backdoor : Analyse des Menaces et Informations sur la Détection
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
RegPhantom est un rootkit de noyau Windows axé sur la furtivité qui permet aux processus en mode utilisateur peu privilégiés d’exécuter du code arbitraire dans l’espace noyau via un canal de commande caché basé sur le registre. Le pilote est signé avec des certificats valides, utilise le chargement réflexif de PE et supprime les artefacts d’exécution une fois son travail terminé. Son architecture est conçue pour échapper aux contrôles d’application de signature de pilote tout en évitant les fichiers ou entrées de registre persistants. La détection efficace dépend donc de l’identification elle-même du binaire du pilote et des motifs de code distinctifs qu’il contient.
Recherche
La recherche a examiné plusieurs échantillons .sys signés et non signés recueillis entre juin et août 2025, révélant une base de code partagée obfusquée par CFG et un mécanisme d’interception de registre basé sur CmRegisterCallback. Le pilote déchiffre une charge utile protégée par XOR de 56 octets, la cartographie de manière réflexive dans la mémoire noyau, l’exécute, puis efface les preuves. La chronologie des échantillons et l’utilisation des certificats indiquent une activité continue de développement associée à un acteur de menace lié à la Chine.
Atténuation
Les équipes de sécurité devraient bloquer les pilotes de noyau non fiables, surveiller l’utilisation suspecte de CmRegisterCallback and PsSetCreateThreadNotifyRoutine, et appliquer la validation de l’intégrité au moment du lancement pour les fichiers de pilotes. Des règles YARA devraient être déployées pour correspondre aux séquences d’octets uniques du pilote, tandis qu’une application stricte de signature de code devrait rester en place. La surveillance des échecs d’écriture au registre inhabituels, en particulier les événements d’accès refusé répétés, peut également révéler le canal de communication caché.
Réponse
Si RegPhantom est découvert, isolez l’endpoint affecté, supprimez le pilote malveillant et capturez une image complète de la mémoire du noyau pour une revue criminelle approfondie. Révoquez les certificats de signature abusés et mettez à jour les magasins de certificats de confiance selon les besoins. La chasse aux menaces devrait ensuite se concentrer sur le comportement d’interception de registre du pilote dans l’environnement, suivie d’une remédiation de tous les systèmes Windows potentiellement exposés.
"graph TB %% Section de Définitions de Classe classDef technique fill:#ffcc99 classDef action fill:#99ccff classDef operator fill:#ff9900 classDef builtin fill:#cccccc %% Définitions de Noeuds step_persistence["<b>Étape</b> – Persistance via un pilote malveillant signé chargé au démarrage à l’aide d’un certificat de signature de code valide."] class step_persistence action tech_boot_autostart["<b>Technique</b> – <b>T1547.009 Pilotes et Modules de Noyau</b><br/>Charger le pilote malveillant au démarrage du système pour obtenir la persistance et le privilège de mode noyau."] class tech_boot_autostart technique tech_code_signing["<b>Technique</b> – <b>T1553.002 Subversion des contrôles de confiance : signature de code</b><br/>Utiliser un certificat de signature de code légitime pour contourner l’application de signature de pilote."] class tech_code_signing technique tech_priv_esc["<b>Technique</b> – <b>T1068 Exploitation pour Élévation de Privilèges</b><br/>Le pilote noyau accorde des privilèges de niveau système au code de l’attaquant.""" class tech_priv_esc technique step_hook_registration["<b>Étape</b> – Le pilote enregistre des callbacks système pour cacher sa présence et intercepter les opérations."] class step_hook_registration action tech_rootkit["<b>Technique</b> – <b>T1014 Rootkit</b><br/>Installer des composants rootkit en mode noyau et accrocher des callbacks pour dissimuler des activités malveillantes."] class tech_rootkit technique step_registry_channel["<b>Étape</b> – Canal de commande caché utilisant les écritures de registre interceptées et déchiffrées par le pilote."] class step_registry_channel action tech_query_registry["<b>Technique</b> – <b>T1012 Interroger le Registre</b><br/>Lire les valeurs du registre pour recevoir des commandes ou des données de configuration.""" class tech_query_registry technique tech_deobfuscate["<b>Technique</b> – <b>T1140 Déobfuscation/Décodage de Fichiers ou Informations</b><br/>Déchiffrer la charge utile chiffrée par XOR récupérée du registre.""" class tech_deobfuscate technique step_reflective_load["<b>Étape</b> – Charger la charge utile PE réflexive dans la mémoire noyau en utilisant un chargeur personnalisé."] class step_reflective_load action tech_reflective_loading["<b>Technique</b> – <b>T1620 Chargement de code réflexif</b><br/>Charger et exécuter du code directement à partir de la mémoire sans toucher au disque.""" class tech_reflective_loading technique step_memory_wipe["<b>Étape</b> – Effacer la mémoire allouée et supprimer les artefacts temporaires après l’exécution."] class step_memory_wipe action tech_clear_persistence["<b>Technique</b> – <b>T1070.009 Effacer la Persistance</b><br/>Supprimer les traces des modules chargés et des artefacts de persistance associés.""" class tech_clear_persistence technique step_hook_hijack["<b>Étape</b> – La charge utile détourne les pointeurs de hook du pilote pour maintenir la persistance et dissimuler davantage les activités."] class step_hook_hijack action %% Connexions montrant le flux step_persistence –>|utilise| tech_boot_autostart step_persistence –>|subverti| tech_code_signing step_persistence –>|active| tech_priv_esc step_persistence –>|conduit à| step_hook_registration step_hook_registration –>|implémente| tech_rootkit step_hook_registration –>|conduit à| step_registry_channel step_registry_channel –>|accède| tech_query_registry step_registry_channel –>|effectue| tech_deobfuscate step_registry_channel –>|conduit à| step_reflective_load step_reflective_load –>|exécute| tech_reflective_loading step_reflective_load –>|conduit à| step_memory_wipe step_memory_wipe –>|efface| tech_clear_persistence step_memory_wipe –>|conduit à| step_hook_hijack step_hook_hijack –>|maintient| tech_rootkit "
Flux d’attaque
Détections
Possible attaque BYOVD – Apportez votre propre pilote vulnérable (via audit)
Voir
Possible attaque BYOVD – Apportez votre propre pilote vulnérable (via file_event)
Voir
IOCs (HashSha256) pour détecter : Analyse de la menace du backdoor RegPhantom Partie 1
Voir
IOCs (HashSha256) pour détecter : Analyse de la menace du backdoor RegPhantom Partie 2
Voir
Détecter l’enregistrement du callback de registre RegPhantom [Événement du Registre Windows]
Voir
Exécution de simulation
Prérequis : Le contrôle pré-vol de télémétrie et de base doit avoir été réussi.
Raison : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTPs identifiés et viser à générer exactement la télémétrie attendue par la logique de détection.
-
Récit d’attaque & Commandes
- Objectif : Émuler la tentative de RegPhantom d’enregistrer un callback de registre en mode noyau qui interceptera les opérations de registre liées aux identifiants.
- Méthode : Chargez un pilote minimal, délibérément défaillant qui appelle
CmRegisterCallbackavec une routine de rappel pointant versRegNtPreSetValueKey. Le pilote passe intentionnellement une structure d’enregistrement malformée qui se traduit parSTATUS_ACCESS_DENIED. - Résultat : Les journaux Sysmon EventID 13 avec
TargetObjectcontenant à la foisCmRegisterCallbackandRegNtPreSetValueKey,Les détailssignalentTaille des données exactement 56 octets (0x38), etStatutréglé surSTATUS_ACCESS_DENIED.
-
Scénario de test de régression (PowerShell + source de pilote C intégrée – compiler sur l’hôte cible)
# -------------------------------------------------------------- # Étape 1 : Écrire la source du pilote minimal sur le disque # -------------------------------------------------------------- $driverSource = @" #include <ntddk.h> // Callback fictif – jamais appelé 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); // Utiliser intentionnellement une taille erronée (56 octets) et demander un enregistrement de rappel // qui sera rejeté avec STATUS_ACCESS_DENIED. UNICODE_STRING altitude = RTL_CONSTANT_STRING(L"1234.5678.90ab"); LARGE_INTEGER cookie = {0}; // Forcer un échec en passant un pointeur de callback nul (simule une demande malformée) NTSTATUS status = CmRegisterCallback(DummyCallback, NULL, &cookie); // Écraser le statut pour imiter la condition exacte que voit RegPhantom status = STATUS_ACCESS_DENIED; // 0xC0000022 // Garder le pilote chargé pendant une courte période pour permettre à Sysmon de capturer l'événement LARGE_INTEGER interval; interval.QuadPart = -10 * 1000000; // 1 seconde KeDelayExecutionThread(KernelMode, FALSE, &interval); // Se désenregistrer avant de décharger CmUnregisterCallback(cookie); return STATUS_SUCCESS; } "@ $srcPath = "$env:TEMPRegPhantomStub.c" $srcPath | Set-Content -Value $driverSource -Encoding ASCII # -------------------------------------------------------------- # Étape 2 : Compiler le pilote (requiert les outils de compilation de Visual Studio) # -------------------------------------------------------------- Write-Host "Compilation du pilote – nécessite le Kit de pilotes Windows (WDK) et les outils de compilation VS." $compileCmd = "cl /nologo /W3 /WX- /O2 /DUNICODE /D_UNICODE /Zi /MD /LD $srcPath /link /OUT:`"$env:TEMPRegPhantomStub.sys`"" & cmd /c $compileCmd # -------------------------------------------------------------- # Étape 3 : Charger le pilote (doit être exécuté en tant qu'administrateur) # -------------------------------------------------------------- Write-Host "Chargement du pilote pour tenter l'enregistrement..." $driverPath = "$env:TEMPRegPhantomStub.sys" sc create RegPhantomStub binPath= $driverPath type= kernel start= demand sc start RegPhantomStub # -------------------------------------------------------------- # Étape 4 : Donner le temps à Sysmon d'ingérer l'événement # -------------------------------------------------------------- Start-Sleep -Seconds 5 # -------------------------------------------------------------- # Étape 5 : Décharger et supprimer le pilote # -------------------------------------------------------------- sc stop RegPhantomStub sc delete RegPhantomStub Remove-Item -Path $driverPath -Force Remove-Item -Path $srcPath -Force Write-Host "Simulation terminée. Vérifiez la détection dans votre SIEM." -
Commandes de nettoyage (si le pilote n’a pas pu être compilé ou chargé)
# Assurez-vous que tout service de pilote partiellement créé est supprimé if (Get-Service -Name RegPhantomStub -ErrorAction SilentlyContinue) { sc stop RegPhantomStub sc delete RegPhantomStub } # Supprimer les fichiers résiduels Remove-Item -Path "$env:TEMPRegPhantomStub.*" -Force -ErrorAction SilentlyContinue