> Windows Syscalls
ntoskrnl.exeT1620T1574T1106

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

NameTypeDirDescription
ProcessHandleHANDLEinHandle vers le processus hôte. Typiquement NtCurrentProcess() ((HANDLE)-1).
BaseAddressPVOIDinAdresse de base retournée par NtCreateEnclave pour l'enclave finalisée.
EnclaveInformationPVOIDinBlob d'init type-spécifique : ENCLAVE_INIT_INFO_SGX (SIGSTRUCT + EINITTOKEN) ou ENCLAVE_INIT_INFO_VBS (LengthOfStruct + ThreadCount).
EnclaveInformationLengthULONGinTaille en octets d'EnclaveInformation. Une incohérence avec le type d'enclave produit STATUS_INVALID_PARAMETER.
EnclaveErrorPULONGoutReçoit le code d'erreur secure-kernel / SGX EINIT lors d'un STATUS_ENCLAVE_FAILURE.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 16070xF2win10-1607
Win10 17030xF5win10-1703
Win10 17090xF6win10-1709
Win10 18030xF7win10-1803
Win10 18090xF8win10-1809
Win10 19030xF9win10-1903
Win10 19090xF9win10-1909
Win10 20040xFEwin10-2004
Win10 20H20xFEwin10-20h2
Win10 21H10xFEwin10-21h1
Win10 21H20xFFwin10-21h2
Win10 22H20xFFwin10-22h2
Win11 21H20x104win11-21h2
Win11 22H20x105win11-22h2
Win11 23H20x105win11-23h2
Win11 24H20x107win11-24h2
Server 20160xF2winserver-2016
Server 20190xF8winserver-2019
Server 20220x103winserver-2022
Server 20250x107winserver-2025

Module noyau

ntoskrnl.exeNtInitializeEnclave

APIs liées

InitializeEnclaveNtCreateEnclaveNtLoadEnclaveDataNtCallEnclaveNtTerminateEnclaveEnclaveGetEnclaveInformation

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 ENDP

Mappings MITRE ATT&CK

Last verified: 2026-05-20