SOC Prime Bias: Élevé

07 Avr 2026 19:57

Chaîne d’infection Qilin EDR Killer

Author Photo
Ruslan Mikhalov Chef de la Recherche sur les Menaces chez SOC Prime linkedin icon Suivre
Chaîne d’infection Qilin EDR Killer
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

Le rapport couvre un chargeur à plusieurs étapes livré sous forme de msimg32.dll trojanisé pouvant désactiver ou supprimer plus de 300 produits de détection et de réponse des terminaux. Le chargeur combine des abus avancés de SEH/VEH, des techniques de pilotes kernel et des points de rupture matériels pour échapper aux hooks en mode utilisateur et tuer les processus de sécurité. Cette activité est liée à l’écosystème de ransomware Qilin et est livrée avec un pilote personnalisé dérivé des outils ThrottleStop. Le résultat final est une charge utile dédiée à la suppression des EDR qui termine les services de sécurité et peut rétablir le contrôle de l’attaquant en restaurant ou en neutralisant la logique de rappel d’intégrité du code.

Enquête

Les chercheurs ont inversé le DLL malveillant, son chargeur PE, et deux pilotes d’assistance, rwdrv.sys et hlpdrv.sys. L’analyse détaille comment le chargeur construit une table de politiques de slots de syscall, manipule le dispatcher d’exceptions, et effectue un hooking IAT pour rediriger l’exécution. Il utilise ensuite la gestion des exceptions vectorisées pour mettre en scène et lancer une charge utile basée sur shell32. La couche de pilote expose un accès brut à la mémoire physique et est exploitée pour supprimer ou désactiver les callbacks de kernel liés aux EDR, ainsi que pour terminer des processus protégés via une interface IOCTL personnalisée.

Atténuation

Utilisez des défenses multicouches et évitez la dépendance à un seul contrôle EDR. Surveillez les activités anormales de chargement de pilotes, l’utilisation suspecte d’IOCTL de mémoire physique, et les changements inattendus des structures de rappel du kernel. Empêchez le chargement latéral de DLL où les attaquants remplacent les bibliothèques système légitimes, et ajoutez une couverture pour l’évasion de type point de rupture matériel. Gardez les signatures réseau et des terminaux à jour, y compris les ensembles de règles d’outils tels que ClamAV et Snort.

Réponse

Si détecté, isolez le terminal, arrêtez le processus malveillant et déchargez les pilotes suspects. Capturez des images complètes de la mémoire pour les analyses forensiques, vérifiez explicitement pour rwdrv.sys et hlpdrv.sys et validez l’intégrité des callbacks de kernel et la télémétrie de sécurité associée. Déployez des détections mises à jour pour le nom de fichier msimg32.dll, les événements de chargement de pilotes et le modèle IOCTL 0x2222008. Complétez un examen de l’intégrité du système et récupérez à partir de sauvegardes correctes connues si la confiance dans l’hôte ne peut être rétablie.

"graph TB %% Class definitions classDef technique fill:#ffcc99 %% Node definitions tech_initial_appinit["<b>Technique</b> – <b>T1546.010 AppInit DLLs</b>: Charge malveillante msimg32.dll en tant que sideload<br/><b>Description</b>: Utilisez la valeur de registre AppInit_DLLs pour faire charger une DLL malveillante dans chaque processus en mode utilisateur qui charge User32.dll."] class tech_initial_appinit technique tech_obfuscation["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b>: Charge utile cryptée avec des astuces SEH/VEH<br/><b>Description</b>: Crypter ou masquer autrement le code malveillant et utiliser des astuces de gestion des exceptions structurées ou vectorisées pour éviter l’analyse statique."] class tech_obfuscation technique tech_dll_injection["<b>Technique</b> – <b>T1055.001 DLL Injection</b>: Hook IAT d’ExitProcess<br/><b>Description</b>: Injecter une DLL malveillante dans un processus cible et modifier sa Table d’Adresses d’Importation pour détourner les appels ExitProcess."] class tech_dll_injection technique tech_hijack_flow["<b>Technique</b> – <b>T1574 Hijack Execution Flow</b>: gestionnaires VEH/SEH et points de rupture matériels<br/><b>Description</b>: Remplacer ou ajouter des gestionnaires d’exceptions et définir des points de rupture matériels pour rediriger l’exécution vers le code malveillant."] class tech_hijack_flow technique tech_reflective_load["<b>Technique</b> – <b>T1620 Reflective Code Loading</b>: Décryptage et exécution PE en mémoire<br/><b>Description</b>: Décrypter un exécutable portable en mémoire et l’exécuter sans écrire sur le disque."] class tech_reflective_load technique tech_elev_control["<b>Technique</b> – <b>T1548 Abuse Elevation Control Mechanism</b>: Charger le pilote rwdrv.sys pour lecture/écriture mémoire physique<br/><b>Description</b>: Installer un pilote signé ou vulnérable pour obtenir un accès lecture/écriture à la mémoire physique."] class tech_elev_control technique tech_priv_esc["<b>Technique</b> – <b>T1068 Exploitation for Privilege Escalation</b>: Manipuler les objets de kernel et désactiver les callbacks EDR<br/><b>Description</b>: Utiliser le pilote chargé pour altérer les structures de kernel et neutraliser les hooks de détection et réponse des terminaux."] class tech_priv_esc technique tech_persistence_appinit["<b>Technique</b> – <b>T1546.010 AppInit DLLs (Persistence)</b>: Maintenir l’état désactivé EDR<br/><b>Description</b>: Garder la DLL malveillante enregistrée via AppInit_DLLs pour persister à travers les redémarrages pendant que l’EDR reste désactivé."] class tech_persistence_appinit technique tech_sandbox_evasion["<b>Technique</b> – <b>T1497.002 Virtualization/Sandbox Evasion</b>: Vérification de la locale et détection de points de rupture<br/><b>Description</b>: Détecter des environnements d’analyse en vérifiant les paramètres de locale du système et en sondant les points de rupture du débogueur."] class tech_sandbox_evasion technique %% Connections showing attack flow tech_initial_appinit –>|leads_to| tech_obfuscation tech_obfuscation –>|leads_to| tech_dll_injection tech_dll_injection –>|leads_to| tech_hijack_flow tech_hijack_flow –>|leads_to| tech_reflective_load tech_reflective_load –>|leads_to| tech_elev_control tech_elev_control –>|leads_to| tech_priv_esc tech_priv_esc –>|leads_to| tech_persistence_appinit tech_persistence_appinit –>|leads_to| tech_sandbox_evasion "

