> Windows Syscalls
ntoskrnl.exeT1620T1106

NtTerminateEnclave

Démantèle une enclave, libère sa mémoire VTL1 et signale les threads encore à l'intérieur.

Prototype

NTSTATUS NtTerminateEnclave(
  PVOID    BaseAddress,
  BOOLEAN  WaitForThread
);

Arguments

NameTypeDirDescription
BaseAddressPVOIDinAdresse de base de l'enclave précédemment retournée par NtCreateEnclave.
WaitForThreadBOOLEANinTRUE bloque jusqu'à sortie des threads en enclave ; FALSE retourne aussitôt et AEX-trappe les threads survivants en asynchrone.

IDs de syscalls par version de Windows

Version 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

Module noyau

ntoskrnl.exeNtTerminateEnclave

APIs liées

TerminateEnclaveDeleteEnclaveNtCreateEnclaveNtCallEnclaveNtInitializeEnclave

Stub du 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

Notes non documentées

`NtTerminateEnclave` est le **destructeur** du cycle de vie d'enclave. Il marque l'enclave comme terminée, libère les pages VTL1 de support et démappe la vue VTL0. Quand `WaitForThread` vaut `TRUE`, le noyau attend que chaque thread hôte entré via `NtCallEnclave` revienne naturellement — c'est l'arrêt propre utilisé par `DeleteEnclave`. Avec `FALSE`, le noyau utilise une Asynchronous Enclave Exit (AEX) pour forcer les threads en vol à sortir au prochain point d'interruption ; cela peut se voir côté hôte comme un `STATUS_ENCLAVE_NOT_TERMINATED` lors d'un `NtCallEnclave` concurrent. Après retour, l'adresse de base est invalide — toute lecture côté hôte lève un page fault normal.

Usage courant par les malwares

Intérêt offensif faible. Le travail intéressant a lieu dans `NtCallEnclave` ; la terminaison est surtout du ménage. Usage de niche : un attaquant ayant amorcé un payload éphémère hébergé en enclave (ex. extrait un secret enveloppé via un bug d'enclave signée Microsoft) appellera `NtTerminateEnclave` aussitôt après pour minimiser la surface forensique — les pages VTL1 et le heap intra-enclave sont libérés et zéroïsés avant qu'une énumération sysmon/EDR puisse tourner.

Opportunités de détection

Surtout un signal de *corrélation* — un fenêtrage serré `NtCreateEnclave` … `NtTerminateEnclave` sans référence d'enclave persistante côté hôte est cohérent avec un abus one-shot ; les trustlets légitimes (LsaIso, vmms) gardent les enclaves vivantes toute la vie du processus hôte. Le provider ETW `Microsoft-Windows-Kernel-Memory` enregistre create et terminate, donc la paire peut être reconstruite a posteriori. La terminaison seule est bénigne ; se concentrer sur le pattern en burst create-call-terminate.

Exemples de syscalls directs

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

Mappings MITRE ATT&CK

Last verified: 2026-05-20