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
| Name | Type | Dir | Description |
|---|---|---|---|
| PortHandle | HANDLE | in | Handle ouvert sur le port LPC hérité sur lequel le serveur écoute. |
| Message | PPORT_MESSAGE | in | Pointeur vers le PORT_MESSAGE reçu du client ; son ClientId désigne le token à endosser. |
IDs de syscalls par version de Windows
| Version 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 |
Module noyau
APIs liées
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 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;
}Mappings MITRE ATT&CK
Last verified: 2026-05-20