Les EDR (Endpoint Detection and Response) modernes ne reposent plus uniquement sur des signatures statiques. Ils s’appuient sur la télémétrie fournie par ETW (Event Tracing for Windows), le mécanisme de traçage natif de Windows, pour obtenir une visibilité comportementale sur ce qui s’exécute en mémoire. Neutraliser cette télémétrie est devenu une étape courante dans le développement d’outils offensifs et de frameworks de post-exploitation — et comprendre ce mécanisme est tout aussi utile pour les défenseurs.
Qu’est-ce qu’ETW ?
ETW est une infrastructure de traçage intégrée à Windows depuis NT 5.1. Elle repose sur trois composants :
- Providers : composants kernel ou user-space qui émettent des événements (ex.
Microsoft-Windows-DotNETRuntime,Microsoft-Antimalware-Scan-Interface) - Controllers : activent et configurent les sessions de traçage (ex.
logman,xperf) - Consumers : reçoivent et traitent les événements (ex. les agents EDR)
Les EDR s’enregistrent comme consumers sur des providers critiques pour surveiller l’exécution de code, les allocations mémoire, les appels réseau et les accès au système de fichiers en temps réel.
Providers critiques surveillés par les EDR
Le provider Threat Intelligence (TI) est particulièrement surveillé : il émet des événements sur VirtualAlloc, WriteProcessMemory, CreateRemoteThread et les syscalls d’injection.
ETW Patching en user-mode
La technique la plus simple consiste à patcher la fonction EtwEventWrite dans ntdll.dll, qui est le point de sortie commun de tous les événements ETW émis depuis l’espace utilisateur.
Mécanisme
// Signature de EtwEventWrite
ULONG EtwEventWrite(
REGHANDLE RegHandle,
PCEVENT_DESCRIPTOR EventDescriptor,
ULONG UserDataCount,
PEVENT_DATA_DESCRIPTOR UserData
);
En remplaçant les premiers octets par un ret immédiat, tous les événements ETW sont silencieusement ignorés avant d’atteindre les consumers :
; Patch appliqué sur EtwEventWrite
mov eax, 0 ; STATUS_SUCCESS
ret
Implémentation en C
void patch_etw() {
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
FARPROC fn = GetProcAddress(ntdll, "EtwEventWrite");
DWORD old_protect;
VirtualProtect(fn, 4, PAGE_EXECUTE_READWRITE, &old_protect);
// xor eax, eax ; ret
unsigned char patch[] = { 0x33, 0xC0, 0xC3 };
memcpy(fn, patch, sizeof(patch));
VirtualProtect(fn, 4, old_protect, &old_protect);
}
Cette approche fonctionne car ntdll.dll est mappée en mémoire dans le processus courant, et Windows autorise la modification des pages de code via VirtualProtect (sans protection kernel supplémentaire).
Limitation : le provider Threat Intelligence est kernel-mode
Le provider Microsoft-Windows-Threat-Intelligence est émis directement depuis le kernel (via EtwTiLogAllocExVm et fonctions similaires dans ntoskrnl), pas depuis ntdll. Patcher EtwEventWrite en user-space ne l’affecte pas.
Pour supprimer ces événements, il faudrait patcher NtTraceEvent ou les routines ETW du kernel — ce qui implique de travailler dans un driver kernel-mode, et donc d’affronter PatchGuard (Kernel Patch Protection), le mécanisme de Windows qui détecte et sanctionne la modification du code kernel.
Détection côté défense
Un EDR peut détecter cette technique de plusieurs manières :
- Scan d’intégrité mémoire : comparer les octets en mémoire de
EtwEventWriteavec ceux du fichierntdll.dllsur disque - Absence suspecte d’événements ETW : un processus actif qui n’émet aucun événement est statistiquement anormal
- Hook de
VirtualProtect: détecter les appels qui rendent exécutable une région du code dentdll - User-mode ETW provider callbacks : certains EDR enregistrent leurs propres callbacks qui ne passent pas par
EtwEventWrite
Implications pour la sécurité offensive
ETW patching est utilisé dans plusieurs frameworks publics de post-exploitation pour réduire la signature comportementale des payloads. Sa compréhension est bidirectionnelle :
- Offensive : réduire la visibilité d’un outil lors d’un test d’intrusion autorisé
- Défensive : comprendre les limites d’ETW pour ne pas en faire le seul pilier de détection, et privilégier des approches kernel-mode (driver EDR, PPL) pour les événements critiques
Conclusion
ETW est une infrastructure puissante mais qui repose, en partie, sur du code user-space modifiable. Le patching de EtwEventWrite est une technique accessible, documentée et largement connue des deux côtés — attaquants et défenseurs. Son efficacité réelle dépend de la profondeur d’implémentation de l’EDR ciblé. Pour un défenseur, la leçon est claire : la télémétrie doit être ancrée dans le kernel et redondée pour résister aux manipulations user-space.