> Windows Syscalls
ntoskrnl.exeT1134T1134.001T1068

NtImpersonateClientOfPort

LPC hérité : permet à un thread serveur d'usurper le contexte de sécurité du client ayant envoyé un message de port.

Prototype

NTSTATUS NtImpersonateClientOfPort(
  HANDLE        PortHandle,
  PPORT_MESSAGE Message
);

Arguments

NameTypeDirDescription
PortHandleHANDLEinHandle ouvert sur le port LPC hérité sur lequel le serveur écoute.
MessagePPORT_MESSAGEinPointeur vers le PORT_MESSAGE reçu du client ; son ClientId désigne le token à endosser.

IDs de syscalls par version de Windows

Version 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

Module noyau

ntoskrnl.exeNtImpersonateClientOfPort

APIs liées

NtAlpcImpersonateClientOfPortImpersonateNamedPipeClientRpcImpersonateClientRevertToSelfNtReplyWaitReceivePort

Stub du 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

Notes non documentées

Frère pré-ALPC de NtAlpcImpersonateClientOfPort. Les composants Windows modernes sont passés à ALPC, mais quelques ports hérités demeurent dans ntoskrnl et dans quelques services en mode utilisateur pour la compatibilité. Le SSN est figé à `0x1F` de Windows 10 1507 à Windows 11 24H2 — un indice fort que l'appel est en maintenance et non en développement actif. Retourne STATUS_ACCESS_DENIED sauf si (a) le client a préalablement accordé l'impersonation via DynamicTracking + un SecurityQualityOfService suffisant, ou (b) le serveur détient SeImpersonatePrivilege.

Usage courant par les malwares

Même classe fondamentale de bug que NtAlpcImpersonateClientOfPort : un serveur qui ne valide pas quel client il imite, ou qui oublie de comparer le PORT_MESSAGE fourni par l'appelant au message effectivement tiré de la file, peut être amené à endosser le contexte de sécurité d'un client plus privilégié. Les schémas d'exploitation historiques sont bien documentés (recherche Token Kidnapping de Cesar Cerrudo, diverses découvertes LPC de Project Zero), mais la masse d'attaque moderne a migré vers ALPC où le volume d'appels légitimes est énorme et masque mieux. L'exploitation directe de NtImpersonateClientOfPort est rare aujourd'hui et largement cantonnée aux cibles héritées.

Opportunités de détection

Le volume d'appels légitimes en 2025 est suffisamment faible pour que les défenseurs puissent référencer agressivement : énumérer tout processus l'ayant déjà appelé et traiter les valeurs aberrantes comme suspectes. ETW Microsoft-Windows-Kernel-Audit-API-Calls et le fournisseur Threat Intelligence émettent tous deux les transitions d'impersonation. Sysmon Event ID 4 (driver chargé) n'est pas pertinent, mais l'EID 1 process create + transitions d'impersonation de token subséquentes (journalisées via les capteurs alimentés par PsSetCreateThreadNotifyRoutineEx) sont le repli pratique. Les octrois de SeImpersonatePrivilege sur le token appelant sont un excellent signal précurseur.

Exemples de syscalls directs

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;
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20