> Windows Syscalls
ntoskrnl.exeT1620T1574T1106

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

NameTypeDirDescription
ProcessHandleHANDLEinHandle al proceso anfitrión. Típicamente NtCurrentProcess() ((HANDLE)-1).
BaseAddressPVOIDinDirección base devuelta por NtCreateEnclave para la enclave que se finaliza.
EnclaveInformationPVOIDinBlob de inicialización específico del tipo: ENCLAVE_INIT_INFO_SGX (SIGSTRUCT + EINITTOKEN) o ENCLAVE_INIT_INFO_VBS (LengthOfStruct + ThreadCount).
EnclaveInformationLengthULONGinTamaño en bytes de EnclaveInformation. Una discrepancia con el tipo de enclave produce STATUS_INVALID_PARAMETER.
EnclaveErrorPULONGoutRecibe 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 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

Módulo del kernel

ntoskrnl.exeNtInitializeEnclave

APIs relacionadas

InitializeEnclaveNtCreateEnclaveNtLoadEnclaveDataNtCallEnclaveNtTerminateEnclaveEnclaveGetEnclaveInformation

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 ENDP

Mapeos MITRE ATT&CK

Last verified: 2026-05-20