Skip to content

Commit 54f93d5

Browse files
author
HackTricks News Bot
committed
Add content from: Chasing the Silver Fox: Cat & Mouse in Kernel Shadows
- Remove searchindex.js (auto-generated file)
1 parent adb6272 commit 54f93d5

2 files changed

Lines changed: 100 additions & 1 deletion

File tree

src/windows-hardening/av-bypass.md

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,64 @@ Detection / Mitigation
715715
• Monitor creations of new *kernel* services and alert when a driver is loaded from a world-writable directory or not present on the allow-list.
716716
• Watch for user-mode handles to custom device objects followed by suspicious `DeviceIoControl` calls.
717717
718-
### Bypassing Zscaler Client Connector Posture Checks via On-Disk Binary Patching
718+
### Silver Fox BYOVD: WatchDog amsdk.sys/wamsdk.sys (Zemana SDK) on Win10/11
719+
720+
A real-world APT campaign (“Silver Fox”) abused a signed but vulnerable antimalware driver to reliably kill EDR/AV (including PP/PPL) and sometimes elevate privileges on fully patched Windows 10/11.
721+
722+
Key points
723+
- Driver: WatchDog Anti‑Malware amsdk.sys v1.0.600 (Microsoft-signed). Internals show Zemana SDK reuse (PDB path: zam64.pdb). Loadable on modern Windows where blocklists didn’t yet include it.
724+
- Legacy path: Older variants used ZAM.exe (legacy Zemana) on Win7-era systems.
725+
- Post-patch: Vendor released wamsdk.sys v1.1.100. It fixed LPE by tightening device security but still allowed arbitrary termination of processes, including PP/PPL.
726+
727+
Root cause (amsdk.sys v1.0.600)
728+
- The device object is created via IoCreateDeviceSecure with a strong SDDL: D:P(A;;GA;;;SY)(A;;GA;;;BA) but DeviceCharacteristics omits FILE_DEVICE_SECURE_OPEN.
729+
- Without FILE_DEVICE_SECURE_OPEN, the secure DACL does not protect opens via the device namespace. Any user can open a handle by using a path with an extra component such as \\ .\\amsdk\\anyfile. Windows resolves it to the device object and returns a handle, bypassing the intended ACL.
730+
731+
Powerful IOCTLs exposed
732+
- 0x80002010 – IOCTL_REGISTER_PROCESS: Register the caller.
733+
- 0x80002048 – IOCTL_TERMINATE_PROCESS: Terminates arbitrary PIDs, including PP/PPL (the driver only avoids critical system PIDs to prevent bugchecks).
734+
- 0x8000204C – IOCTL_OPEN_PROCESS: Returns full-access handles to target processes (LPE/token‑theft pivot).
735+
- 0x80002014 / 0x80002018 – Raw disk read/write (stealth tampering possible).
736+
737+
Minimal PoC to terminate PP/PPL via user mode
738+
```c
739+
#define IOCTL_REGISTER_PROCESS 0x80002010
740+
#define IOCTL_TERMINATE_PROCESS 0x80002048
741+
742+
int main() {
743+
DWORD pidRegister = GetCurrentProcessId();
744+
DWORD pidTerminate = /* target PID */;
745+
HANDLE h = CreateFileA("\\\\.\\amsdk\\anyfile", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
746+
DeviceIoControl(h, IOCTL_REGISTER_PROCESS, &pidRegister, sizeof(pidRegister), 0, 0, 0, 0);
747+
DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &pidTerminate, sizeof(pidTerminate), 0, 0, 0, 0);
748+
return 0;
749+
}
750+
```
751+
752+
Local privilege escalation pivot
753+
- Because any user can open the device, IOCTL_OPEN_PROCESS can hand out full-access handles to privileged processes. From there you can DuplicateTokenEx/CreateProcessAsUser to jump to SYSTEM. Raw disk I/O IOCTLs can also be abused for stealthy boot/config tampering.
754+
755+
Patch and adversary response
756+
- Fix guidance: set FILE_DEVICE_SECURE_OPEN at device creation and add PP/PPL checks to block protected process termination.
757+
- Vendor patch (wamsdk.sys v1.1.100): Enforced secure opens (closing the LPE) but still allowed arbitrary termination (no PP/PPL level checks).
758+
- Signature evasion: Actors flipped a single byte in the unauthenticated RFC 3161 countersignature inside the WIN_CERTIFICATE. Result: the Microsoft Authenticode chain remains valid, but the file’s SHA‑256 changes, defeating hash‑based driver blocklists.
759+
760+
Operational tradecraft observed (loader)
761+
- Single EXE bundles the vulnerable driver(s) and a downloader module. On modern OS, amsdk.sys loads; on legacy OS, ZAM.exe path is used. The loader persists via services (e.g., Amsdk_Service kernel driver; a misspelled Termaintor service) and drops under C:\\Program Files\\RunTime.
762+
- EDR killer logic: open amsdk device; for each process name in a Base64 list (~192 entries), issue IOCTL_REGISTER_PROCESS → IOCTL_TERMINATE_PROCESS.
763+
764+
Detection ideas
765+
- Monitor creation/start of kernel driver services backed by unusual paths and registry-driven NtLoadDriver flows creating Amsdk_Service; look for user-mode opens of \\.\\amsdk* followed by DeviceIoControl 0x80002010 → 0x80002048.
766+
- Hunt for the suspicious service name "Termaintor" and drops under C:\\Program Files\\RunTime.
767+
- Keep Microsoft’s vulnerable-driver blocklist current and augment with allow/deny lists (WDAC/HVCI/Smart App Control). Track use of new hashes on known signed binaries to catch countersignature tampering.
768+
769+
References and tooling
770+
- LOLDrivers: https://github.com/magicsword-io/LOLDrivers
771+
- Microsoft Vulnerable Driver Blocklist: https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/microsoft-recommended-driver-block-rules
772+
- Terminator (Zemana BYOVD PoC): https://github.com/ZeroMemoryEx/Terminator
773+
- CPR writeup with IOCTLs/PoCs/IOCs: https://research.checkpoint.com/2025/silver-fox-apt-vulnerable-drivers/
774+
775+
719776

