> Windows Syscalls
ntoskrnl.exeT1620T1106

NtTerminateEnclave

Desmonta una enclave, libera su memoria VTL1 y señala los hilos aún dentro.

Prototipo

NTSTATUS NtTerminateEnclave(
  PVOID    BaseAddress,
  BOOLEAN  WaitForThread
);

Argumentos

NameTypeDirDescription
BaseAddressPVOIDinDirección base de la enclave devuelta previamente por NtCreateEnclave.
WaitForThreadBOOLEANinTRUE bloquea hasta que los hilos en la enclave salgan; FALSE retorna de inmediato y AEX-atrapa los hilos sobrevivientes de forma asíncrona.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 17090x1B4win10-1709
Win10 18030x1B6win10-1803
Win10 18090x1B7win10-1809
Win10 19030x1B8win10-1903
Win10 19090x1B8win10-1909
Win10 20040x1BEwin10-2004
Win10 20H20x1BEwin10-20h2
Win10 21H10x1BEwin10-21h1
Win10 21H20x1C0win10-21h2
Win10 22H20x1C0win10-22h2
Win11 21H20x1CAwin11-21h2
Win11 22H20x1CEwin11-22h2
Win11 23H20x1CEwin11-23h2
Win11 24H20x1D1win11-24h2
Server 20190x1B7winserver-2019
Server 20220x1C6winserver-2022
Server 20250x1D1winserver-2025

Módulo del kernel

ntoskrnl.exeNtTerminateEnclave

APIs relacionadas

TerminateEnclaveDeleteEnclaveNtCreateEnclaveNtCallEnclaveNtInitializeEnclave

Stub del syscall

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

Notas no documentadas

`NtTerminateEnclave` es el **destructor** del ciclo de vida de la enclave. Marca la enclave como terminada, libera las páginas VTL1 de respaldo y desmapea la vista VTL0. Cuando `WaitForThread` es `TRUE`, el kernel espera a que cada hilo del anfitrión que entró vía `NtCallEnclave` retorne naturalmente — es el apagado limpio que usa `DeleteEnclave`. Con `FALSE`, el kernel usa Asynchronous Enclave Exit (AEX) para forzar a los hilos en vuelo a salir en el siguiente punto de interrupción; el anfitrión puede observar esto como `STATUS_ENCLAVE_NOT_TERMINATED` en un `NtCallEnclave` concurrente. Tras el retorno, la dirección base es inválida — cualquier lectura del anfitrión genera un page fault normal.

Uso común por malware

Interés ofensivo bajo. El trabajo interesante ocurre en `NtCallEnclave`; la terminación es sobre todo limpieza. Uso de nicho: un atacante que ha arrancado un payload transitorio hospedado en enclave (p. ej. extraído un secreto envuelto vía un bug de enclave firmada por Microsoft) llamará a `NtTerminateEnclave` inmediatamente después para minimizar superficie forense — las páginas VTL1 y el heap intra-enclave se liberan y ceran antes de que cualquier enumeración sysmon/EDR pueda correr.

Oportunidades de detección

Sobre todo señal de *correlación* — una ventana corta `NtCreateEnclave` … `NtTerminateEnclave` sin referencias de enclave persistentes en el anfitrión es coherente con abuso one-shot; los trustlets legítimos (LsaIso, vmms) mantienen las enclaves vivas durante toda la vida del proceso. El proveedor ETW `Microsoft-Windows-Kernel-Memory` registra create y terminate, así que el par puede reconstruirse a posteriori. La terminación aislada es benigna; concentrarse en el patrón en ráfaga create-call-terminate.

Ejemplos de syscalls directos

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 ENDP

Mapeos MITRE ATT&CK

Last verified: 2026-05-20