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
| Name | Type | Dir | Description |
|---|---|---|---|
| ProcessHandle | HANDLE | in | Handle auf den Host-Prozess. Üblicherweise NtCurrentProcess() ((HANDLE)-1). |
| BaseAddress | PVOID | in | Von NtCreateEnclave zurückgegebene Basisadresse der zu finalisierenden Enklave. |
| EnclaveInformation | PVOID | in | Typabhängiger Init-Blob: ENCLAVE_INIT_INFO_SGX (SIGSTRUCT + EINITTOKEN) oder ENCLAVE_INIT_INFO_VBS (LengthOfStruct + ThreadCount). |
| EnclaveInformationLength | ULONG | in | Größe von EnclaveInformation in Bytes. Diskrepanz mit dem Enklaventyp liefert STATUS_INVALID_PARAMETER. |
| EnclaveError | PULONG | out | Empfängt den Secure-Kernel-/SGX-EINIT-Fehlercode bei STATUS_ENCLAVE_FAILURE-Rückgaben. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | 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 |
Kernel-Modul
Verwandte APIs
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.
Erkennungsmö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 ENDPMITRE ATT&CK-Mappings
Last verified: 2026-05-20