> Windows Syscalls
ntoskrnl.exeT1068T1134T1559

NtAlpcOpenSenderThread

Helper côté serveur qui ouvre un HANDLE vers le thread ayant envoyé un message ALPC donné.

Prototype

NTSTATUS NtAlpcOpenSenderThread(
  PHANDLE             ThreadHandle,
  HANDLE              PortHandle,
  PPORT_MESSAGE       PortMessage,
  ULONG               Flags,
  ACCESS_MASK         DesiredAccess,
  POBJECT_ATTRIBUTES  ObjectAttributes
);

Arguments

NameTypeDirDescription
ThreadHandlePHANDLEoutReçoit un HANDLE vers l'objet ETHREAD de l'expéditeur, ouvert avec DesiredAccess.
PortHandleHANDLEinHandle vers le port de communication ALPC du serveur ayant reçu le message.
PortMessagePPORT_MESSAGEinLe PORT_MESSAGE renvoyé par NtAlpcSendWaitReceivePort ; son ClientId.UniqueThread identifie le thread expéditeur.
FlagsULONGinDrapeaux réservés / contextuels. Typiquement 0.
DesiredAccessACCESS_MASKinMasque d'accès pour le handle retourné (ex. THREAD_QUERY_LIMITED_INFORMATION pour l'identité, THREAD_GET_CONTEXT pour inspection de stack).
ObjectAttributesPOBJECT_ATTRIBUTESinBloc d'attributs objet (généralement uniquement des flags d'héritage). Peut être NULL.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x84win10-1507
Win10 16070x84win10-1607
Win10 17030x85win10-1703
Win10 17090x85win10-1709
Win10 18030x86win10-1803
Win10 18090x86win10-1809
Win10 19030x86win10-1903
Win10 19090x86win10-1909
Win10 20040x88win10-2004
Win10 20H20x88win10-20h2
Win10 21H10x88win10-21h1
Win10 21H20x88win10-21h2
Win10 22H20x88win10-22h2
Win11 21H20x88win11-21h2
Win11 22H20x88win11-22h2
Win11 23H20x88win11-23h2
Win11 24H20x8Awin11-24h2
Server 20160x84winserver-2016
Server 20190x86winserver-2019
Server 20220x88winserver-2022
Server 20250x8Awinserver-2025

Module noyau

ntoskrnl.exeNtAlpcOpenSenderThread

APIs liées

NtAlpcOpenSenderProcessNtAlpcImpersonateClientOfPortNtAlpcSendWaitReceivePortNtOpenThreadTokenNtGetContextThreadNtQueryInformationThread

Stub du syscall

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

Analogue au niveau thread de `NtAlpcOpenSenderProcess`. Là où le helper niveau processus répond *qui* a appelé, le helper thread répond *quel thread dans qui* a appelé — utile quand un serveur doit distinguer plusieurs requêtes concurrentes du même processus client (typique dans les serveurs RPC qui pool des worker threads côté client). L'implémentation noyau `AlpcpOpenSenderThread` suit le même chemin que la variante processus mais résout l'ETHREAD depuis `ClientId.UniqueThread`. Masques d'accès courants : `THREAD_QUERY_LIMITED_INFORMATION` (pour lire `ThreadDynamicCodePolicy`, l'état d'attestation), `THREAD_SUSPEND_RESUME` (rare ; gèle l'appelant pendant une section critique).

Usage courant par les malwares

Moins utilisé que la variante processus, mais la même classe de vulnérabilité (check oublié) s'applique. Pattern d'abus spécifique : un serveur voulant honorer un *token d'impersonation* par-thread peut ouvrir le thread expéditeur puis appeler `NtOpenThreadToken(...TRUE /*OpenAsSelf*/)` pour s'emparer du token sans passer par le chemin formel `NtAlpcImpersonateClientOfPort` — court-circuitant la politique QoS ALPC. Le catalogue de recherche Forshaw-Sandbox-Escape inclut au moins deux cas (Spooler, Search Indexer) où ce vol de token via `NtAlpcOpenSenderThread` a permis un vol de token SYSTEM depuis un appelant non privilégié. Aussi utile offensivement pour disclosure de contexte thread : un attaquant ayant compromis un serveur RPC privilégié peut appeler `NtAlpcOpenSenderThread` avec `THREAD_GET_CONTEXT` et snapshoter les registres de tout client connectant — primitive de disclosure mémoire bon marché.

Opportunités de détection

Même logique d'allowlist que `NtAlpcOpenSenderProcess` — les appelants légitimes sont un ensemble petit et identifiable. Toute ouverture avec `THREAD_GET_CONTEXT` ou `THREAD_SUSPEND_RESUME` sur l'expéditeur est un fort outlier digne d'alerte indépendamment du processus. Le provider ETW `Microsoft-Windows-Threat-Intelligence` (quand activé via Defender for Endpoint) émet des événements d'ouverture de handle thread avec syscall d'origine — c'est le signal le plus propre. Depuis l'userspace, hooker `NtAlpcOpenSenderThread` dans ntdll attrape les serveurs RPC user-mode mais rate les appelants noyau ; combiner avec l'ETW syscall noyau.

Exemples de syscalls directs

cPer-thread context inspection

// Server-side: get the sending thread, then read its UMS / dynamic-code policy.
#include <windows.h>
#include <winternl.h>

NTSTATUS NTAPI NtAlpcOpenSenderThread(
    PHANDLE, HANDLE, PPORT_MESSAGE, ULONG, ACCESS_MASK, POBJECT_ATTRIBUTES);

BOOL CallerThreadAllowsDynCode(HANDLE serverPort, PPORT_MESSAGE msg) {
    HANDLE hThr = NULL;
    if (NtAlpcOpenSenderThread(
            &hThr, serverPort, msg,
            0,
            THREAD_QUERY_LIMITED_INFORMATION,
            NULL) < 0) {
        return FALSE;
    }
    PROCESS_MITIGATION_DYNAMIC_CODE_POLICY pol = {0};
    BOOL ok = GetThreadInformation(hThr, ThreadDynamicCodePolicy, &pol, sizeof(pol));
    CloseHandle(hThr);
    return ok && !pol.ProhibitDynamicCode;
}

asmx64 direct stub (Win11 24H2)

; Direct syscall stub for NtAlpcOpenSenderThread (SSN 0x8A on Win11 24H2 / Server 2025)
NtAlpcOpenSenderThread PROC
    mov  r10, rcx          ; ThreadHandle
    mov  eax, 8Ah          ; SSN
    syscall
    ret
NtAlpcOpenSenderThread ENDP

Mappings MITRE ATT&CK

Last verified: 2026-05-20