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
| Name | Type | Dir | Description |
|---|---|---|---|
| BaseAddress | PVOID | in | Adresse de base de l'enclave précédemment retournée par NtCreateEnclave. |
| WaitForThread | BOOLEAN | in | TRUE 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 Windows | ID de syscall | 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 |
Module noyau
APIs liées
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 ENDPMappings MITRE ATT&CK
Last verified: 2026-05-20