> Windows Syscalls
ntoskrnl.exeT1134T1134.001T1068

NtImpersonateClientOfPort

LPC heredado: permite a un hilo servidor suplantar el contexto de seguridad del cliente que envió un mensaje de puerto.

Prototipo

NTSTATUS NtImpersonateClientOfPort(
  HANDLE        PortHandle,
  PPORT_MESSAGE Message
);

Argumentos

NameTypeDirDescription
PortHandleHANDLEinHandle abierto al puerto LPC heredado en el que escucha el servidor.
MessagePPORT_MESSAGEinPuntero al PORT_MESSAGE recién recibido del cliente; su ClientId selecciona qué token asumir.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070x1Fwin10-1507
Win10 16070x1Fwin10-1607
Win10 17030x1Fwin10-1703
Win10 17090x1Fwin10-1709
Win10 18030x1Fwin10-1803
Win10 18090x1Fwin10-1809
Win10 19030x1Fwin10-1903
Win10 19090x1Fwin10-1909
Win10 20040x1Fwin10-2004
Win10 20H20x1Fwin10-20h2
Win10 21H10x1Fwin10-21h1
Win10 21H20x1Fwin10-21h2
Win10 22H20x1Fwin10-22h2
Win11 21H20x1Fwin11-21h2
Win11 22H20x1Fwin11-22h2
Win11 23H20x1Fwin11-23h2
Win11 24H20x1Fwin11-24h2
Server 20160x1Fwinserver-2016
Server 20190x1Fwinserver-2019
Server 20220x1Fwinserver-2022
Server 20250x1Fwinserver-2025

Módulo del kernel

ntoskrnl.exeNtImpersonateClientOfPort

APIs relacionadas

NtAlpcImpersonateClientOfPortImpersonateNamedPipeClientRpcImpersonateClientRevertToSelfNtReplyWaitReceivePort

Stub del syscall

4C 8B D1            mov r10, rcx
B8 1F 00 00 00      mov eax, 0x1F
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

Hermano pre-ALPC de NtAlpcImpersonateClientOfPort. Los componentes modernos de Windows han migrado a ALPC, pero unos pocos puertos heredados permanecen en ntoskrnl y en algunos servicios en modo usuario por compatibilidad. El SSN ha sido fijo en `0x1F` desde Windows 10 1507 hasta 11 24H2 — una fuerte señal de que la llamada está en mantenimiento, no en desarrollo activo. Devuelve STATUS_ACCESS_DENIED a menos que (a) el cliente haya concedido previamente impersonación vía DynamicTracking + un SecurityQualityOfService suficiente, o (b) el servidor tenga SeImpersonatePrivilege.

Uso común por malware

Misma clase fundamental de bug que NtAlpcImpersonateClientOfPort: un servidor que no valida a qué cliente está suplantando, o que olvida verificar el PORT_MESSAGE provisto por el llamador contra el mensaje realmente sacado de la cola, puede ser inducido a asumir el contexto de seguridad de un cliente más privilegiado. Los patrones de explotación históricos están bien documentados (investigación Token Kidnapping de Cesar Cerrudo, varios hallazgos LPC de Project Zero), pero la masa de ataque moderna ha migrado a ALPC, donde el volumen de llamadas legítimas es enorme y oculta mejor. La explotación directa de NtImpersonateClientOfPort hoy es rara y queda confinada en gran medida a objetivos heredados.

Oportunidades de detección

El volumen de llamadas legítimas en 2025 es lo bastante bajo como para que los defensores puedan baselinizar agresivamente: enumerar todo proceso que la haya llamado y tratar las salidas como sospechosas. ETW Microsoft-Windows-Kernel-Audit-API-Calls y el proveedor Threat Intelligence emiten transiciones de impersonación. Sysmon Event ID 4 (driver cargado) no es relevante, pero EID 1 process create + transiciones subsecuentes de impersonación de token (registradas vía sensores alimentados por PsSetCreateThreadNotifyRoutineEx) son el respaldo práctico. Las concesiones de SeImpersonatePrivilege sobre el token llamante son un excelente señal precursora.

Ejemplos de syscalls directos

asmx64 direct stub

; Direct syscall stub for NtImpersonateClientOfPort (SSN 0x1F, stable across builds)
NtImpersonateClientOfPort PROC
    mov  r10, rcx
    mov  eax, 1Fh
    syscall
    ret
NtImpersonateClientOfPort ENDP

cLegacy LPC server impersonation skeleton

// Server side of a legacy LPC port. Once a client has connected and sent a request,
// the server can briefly act as that client to perform a privileged operation on
// the client's behalf. This is the same shape as the early-2000s "Token Kidnapping"
// research where missing caller-message validation led to EoP.
NTSTATUS handle_client_request(HANDLE PortHandle, PPORT_MESSAGE Msg) {
    NTSTATUS s = NtImpersonateClientOfPort(PortHandle, Msg);
    if (!NT_SUCCESS(s)) return s;

    // *** Now running with the client's token ***
    // do_privileged_thing_on_behalf_of_client();

    RevertToSelf();
    return s;
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20