> Windows Syscalls
ntoskrnl.exeT1620T1574T1106

NtInitializeEnclave

Schließt eine Enklave nach Image-Load ab — prüft Signaturen und überführt sie in den ausführbaren Zustand.

Prototyp

NTSTATUS NtInitializeEnclave(
  HANDLE  ProcessHandle,
  PVOID   BaseAddress,
  PVOID   EnclaveInformation,
  ULONG   EnclaveInformationLength,
  PULONG  EnclaveError
);

Argumente

NameTypeDirDescription
ProcessHandleHANDLEinHandle auf den Host-Prozess. Üblicherweise NtCurrentProcess() ((HANDLE)-1).
BaseAddressPVOIDinVon NtCreateEnclave zurückgegebene Basisadresse der zu finalisierenden Enklave.
EnclaveInformationPVOIDinTypabhängiger Init-Blob: ENCLAVE_INIT_INFO_SGX (SIGSTRUCT + EINITTOKEN) oder ENCLAVE_INIT_INFO_VBS (LengthOfStruct + ThreadCount).
EnclaveInformationLengthULONGinGröße von EnclaveInformation in Bytes. Diskrepanz mit dem Enklaventyp liefert STATUS_INVALID_PARAMETER.
EnclaveErrorPULONGoutEmpfängt den Secure-Kernel-/SGX-EINIT-Fehlercode bei STATUS_ENCLAVE_FAILURE-Rückgaben.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
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

Kernel-Modul

ntoskrnl.exeNtInitializeEnclave

Verwandte APIs

InitializeEnclaveNtCreateEnclaveNtLoadEnclaveDataNtCallEnclaveNtTerminateEnclaveEnclaveGetEnclaveInformation

Syscall-Stub

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

Undokumentierte Hinweise

`NtInitializeEnclave` ist der **Messungs- und Versiegelungs**-Schritt. Beim Aufruf hat der Host bereits per `NtLoadEnclaveData` das Enklaven-Image (und seine Datenseiten) in den reservierten VTL1-Bereich kopiert. Die Initialisierung erledigt drei Dinge: (1) Identitäts-Hash der Enklave berechnen (MRENCLAVE auf SGX, Image-Hash auf VBS), (2) Entwickler-Signatur gegen die eingebettete `IMAGE_ENCLAVE_CONFIG`-Policy und — auf VBS — gegen HVCIs Liste erlaubter Enklaven prüfen, (3) Enklave vom *Lade*-Zustand in den *ausführbaren* Zustand schalten. Nach diesem Aufruf ist kein weiteres `NtLoadEnclaveData` erlaubt: das Speicherlayout ist eingefroren. Das Feld `ThreadCount` von `ENCLAVE_INIT_INFO_VBS` reserviert die maximale Anzahl Enklaven-Threads (analog zur SGX-TCS-Anzahl) — die Anzahl Host-Threads, die gleichzeitig per `NtCallEnclave` in der Enklave sein können.

Häufige Malware-Nutzung

Ein Angreifer, der `NtInitializeEnclave` erreicht, hat die Image-Signaturprüfung bereits bestanden — die praktischen Angriffe passieren *davor* (Pflanzen eines unverdächtig wirkenden Enklaven-Images) oder beruhen auf einem Bug *innerhalb* einer Microsoft-signierten Enklave, der eine post-init aufrufbare Primitive exponiert (Recon 2023). Der Init-Call selbst ist nur der Auslöser, der Ausführung gewährt. Für Verteidiger zählt: ein erfolgreicher Return bedeutet, dass eine signierte, verifizierte Enklave nun lebt; ein Angreifer mit gestohlenem Microsoft-Enclave-Key würde `NtCreateEnclave` → `NtLoadEnclaveData` (× N) → `NtInitializeEnclave` → `NtCallEnclave` verketten, um eine nicht auditierbare VTL1-Payload zu booten. Keine Commodity-Malware tut das heute öffentlich End-to-End.

Erkennungs­möglichkeiten

ETW-Event `Microsoft-Windows-Kernel-Memory` 6 (VBS-Enklaven-Aktivität) und das Log `Microsoft-Windows-Hyper-V-Worker/Operational` protokollieren beide eine erfolgreiche Initialisierung. Mit `Microsoft-Windows-Security-Mitigations` abgleichen, um den Image-Hash zu bestätigen. Jede Init von einem Prozess, dessen geladene Module *nicht* einen Microsoft-verankerten `IMAGE_ENCLAVE_CONFIG.EnclaveFlags = ENCLAVE_FLAG_PRIMARY_IMAGE` und einen MS-Signierer enthalten, ist High-Signal — fast sicher ein Forschungstool, eine Insider-Komponente oder ein Angreifer mit gestohlenem Key. Den Syscall mit der vollen Prozess-Tree des Hosts kombinieren: legitime Enklaven-Hosts (LsaIso, vmms, vmcompute) haben eine stabile Launch-Abstammung.

Direkte Syscall-Beispiele

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

MITRE ATT&CK-Mappings

Last verified: 2026-05-20