> Windows Syscalls
ntoskrnl.exeT1222T1222.001T1112

NtSetSecurityObject

Écrit un nouveau SECURITY_DESCRIPTOR (propriétaire / DACL / SACL / étiquette) sur un objet noyau via son handle.

Prototype

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

Arguments

NameTypeDirDescription
HandleHANDLEinHandle vers l'objet cible. L'accès requis dépend des bits SecurityInformation : WRITE_DAC pour DACL, WRITE_OWNER pour OWNER, ACCESS_SYSTEM_SECURITY pour SACL.
SecurityInformationSECURITY_INFORMATIONinMasque binaire des parties à écrire — doit correspondre aux composants présents dans SecurityDescriptor.
SecurityDescriptorPSECURITY_DESCRIPTORinPointeur vers le security descriptor auto-relatif ou absolu à appliquer.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
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

Module noyau

ntoskrnl.exeNtSetSecurityObject

APIs liées

SetSecurityInfoSetKernelObjectSecuritySetUserObjectSecuritySetFileSecurityWNtQuerySecurityObjectSetNamedSecurityInfoW

Stub du syscall

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

Notes non documentées

Moitié écriture de la paire security-descriptor. Le noyau fusionne, remplace ou retire des ACEs selon les flags de contrôle posés sur le descripteur fourni (SE_DACL_PROTECTED, SE_SACL_PROTECTED, …). SeAssignSecurityEx réalise la fusion réelle, avec les règles d'héritage appliquées si l'objet est un conteneur. Renvoie STATUS_INVALID_OWNER si le SID propriétaire fourni n'est pas activé dans le token de l'appelant, et STATUS_PRIVILEGE_NOT_HELD quand on demande la SACL sans SE_SECURITY_NAME.

Usage courant par les malwares

T1222 *Permissions Modification* est l'usage canonique. Deux scénarios dominent. (1) **Durcissement de persistance sur registre** : affaiblir la DACL de `HKLM\SYSTEM\CurrentControlSet\Services\<implant>` pour qu'un utilisateur faiblement privilégié puisse réécrire ImagePath / Parameters sans admin (T1222.001). (2) **Auto-protection d'implant sur fichiers** : durcir la DACL du propre EXE/DLL pour qu'une remédiation AV niveau SYSTEM rencontre ACCESS_DENIED, voire retirer Administrators de la DACL après prise de propriété — c'est ainsi que certaines notes de rançon (et l'encrypteur lui-même) survivent aux tentatives de suppression (T1222.002). Carbanak / FIN7 ont utilisé ces deux motifs contre services et fichiers de tâches planifiées.

Opportunités de détection

Signal haute-fidélité quand l'*objet cible* est sensible. L'Event 4670 d'audit accès objet (Permissions sur un objet modifiées) se déclenche si la SACL d'audit est configurée sur la cible — mais les SACLs sur `HKLM\System\...` sont rarement posées par défaut. Sysmon Event 4 (état du service Sysmon) ne couvre pas cela ; les hooks *EDR* sur NtSetSecurityObject ou sur le RtlSetSecurityObject de plus haut niveau sont la détection pratique. À chercher : tout processus autre que `services.exe`, `TrustedInstaller`, `msiexec` ou des binaires pilotés par GPO qui écrit une DACL sur une clé de service registre ou sur un fichier sous Program Files. Une DACL affaiblie accordant `Everyone:F` ou `Authenticated Users:F` à un ImagePath de service est essentiellement un indicateur fumant.

Exemples de syscalls directs

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

Mappings MITRE ATT&CK

Last verified: 2026-05-20