NtInitializeEnclave
Finaliza una enclave tras la carga de imagen — verifica firmas y la deja ejecutable.
Prototipo
NTSTATUS NtInitializeEnclave( HANDLE ProcessHandle, PVOID BaseAddress, PVOID EnclaveInformation, ULONG EnclaveInformationLength, PULONG EnclaveError );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| ProcessHandle | HANDLE | in | Handle al proceso anfitrión. Típicamente NtCurrentProcess() ((HANDLE)-1). |
| BaseAddress | PVOID | in | Dirección base devuelta por NtCreateEnclave para la enclave que se finaliza. |
| EnclaveInformation | PVOID | in | Blob de inicialización específico del tipo: ENCLAVE_INIT_INFO_SGX (SIGSTRUCT + EINITTOKEN) o ENCLAVE_INIT_INFO_VBS (LengthOfStruct + ThreadCount). |
| EnclaveInformationLength | ULONG | in | Tamaño en bytes de EnclaveInformation. Una discrepancia con el tipo de enclave produce STATUS_INVALID_PARAMETER. |
| EnclaveError | PULONG | out | Recibe el código de error secure-kernel / SGX EINIT en retornos STATUS_ENCLAVE_FAILURE. |
IDs de syscalls por versión de Windows
| Versión 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 |
Módulo del kernel
APIs relacionadas
Stub del 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
Notas no documentadas
`NtInitializeEnclave` es el paso de **medición y sellado**. Cuando se invoca, el anfitrión ya ha usado `NtLoadEnclaveData` para copiar la imagen de enclave (y sus páginas de datos) en el rango VTL1 reservado. La inicialización hace tres cosas: (1) calcular el hash de identidad de la enclave (MRENCLAVE en SGX, image-hash en VBS), (2) verificar la firma del desarrollador frente a la política `IMAGE_ENCLAVE_CONFIG` embebida y — en VBS — frente a la lista de enclaves permitidas por HVCI, (3) cambiar la enclave del estado *cargando* al estado *ejecutable*. Después de esta llamada no se permiten más `NtLoadEnclaveData`: el layout de memoria queda congelado. El campo `ThreadCount` de `ENCLAVE_INIT_INFO_VBS` reserva el número máximo de hilos de enclave (análogo al recuento de TCS de SGX) — es el número de hilos del anfitrión que pueden estar dentro de la enclave simultáneamente vía `NtCallEnclave`.
Uso común por malware
Un adversario que llega a `NtInitializeEnclave` ya ha pasado el chequeo de firma de imagen — los ataques prácticos ocurren *antes* (plantando una imagen de enclave inocua), o se apoyan en un bug *dentro* de una enclave firmada por Microsoft que expone una primitiva invocable post-init (trabajo de Recon 2023). La propia llamada de init es sólo el disparador que concede la ejecución. Lo que importa al defensor es que un retorno exitoso significa que una enclave firmada y verificada está viva; un atacante con clave Microsoft robada encadenaría `NtCreateEnclave` → `NtLoadEnclaveData` (× N) → `NtInitializeEnclave` → `NtCallEnclave` para arrancar un payload VTL1 no auditable. Ninguna familia comoditizada hace esto end-to-end hoy públicamente.
Oportunidades de detección
El evento ETW `Microsoft-Windows-Kernel-Memory` 6 (actividad de enclave VBS) y el log `Microsoft-Windows-Hyper-V-Worker/Operational` registran una inicialización exitosa. Cruzar con `Microsoft-Windows-Security-Mitigations` para confirmar el hash de imagen. Cualquier init proveniente de un proceso cuyos módulos cargados *no* contienen un `IMAGE_ENCLAVE_CONFIG.EnclaveFlags = ENCLAVE_FLAG_PRIMARY_IMAGE` anclado en Microsoft y un firmante MS es señal alta — casi seguro una herramienta de investigación, un componente Insider de Microsoft o un atacante con clave robada. Combinar el syscall con el árbol de procesos completo del anfitrión: los anfitriones legítimos (LsaIso, vmms, vmcompute) tienen un linaje de lanzamiento estable.
Ejemplos de syscalls directos
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 ENDPMapeos MITRE ATT&CK
Last verified: 2026-05-20