NtInitializeEnclave
Finalise une enclave après chargement d'image — vérifie les signatures et la rend exécutable.
Prototype
NTSTATUS NtInitializeEnclave( HANDLE ProcessHandle, PVOID BaseAddress, PVOID EnclaveInformation, ULONG EnclaveInformationLength, PULONG EnclaveError );
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| ProcessHandle | HANDLE | in | Handle vers le processus hôte. Typiquement NtCurrentProcess() ((HANDLE)-1). |
| BaseAddress | PVOID | in | Adresse de base retournée par NtCreateEnclave pour l'enclave finalisée. |
| EnclaveInformation | PVOID | in | Blob d'init type-spécifique : ENCLAVE_INIT_INFO_SGX (SIGSTRUCT + EINITTOKEN) ou ENCLAVE_INIT_INFO_VBS (LengthOfStruct + ThreadCount). |
| EnclaveInformationLength | ULONG | in | Taille en octets d'EnclaveInformation. Une incohérence avec le type d'enclave produit STATUS_INVALID_PARAMETER. |
| EnclaveError | PULONG | out | Reçoit le code d'erreur secure-kernel / SGX EINIT lors d'un STATUS_ENCLAVE_FAILURE. |
IDs de syscalls par version de Windows
| Version de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1607 | 0xF2 | win10-1607 |
| Win10 1703 | 0xF5 | win10-1703 |
| Win10 1709 | 0xF6 | win10-1709 |
| Win10 1803 | 0xF7 | win10-1803 |
| Win10 1809 | 0xF8 | win10-1809 |
| Win10 1903 | 0xF9 | win10-1903 |
| Win10 1909 | 0xF9 | win10-1909 |
| Win10 2004 | 0xFE | win10-2004 |
| Win10 20H2 | 0xFE | win10-20h2 |
| Win10 21H1 | 0xFE | win10-21h1 |
| Win10 21H2 | 0xFF | win10-21h2 |
| Win10 22H2 | 0xFF | win10-22h2 |
| Win11 21H2 | 0x104 | win11-21h2 |
| Win11 22H2 | 0x105 | win11-22h2 |
| Win11 23H2 | 0x105 | win11-23h2 |
| Win11 24H2 | 0x107 | win11-24h2 |
| Server 2016 | 0xF2 | winserver-2016 |
| Server 2019 | 0xF8 | winserver-2019 |
| Server 2022 | 0x103 | winserver-2022 |
| Server 2025 | 0x107 | winserver-2025 |
Module noyau
APIs liées
Stub du syscall
4C 8B D1 mov r10, rcx B8 07 01 00 00 mov eax, 0x107 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
`NtInitializeEnclave` est l'étape **mesure-et-scellement**. Au moment de l'appel, l'hôte a utilisé `NtLoadEnclaveData` pour copier l'image d'enclave (et ses pages de données) dans la plage VTL1 réservée. L'initialisation fait trois choses : (1) calculer le hash d'identité de l'enclave (MRENCLAVE sur SGX, hash d'image sur VBS), (2) vérifier la signature développeur face à la politique `IMAGE_ENCLAVE_CONFIG` embarquée et — sur VBS — face à la liste d'enclaves autorisées par HVCI, (3) faire basculer l'enclave de l'état *chargement* vers l'état *exécutable*. Après cet appel, aucun `NtLoadEnclaveData` supplémentaire n'est permis : la disposition mémoire est figée. Le champ `ThreadCount` d'`ENCLAVE_INIT_INFO_VBS` réserve le nombre maximum de threads d'enclave (analogue au nombre de TCS SGX) — c'est le nombre de threads hôtes pouvant être simultanément dans l'enclave via `NtCallEnclave`.
Usage courant par les malwares
Un attaquant qui atteint `NtInitializeEnclave` a déjà passé la signature d'image — les attaques pratiques ont lieu *avant* cet appel (planter une image d'enclave d'apparence anodine) ou reposent sur un bug *à l'intérieur* d'une enclave signée Microsoft exposant une primitive appelable post-init (les travaux Recon 2023). L'appel d'init lui-même est seulement le déclencheur qui accorde l'exécution. Côté défense, un retour de succès signifie qu'une enclave signée vérifiée est désormais vivante ; un attaquant détenteur d'une clé enclave Microsoft volée chaînerait `NtCreateEnclave` → `NtLoadEnclaveData` (× N) → `NtInitializeEnclave` → `NtCallEnclave` pour amorcer un payload VTL1 inauditable. Aucun malware commun ne fait cela publiquement aujourd'hui.
Opportunités de détection
L'événement ETW `Microsoft-Windows-Kernel-Memory` 6 (activité d'enclave VBS) et le journal `Microsoft-Windows-Hyper-V-Worker/Operational` enregistrent tous deux une initialisation réussie. Recouper avec `Microsoft-Windows-Security-Mitigations` pour confirmer le hash d'image. Toute init provenant d'un processus dont les modules chargés ne contiennent *pas* un `IMAGE_ENCLAVE_CONFIG.EnclaveFlags = ENCLAVE_FLAG_PRIMARY_IMAGE` ancré Microsoft et un signataire émis par Microsoft est un signal fort — presque sûrement un outil de recherche, un composant Insider Microsoft ou un attaquant avec clé volée. Coupler le syscall à l'arbre complet de processus de l'hôte : les hôtes d'enclave légitimes (LsaIso, vmms, vmcompute) ont une lignée de lancement stable.
Exemples de syscalls directs
cVBS enclave bring-up (step 3/3 — initialize)
// After CreateEnclave + LoadEnclaveData (the enclave DLL is now mapped into VTL1),
// initialise to lock layout and verify the signature against HVCI's allowlist.
#include <windows.h>
typedef struct _ENCLAVE_INIT_INFO_VBS {
ULONG Length;
ULONG ThreadCount;
} ENCLAVE_INIT_INFO_VBS;
BOOL FinalizeVbsEnclave(PVOID enclaveBase) {
ENCLAVE_INIT_INFO_VBS init = {0};
init.Length = sizeof(init);
init.ThreadCount = 4; // max concurrent host->enclave calls
DWORD enclaveError = 0;
if (!InitializeEnclave(
GetCurrentProcess(),
enclaveBase,
&init, sizeof(init),
&enclaveError)) {
// STATUS_ENCLAVE_NOT_TERMINATED / STATUS_INVALID_SIGNATURE / etc.
return FALSE;
}
return TRUE;
}asmx64 direct stub (Win11 24H2)
; Direct syscall stub for NtInitializeEnclave (SSN 0x107 on Win11 24H2 / Server 2025)
NtInitializeEnclave PROC
mov r10, rcx ; ProcessHandle
mov eax, 107h ; SSN
syscall
ret
NtInitializeEnclave ENDPMappings MITRE ATT&CK
Last verified: 2026-05-20