Flux d’Attaque

Exécution de Simulation

Prérequis: La vérification initiale de la télémétrie et de la base de référence doit avoir été réussie.

Justification: 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 TTP identifiés et viser à générer la télémétrie exacte attendue par la logique de détection.

  • Narration & Commandes de l’Attaque :

    Un attaquant fabrique un binaire C natif minimal qui charge explicitement ntdll.dll et appelle NtTraceEvent via son nom exporté. Le binaire est compilé sur l’hôte cible en utilisant les outils de construction Visual C++, puis exécuté. Comme l’appel est effectué via la surface d’API Windows régulière, l’événement de création du processus enregistre l’image (ntdll.dll) et le champ CallTrace contient la chaîne “NtTraceEvent”, satisfaisant la condition Sigma. L’attaquant supprime ensuite le binaire pour réduire les artefacts forensic.

  • Script de Test de Régression :

    # ---------------------------------------------------------
    # Etape 1 – Créer une source C temporaire qui appelle NtTraceEvent
    # ---------------------------------------------------------
    $src = @"
    #include <windows.h>
    typedef NTSTATUS (NTAPI *pNtTraceEvent)(HANDLE, ULONG, PVOID, ULONG);
    int main() {
        HMODULE hNtdll = LoadLibraryA("ntdll.dll");
        if (!hNtdll) return 1;
        pNtTraceEvent NtTraceEvent = (pNtTraceEvent)GetProcAddress(hNtdll, "NtTraceEvent");
        if (!NtTraceEvent) return 1;
        // Appel minimal – les arguments sont en grande partie ignorés pour cette démo
        NtTraceEvent(NULL, 0, NULL, 0);
        return 0;
    }
    "@
    $tmpPath = "$env:TEMPNtTraceDemo.c"
    $exePath = "$env:TEMPNtTraceDemo.exe"
    $src | Set-Content -Path $tmpPath -Encoding ASCII
    
    # ---------------------------------------------------------
    # Etape 2 – Compiler en utilisant cl.exe (suppose que Visual C++ Build Tools est installé)
    # ---------------------------------------------------------
    $vcVars = "$env:ProgramFiles(x86)Microsoft Visual Studio2019BuildToolsVCAuxiliaryBuildvcvars64.bat"
    if (Test-Path $vcVars) {
        & cmd /c "`"$vcVars`" && cl /nologo /O2 /Fe:`"$exePath`" `"$tmpPath`""
    } else {
        Write-Error "Les outils de construction Visual C++ n'ont pas été trouvés. Installez-les avant d'exécuter ce script."
        exit 1
    }
    
    # ---------------------------------------------------------
    # Etape 3 – Exécuter le binaire (cela devrait déclencher la règle)
    # ---------------------------------------------------------
    & $exePath
    
    # ---------------------------------------------------------
    # Etape 4 – Nettoyer les artefacts
    # ---------------------------------------------------------
    Remove-Item -Force $tmpPath, $exePath
  • Commandes de Nettoyage :

    # Assurez-vous que tous les fichiers restants sont supprimés (à exécuter en tant qu'administrateur)
    Get-ChildItem "$env:TEMPNtTraceDemo.*" -ErrorAction SilentlyContinue | Remove-Item -Force