NtAccessCheckByTypeResultList
Führt eine typisierte Zugriffsprüfung mit einer Ergebnisliste pro Objekttyp aus, ohne Audit-Events zu schreiben.
Prototyp
NTSTATUS NtAccessCheckByTypeResultList( PSECURITY_DESCRIPTOR SecurityDescriptor, PSID PrincipalSelfSid, HANDLE ClientToken, ACCESS_MASK DesiredAccess, POBJECT_TYPE_LIST ObjectTypeList, ULONG ObjectTypeListLength, PGENERIC_MAPPING GenericMapping, PPRIVILEGE_SET PrivilegeSet, PULONG PrivilegeSetLength, PACCESS_MASK GrantedAccessList, PNTSTATUS AccessStatusList );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| SecurityDescriptor | PSECURITY_DESCRIPTOR | in | Sicherheitsdeskriptor des zusammengesetzten Objekts, dessen Property Sets geprüft werden. |
| PrincipalSelfSid | PSID | in | Optionale SID, die in ACEs für PRINCIPAL_SELF eingesetzt wird (bei Active-Directory-Principal-Objekten). |
| ClientToken | HANDLE | in | Impersonation-Token des Clients, dessen Zugriff bewertet wird. |
| DesiredAccess | ACCESS_MASK | in | Zugriffsrechte, die gegen jeden Eintrag von ObjectTypeList ausgewertet werden. |
| ObjectTypeList | POBJECT_TYPE_LIST | in | Baum-geflachtetes Listenformat von Objekttypen (Objekt + Property Sets + Properties) — die Prüfung läuft einmal pro Eintrag. |
| ObjectTypeListLength | ULONG | in | Anzahl der Einträge in ObjectTypeList. Dimensioniert auch GrantedAccessList und AccessStatusList. |
| GenericMapping | PGENERIC_MAPPING | in | Pro-Objekttyp-Mapping von GENERIC_* auf spezifische Rechte. |
| PrivilegeSet | PPRIVILEGE_SET | in/out | Erhält die von der Prüfung verwendeten Privilegien (z. B. SE_SECURITY_NAME für SACL-Zugriff). |
| PrivilegeSetLength | PULONG | in/out | Beim Eintritt Größe des PrivilegeSet-Puffers; beim Austritt erforderliche / verwendete Bytes. |
| GrantedAccessList | PACCESS_MASK | out | Array von ObjectTypeListLength Zugriffsmasken, eine pro Listeneintrag, mit den auf jeder Ebene gewährten Rechten. |
| AccessStatusList | PNTSTATUS | out | Array von ObjectTypeListLength NTSTATUS-Werten — STATUS_SUCCESS oder STATUS_ACCESS_DENIED pro Eintrag. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0x64 | win10-1507 |
| Win10 1607 | 0x64 | win10-1607 |
| Win10 1703 | 0x64 | win10-1703 |
| Win10 1709 | 0x64 | win10-1709 |
| Win10 1803 | 0x64 | win10-1803 |
| Win10 1809 | 0x64 | win10-1809 |
| Win10 1903 | 0x64 | win10-1903 |
| Win10 1909 | 0x64 | win10-1909 |
| Win10 2004 | 0x64 | win10-2004 |
| Win10 20H2 | 0x64 | win10-20h2 |
| Win10 21H1 | 0x64 | win10-21h1 |
| Win10 21H2 | 0x64 | win10-21h2 |
| Win10 22H2 | 0x64 | win10-22h2 |
| Win11 21H2 | 0x64 | win11-21h2 |
| Win11 22H2 | 0x64 | win11-22h2 |
| Win11 23H2 | 0x64 | win11-23h2 |
| Win11 24H2 | 0x64 | win11-24h2 |
| Server 2016 | 0x64 | winserver-2016 |
| Server 2019 | 0x64 | winserver-2019 |
| Server 2022 | 0x64 | winserver-2022 |
| Server 2025 | 0x64 | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 64 00 00 00 mov eax, 0x64 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
Undokumentierte Hinweise
Wie NtAccessCheckByType, liefert aber einen *Vektor* von Zugriffsentscheidungen — ein Eintrag pro ObjectTypeList-Element — statt eines einzelnen zusammengesetzten Urteils. Der kanonische Anwendungsfall ist Active Directory: ein einziger Versuch, ein Benutzerobjekt zu lesen, kann gleichzeitig die Bewertung des Objekts selbst plus mehrerer Property-Set-ACEs (z. B. Personal-Information, Public-Information, Account-Restrictions) erfordern. Die Ergebnisliste erlaubt dem Aufrufer, exakt zu melden, welches Property Set verweigert wurde. Die SSN `0x64` ist über alle unterstützten Windows-Builds seit 1507 stabil. Keine Audit-Emissions-Seiteneffekte — bei SACL-erzwungenem Logging mit NtAccessCheckByTypeResultListAndAuditAlarm kombinieren.
Häufige Malware-Nutzung
Praktisch null. Die Funktion wird von LSASS, NTDS und SAM/AD-bewussten Komponenten genutzt; Commodity-Malware hat keinen Grund für strukturierte AD-artige ACL-Prüfungen. Der Malware-Winkel ist umgekehrt: Angreifer fragen AD-ACLs ab (BloodHound, PowerView), um Operationen zu *vermeiden*, die anderswo Audit-Alarm-Prüfungen auslösen würden.
Erkennungsmöglichkeiten
Auf einem Domain Controller wird die Aufrufrate von ntdsa.dll innerhalb von lsass.exe dominiert. Anomale Aufrufer (alles außerhalb von {lsass.exe, services.exe, einem MS-signierten AD-Dienst}) sind über ETW Microsoft-Windows-Kernel-Audit-API-Calls markierungswürdig. Auf einer Workstation ist der Aufruf außerhalb LSASS-seitiger Credential-Validierungs-Pfade selten; ungewöhnliche Images, die ihn aufrufen, rechtfertigen Untersuchung.
Direkte Syscall-Beispiele
asmx64 direct stub
; Direct syscall stub for NtAccessCheckByTypeResultList (SSN 0x64, Win10 1507+)
NtAccessCheckByTypeResultList PROC
mov r10, rcx ; syscall convention
mov eax, 64h ; SSN
syscall
ret
NtAccessCheckByTypeResultList ENDPcPer-property-set decision (AD-style)
// Evaluate read access against an AD user object plus two property sets.
OBJECT_TYPE_LIST otl[3] = {
{ ACCESS_OBJECT_GUID, 0, &GUID_USER_OBJECT }, // level 0
{ ACCESS_PROPERTY_SET_GUID, 0, &GUID_PERSONAL_INFO }, // level 1
{ ACCESS_PROPERTY_SET_GUID, 0, &GUID_PUBLIC_INFO }, // level 1
};
ACCESS_MASK granted[3] = {0};
NTSTATUS statuses[3] = {0};
PRIVILEGE_SET privs;
ULONG privs_len = sizeof privs;
NTSTATUS rc = NtAccessCheckByTypeResultList(
pSd, NULL, hClientToken,
READ_CONTROL | ADS_RIGHT_DS_READ_PROP,
otl, ARRAYSIZE(otl),
&g_DsGenericMapping,
&privs, &privs_len,
granted, statuses);
// Inspect statuses[0..2] to report which property set was denied.MITRE ATT&CK-Mappings
Last verified: 2026-05-20