Eén laag dieper dan de UAC-bypass van vorige week: het verborgen attack surface dat Microsoft zelf documenteert, dat geen admin nodig heeft, en dat in standaard-monitoring onzichtbaar blijft.
Vorige week schreef ik over de UAC-bypass van drie regels: __COMPAT_LAYER=RunAsInvoker — Microsoft-gedocumenteerd, geen exploit. De reacties gingen vooral over één vraag: "En als ik die ene env-var-truc dichttimmer, ben ik dan klaar?"
Het korte antwoord: nee. Want één laag dieper zit het écht onaangename. __COMPAT_LAYER is slechts één deur van een veel groter gebouw: de AppCompat / Shim-laag.
Deze laag is door Microsoft ontworpen om door iedere user gebruikt te kunnen worden — ook zonder admin. Daarmee is hij één van de schaarse mechanismen waarmee een gewone user persistente gedragsmodificatie kan instellen op willekeurige binaries. Zonder elevation. Zonder UAC-prompt. Zonder log-trace in standaard-monitoring.
Dat is exact waar aanvallers naar op zoek zijn. Daarom mappen MITRE ATT&CK T1546.011 (Application Shimming) en T1548.002 (Bypass UAC) precies op dit gedrag.
Onze test-binary heeft vijf concrete kaders gekregen die ieder een ander aspect van de shim-aanvalsketen aantonen. Hieronder per kader: kwetsbaarheid → mitigatie.
Eén registry-write op HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers met waarde RUNASINVOKER onderdrukt UAC op een willekeurige binary. Persistent. Overleeft reboot. Geen admin nodig — HKCU is per definitie schrijfbaar voor de user zelf.
*AppCompatFlags\Layers* doorsturen naar SIEM. Defender ATP-signaal "Suspicious AppCompat shim registration" alleen actief als ATP-EDR-sensor aan staat.
Sinds Windows 10 1607 kan sdbinst.exe -q evil.sdb een custom Shim Database installeren in user-context, zonder elevation. Entries verschijnen in HKCU\...\AppCompatFlags\InstalledSDB en ...\Custom. Mogelijke flags: InjectDll, RedirectShortcut, VirtualRegistry, DisableNXShowUI. DLL-injectie in een legitieme proces-context — Defender ziet een normale notepad.exe.
sdbinst.exe voor alle non-admin users. WDAC-policy die alleen Microsoft-getekende SDB-bestanden toestaat. Sysmon EID 1 op sdbinst-command-lines waar parent geen legitieme installer is.
RunAsInvoker is bekendst. Maar de hele matrix is een database aan gedrag-modificaties: RunAsHighest, WinXPSP3, Win7RTM, Win8RTM, Installer, Telemetry. Met __COMPAT_LAYER=WinXPSP3 kan een aanvaller exploits voor oudere Windows-versies hergebruiken op Windows 11 via OS-version-spoofing. Niet één kwetsbaarheid — een hele kwetsbaarheidsfamilie.
__COMPAT_LAYER= in command-line of process-environment markeren. Defender ATP Advanced Hunting: DeviceProcessEvents | where ProcessCommandLine contains "__COMPAT_LAYER".
Geen aanval, maar een audit van de detectie-capaciteit van het endpoint zelf: Sysmon, Defender Real-Time-Protection, Behavior Monitoring, Tamper Protection, AMSI, en bovenal PowerShell ScriptBlockLogging (EID 4104) en ModuleLogging (EID 4103). Zonder deze logging is shim-misuse via PowerShell-one-liners onzichtbaar — er is geen artefact achteraf. Tamper Protection moet aan staan, anders kan Defender zelf per script worden uitgezet voorafgaand aan de aanval.
Mitigatie: 7-punts defensie-checklist: Sysmon-baseline (SwiftOnSecurity of Olaf Hartong), RTP actief, Tamper Protection aan, AMSI-EDR-integratie, ScriptBlockLogging via GPO, Windows Event Forwarding naar SIEM, complete audit-policy op registry-writes en process-creation.Audit-mechanisme dat bestaande entries in HKCU/HKLM Layers, InstalledSDB en Custom dumpt. Doel: vinden of er ooit een shim-aanval heeft plaatsgevonden waarvan de artefacten nog steeds aanwezig zijn. Een succesvolle shim-attack van 6 maanden terug zit nog steeds in de user-registry. De aanvaller is allang weg, maar de RUNASINVOKER-flag op %LOCALAPPDATA%\foo.exe is nooit opgeruimd. De persistence is nog intact — de aanvaller hoeft alleen terug te komen.
De aannames waarop veel endpoint-strategieën rusten, zijn precies de plekken waar deze aanvalsketen door heen glipt.
| Aanname | Werkelijkheid |
|---|---|
| "Zonder admin kan een user niet aan UAC-gedrag komen." | Via HKCU Layers + RUNASINVOKER onderdrukt een user UAC-prompts op willekeurige binaries — persistent. |
| "Shim Databases vereisen admin om te installeren." | Per-user-route via sdbinst.exe werkt sinds Windows 10 1607 zonder elevation. |
| "Defender vangt dit wel." | Alleen als ATP-EDR-sensor + Tamper Protection + Behavior Monitoring + ScriptBlockLogging allemaal actief zijn. |
| "Onze AppLocker-policy dekt dit." | Alleen als sdbinst.exe expliciet geblokt is — standaard-policies missen het. |
| "In de logs zien we het later wel terug." | Alleen als Sysmon, registry-auditing en command-line-logging uren vóór het incident al actief waren. |
| "OS-versie-spoofing is een legacy-probleem." | Met __COMPAT_LAYER=WinXPSP3 kunnen aanvallers exploits voor oudere Windows-versies hergebruiken op Windows 11. |
Dezelfde driedeling die we vorige week introduceerden, want zonder dat raamwerk blijft elke maatregel een losse tool en elke audit een momentopname:
A1 t/m A5 op uw werkplek draaien. Evidence-based vaststellen: wat slaagt, wat faalt? Welke endpoints zijn kwetsbaar, welke detectie ontbreekt? Geen aannames, alleen feiten.
GPO Turn off Application Compatibility Engine waar mogelijk. AppLocker- of WDAC-blok op sdbinst.exe. Sysmon EID 12/13 op AppCompatFlags\Layers doorsturen naar SIEM. PowerShell ScriptBlockLogging via GPO afdwingen.
Endpoint-baseline met scheduled audit op Layers / InstalledSDB / Custom. Just-In-Time admin-model. Governance-mapping op NEN 7510, ISO 27001 (A.8.2 Privileged Access, A.8.16 Monitoring) en NIS2 (Art. 21 risk-management measures).
De aanvaller hoeft alleen de zwakste schakel te kennen. U moet ze allemaal kennen — voordat de aanvaller dat doet.
We tonen u eerst wát er kapot is, fixen het, en bouwen het zo dat het kapot-zijn structureel niet meer terugkomt — gemapped op de normen waarop u toch al wordt afgerekend.
Het verschil tussen een endpoint dat veilig is en een endpoint dat veilig lijkt is niet de aanwezigheid van Defender.
Het is de combinatie van testen, mitigeren en voorkomen — in die volgorde.
Christian Glebbeek — iCt Horse | Connecting the dots