720777
Zscaler’s **Client Connector** applies device-posture rules locally and relies on Windows RPC to communicate the results to other components. Two weak design choices make a full bypass possible:
721778

@@ -840,4 +897,10 @@ References for PPL and tooling
840897
- [CreateProcessAsPPL launcher](https://github.com/2x7EQ13/CreateProcessAsPPL)
841898
- [Zero Salarium – Countering EDRs With The Backing Of Protected Process Light (PPL)](https://www.zerosalarium.com/2025/08/countering-edrs-with-backing-of-ppl-protection.html)
842899

900+
- [Check Point Research – Chasing the Silver Fox: Cat & Mouse in Kernel Shadows](https://research.checkpoint.com/2025/silver-fox-apt-vulnerable-drivers/)
901+
- [LOLDrivers](https://github.com/magicsword-io/LOLDrivers)
902+
- [Microsoft – Vulnerable Driver Blocklist](https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/microsoft-recommended-driver-block-rules)
903+
- [Terminator – Zemana BYOVD PoC](https://github.com/ZeroMemoryEx/Terminator)
904+
- [Watchdog Anti‑Malware (product page)](https://watchdog.com/solutions/anti-malware/)
905+
843906
{{#include ../banners/hacktricks-training.md}}

src/windows-hardening/windows-local-privilege-escalation/README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,40 @@ If a driver exposes an arbitrary kernel read/write primitive (common in poorly d
739739
arbitrary-kernel-rw-token-theft.md
740740
{{#endref}}
741741
742+
#### Abusing missing FILE_DEVICE_SECURE_OPEN on device objects (LPE + EDR kill)
743+
744+
Some signed third‑party drivers create their device object with a strong SDDL via IoCreateDeviceSecure but forget to set FILE_DEVICE_SECURE_OPEN in DeviceCharacteristics. Without this flag, the secure DACL is not enforced when the device is opened through a path containing an extra component, letting any unprivileged user obtain a handle by using a namespace path like:
745+
746+
- \\ .\\DeviceName\\anything
747+
- \\ .\\amsdk\\anyfile (from a real-world case)
748+
749+
Once a user can open the device, privileged IOCTLs exposed by the driver can be abused for LPE and tampering. Example capabilities observed in the wild:
750+
- Return full-access handles to arbitrary processes (token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser).
751+
- Unrestricted raw disk read/write (offline tampering, boot-time persistence tricks).
752+
- Terminate arbitrary processes, including Protected Process/Light (PP/PPL), allowing AV/EDR kill from user land via kernel.
753+
754+
Minimal PoC pattern (user mode):
755+
```c
756+
// Example based on a vulnerable antimalware driver
757+
#define IOCTL_REGISTER_PROCESS 0x80002010
758+
#define IOCTL_TERMINATE_PROCESS 0x80002048
759+
760+
HANDLE h = CreateFileA("\\\\.\\amsdk\\anyfile", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
761+
DWORD me = GetCurrentProcessId();
762+
DWORD target = /* PID to kill or open */;
763+
DeviceIoControl(h, IOCTL_REGISTER_PROCESS, &me, sizeof(me), 0, 0, 0, 0);
764+
DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &target, sizeof(target), 0, 0, 0, 0);
765+
```
766+
767+
Mitigations for developers
768+
- Always set FILE_DEVICE_SECURE_OPEN when creating device objects intended to be restricted by a DACL.
769+
- Validate caller context for privileged operations. Add PP/PPL checks before allowing process termination or handle returns.
770+
- Constrain IOCTLs (access masks, METHOD_*, input validation) and consider brokered models instead of direct kernel privileges.
771+
772+
Detection ideas for defenders
773+
- Monitor user-mode opens of suspicious device names (e.g., \\ .\\amsdk*) and specific IOCTL sequences indicative of abuse.
774+
- Enforce Microsoft’s vulnerable driver blocklist (HVCI/WDAC/Smart App Control) and maintain your own allow/deny lists.
775+
742776
743777
## PATH DLL Hijacking
744778
@@ -1839,4 +1873,6 @@ C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the
18391873
18401874
- [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html)
18411875
1876+
- [Check Point Research – Chasing the Silver Fox: Cat & Mouse in Kernel Shadows](https://research.checkpoint.com/2025/silver-fox-apt-vulnerable-drivers/)
1877+
18421878
{{#include ../../banners/hacktricks-training.md}}

0 commit comments

Comments
 (0)