> Windows Syscalls
ntoskrnl.exeT1222T1222.001T1112

NtSetSecurityObject

Schreibt einen neuen SECURITY_DESCRIPTOR (Owner / DACL / SACL / Label) auf ein Kernel-Objekt anhand des Handles.

Prototyp

NTSTATUS NtSetSecurityObject(
  HANDLE               Handle,
  SECURITY_INFORMATION SecurityInformation,
  PSECURITY_DESCRIPTOR SecurityDescriptor
);

Argumente

NameTypeDirDescription
HandleHANDLEinHandle auf das Zielobjekt. Der erforderliche Zugriff hängt von den SecurityInformation-Bits ab: WRITE_DAC für DACL, WRITE_OWNER für OWNER, ACCESS_SYSTEM_SECURITY für SACL.
SecurityInformationSECURITY_INFORMATIONinBitmaske der zu schreibenden Bestandteile — muss mit den in SecurityDescriptor vorhandenen Komponenten übereinstimmen.
SecurityDescriptorPSECURITY_DESCRIPTORinZeiger auf den anzuwendenden self-relativen oder absoluten Security Descriptor.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070x18Bwin10-1507
Win10 16070x194win10-1607
Win10 17030x19Awin10-1703
Win10 17090x19Dwin10-1709
Win10 18030x19Fwin10-1803
Win10 18090x1A0win10-1809
Win10 19030x1A1win10-1903
Win10 19090x1A1win10-1909
Win10 20040x1A7win10-2004
Win10 20H20x1A7win10-20h2
Win10 21H10x1A7win10-21h1
Win10 21H20x1A9win10-21h2
Win10 22H20x1A9win10-22h2
Win11 21H20x1B2win11-21h2
Win11 22H20x1B6win11-22h2
Win11 23H20x1B6win11-23h2
Win11 24H20x1B9win11-24h2
Server 20160x194winserver-2016
Server 20190x1A0winserver-2019
Server 20220x1AFwinserver-2022
Server 20250x1B9winserver-2025

Kernel-Modul

ntoskrnl.exeNtSetSecurityObject

Verwandte APIs

SetSecurityInfoSetKernelObjectSecuritySetUserObjectSecuritySetFileSecurityWNtQuerySecurityObjectSetNamedSecurityInfoW

Syscall-Stub

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

Die schreibende Hälfte des Security-Descriptor-Paares. Der Kernel merged, ersetzt oder entfernt ACEs gemäß den Kontrollflags des übergebenen Descriptors (SE_DACL_PROTECTED, SE_SACL_PROTECTED, …). SeAssignSecurityEx führt das eigentliche Merge durch, samt Vererbungsregeln, falls das Objekt ein Container ist. Liefert STATUS_INVALID_OWNER, wenn die übergebene Owner-SID im Token des Aufrufers nicht aktiviert ist, und STATUS_PRIVILEGE_NOT_HELD bei SACL-Anforderung ohne SE_SECURITY_NAME.

Häufige Malware-Nutzung

T1222 *Permissions Modification* ist die kanonische Anwendung. Zwei Szenarien dominieren. (1) **Persistenz-Hardening auf Registry**: die DACL von `HKLM\SYSTEM\CurrentControlSet\Services\<Implant>` so abschwächen, dass ein niedrig privilegierter Benutzer später ImagePath / Parameters ohne Admin überschreiben kann (T1222.001). (2) **Implant-Selbstschutz auf Dateien**: die DACL der eigenen EXE/DLL so verschärfen, dass eine SYSTEM-AV-Remediation auf ACCESS_DENIED läuft, oder Administrators nach Ownership-Übernahme aus der DACL entfernen — so überleben manche Ransom-Notes (und der Encryptor selbst) Löschversuche (T1222.002). Carbanak / FIN7 haben beide Muster gegen Services und Scheduled-Task-Dateien eingesetzt.

Erkennungs­möglichkeiten

Hochwertiges Signal, wenn das *Zielobjekt* sensibel ist. Object-Access-Audit-Event 4670 (Berechtigungen geändert) feuert, wenn SACL-Audit am Ziel konfiguriert ist — auf `HKLM\System\...` sind SACLs aber selten standardmäßig gesetzt. Sysmon Event 4 (Sysmon-Dienststatus) deckt das nicht ab; praktische Detection sind *EDR*-Hooks auf NtSetSecurityObject oder das höhergradige RtlSetSecurityObject. Suchen nach: jedem Prozess außer `services.exe`, `TrustedInstaller`, `msiexec` oder GPO-getriebenen Binaries, der eine DACL auf einen Service-Registry-Schlüssel oder eine Datei unter Program Files schreibt. Eine geschwächte DACL, die `Everyone:F` oder `Authenticated Users:F` auf einen Service-ImagePath gewährt, ist im Grunde ein rauchender Colt.

Direkte Syscall-Beispiele

cWeaken DACL on a service registry key (skeleton)

// Add an explicit Allow-Full-Control ACE for Authenticated Users on the
// service's registry key, enabling later config rewrite without admin.
PSECURITY_DESCRIPTOR sd = NULL;
ULONG sdLen = 0;
ConvertStringSecurityDescriptorToSecurityDescriptorW(
    L"D:(A;OICI;GA;;;AU)",  // Authenticated Users : Generic All, container+object inherit
    SDDL_REVISION_1, &sd, &sdLen);

NTSTATUS st = NtSetSecurityObject(hSvcKey, DACL_SECURITY_INFORMATION, sd);
// hSvcKey must have been opened with WRITE_DAC.
LocalFree(sd);

asmx64 direct stub (Win11 24H2 SSN 0x1B9)

NtSetSecurityObject PROC
    mov  r10, rcx
    mov  eax, 1B9h
    syscall
    ret
NtSetSecurityObject ENDP

rustTake ownership of own binary, then deny Administrators

// Cargo: windows-sys = "0.59", ntapi = "0.4"
// Step 1: take ownership (requires SeTakeOwnershipPrivilege enabled).
unsafe {
    NtSetSecurityObject(h_file,
        OWNER_SECURITY_INFORMATION,
        owner_sd_with_self_sid.as_ptr() as _);
}
// Step 2: now write a DACL that denies Administrators Delete/WriteAttrib.
unsafe {
    NtSetSecurityObject(h_file,
        DACL_SECURITY_INFORMATION,
        deny_admins_dacl.as_ptr() as _);
}

MITRE ATT&CK-Mappings

Last verified: 2026-05-20