NtTerminateEnclave
Räumt eine Enklave ab, gibt deren VTL1-Speicher frei und signalisiert noch in der Enklave befindliche Threads.
Prototyp
NTSTATUS NtTerminateEnclave( PVOID BaseAddress, BOOLEAN WaitForThread );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| BaseAddress | PVOID | in | Basisadresse der zuvor von NtCreateEnclave zurückgegebenen Enklave. |
| WaitForThread | BOOLEAN | in | TRUE blockiert, bis Enklaven-interne Threads austreten; FALSE kehrt sofort zurück und AEX-trappt überlebende Threads asynchron. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1709 | 0x1B4 | win10-1709 |
| Win10 1803 | 0x1B6 | win10-1803 |
| Win10 1809 | 0x1B7 | win10-1809 |
| Win10 1903 | 0x1B8 | win10-1903 |
| Win10 1909 | 0x1B8 | win10-1909 |
| Win10 2004 | 0x1BE | win10-2004 |
| Win10 20H2 | 0x1BE | win10-20h2 |
| Win10 21H1 | 0x1BE | win10-21h1 |
| Win10 21H2 | 0x1C0 | win10-21h2 |
| Win10 22H2 | 0x1C0 | win10-22h2 |
| Win11 21H2 | 0x1CA | win11-21h2 |
| Win11 22H2 | 0x1CE | win11-22h2 |
| Win11 23H2 | 0x1CE | win11-23h2 |
| Win11 24H2 | 0x1D1 | win11-24h2 |
| Server 2019 | 0x1B7 | winserver-2019 |
| Server 2022 | 0x1C6 | winserver-2022 |
| Server 2025 | 0x1D1 | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 D1 01 00 00 mov eax, 0x1D1 F6 04 25 08 03 FE 7F 01 test byte ptr [0x7FFE0308], 1 75 03 jne short +3 0F 05 syscall C3 ret CD 2E int 2Eh C3 ret
Undokumentierte Hinweise
`NtTerminateEnclave` ist der **Destruktor** des Enklaven-Lifecycle. Er markiert die Enklave als terminiert, gibt die VTL1-Backing-Pages frei und unmappt die VTL0-Sicht. Bei `WaitForThread = TRUE` wartet der Kernel, bis jeder Host-Thread, der per `NtCallEnclave` eingetreten ist, natürlich zurückkehrt — der saubere Shutdown, den `DeleteEnclave` nutzt. Bei `FALSE` nutzt der Kernel einen Asynchronous Enclave Exit (AEX), um aktive Threads am nächsten Interrupt-Punkt herauszuzwingen; der Host kann das als `STATUS_ENCLAVE_NOT_TERMINATED` bei einem konkurrenten `NtCallEnclave` sehen. Nach Rückkehr ist die Basisadresse ungültig — jeder Host-Lesezugriff löst einen normalen Page Fault aus.
Häufige Malware-Nutzung
Geringes offensives Interesse. Die interessante Arbeit passiert in `NtCallEnclave`; Termination ist meist Aufräumen. Nischennutzung: ein Angreifer, der eine kurzlebige enklaven-gehostete Payload gebootet hat (z. B. ein eingewickeltes Geheimnis via Microsoft-signiertem Enklaven-Bug extrahiert), ruft `NtTerminateEnclave` direkt danach auf, um die Forensik-Oberfläche zu minimieren — VTL1-Pages und Enklaven-interner Heap werden vor einer möglichen Sysmon-/EDR-Enumeration freigegeben und genullt.
Erkennungsmöglichkeiten
Vor allem Korrelations-Signal — ein enger `NtCreateEnclave` … `NtTerminateEnclave`-Window ohne persistente Host-seitige Enklaven-Referenzen passt zu One-Shot-Missbrauch; legitime Trustlets (LsaIso, vmms) halten Enklaven über die gesamte Host-Lebenszeit. Der ETW-Provider `Microsoft-Windows-Kernel-Memory` zeichnet sowohl Create als auch Terminate auf, das Paar lässt sich also nachträglich rekonstruieren. Termination alleine ist benign; auf das Create-Call-Terminate-Burst-Muster fokussieren.
Direkte Syscall-Beispiele
cClean enclave shutdown
// Tear down a VBS enclave and wait for in-flight threads.
#include <windows.h>
BOOL ShutdownEnclave(PVOID enclaveBase) {
if (!TerminateEnclave(enclaveBase, TRUE /*WaitForThread*/)) {
return FALSE;
}
return DeleteEnclave(enclaveBase); // releases the host-side reservation
}asmx64 direct stub (Win11 24H2)
; Direct syscall stub for NtTerminateEnclave (SSN 0x1D1 on Win11 24H2 / Server 2025)
NtTerminateEnclave PROC
mov r10, rcx ; BaseAddress
mov eax, 1D1h ; SSN
syscall
ret
NtTerminateEnclave ENDPMITRE ATT&CK-Mappings
Last verified: 2026-05-20