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
| Name | Type | Dir | Description |
|---|---|---|---|
| PortHandle | HANDLE | in | Handle abierto al puerto LPC heredado en el que escucha el servidor. |
| Message | PPORT_MESSAGE | in | Puntero 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 Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x1F | win10-1507 |
| Win10 1607 | 0x1F | win10-1607 |
| Win10 1703 | 0x1F | win10-1703 |
| Win10 1709 | 0x1F | win10-1709 |
| Win10 1803 | 0x1F | win10-1803 |
| Win10 1809 | 0x1F | win10-1809 |
| Win10 1903 | 0x1F | win10-1903 |
| Win10 1909 | 0x1F | win10-1909 |
| Win10 2004 | 0x1F | win10-2004 |
| Win10 20H2 | 0x1F | win10-20h2 |
| Win10 21H1 | 0x1F | win10-21h1 |
| Win10 21H2 | 0x1F | win10-21h2 |
| Win10 22H2 | 0x1F | win10-22h2 |
| Win11 21H2 | 0x1F | win11-21h2 |
| Win11 22H2 | 0x1F | win11-22h2 |
| Win11 23H2 | 0x1F | win11-23h2 |
| Win11 24H2 | 0x1F | win11-24h2 |
| Server 2016 | 0x1F | winserver-2016 |
| Server 2019 | 0x1F | winserver-2019 |
| Server 2022 | 0x1F | winserver-2022 |
| Server 2025 | 0x1F | winserver-2025 |
Módulo del kernel
APIs relacionadas
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 ENDPcLegacy 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