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
| Name | Type | Dir | Description |
|---|---|---|---|
| Handle | HANDLE | in | Handle 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. |
| SecurityInformation | SECURITY_INFORMATION | in | Masque binaire des parties à écrire — doit correspondre aux composants présents dans SecurityDescriptor. |
| SecurityDescriptor | PSECURITY_DESCRIPTOR | in | Pointeur vers le security descriptor auto-relatif ou absolu à appliquer. |
IDs de syscalls par version de Windows
| Version de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x18B | win10-1507 |
| Win10 1607 | 0x194 | win10-1607 |
| Win10 1703 | 0x19A | win10-1703 |
| Win10 1709 | 0x19D | win10-1709 |
| Win10 1803 | 0x19F | win10-1803 |
| Win10 1809 | 0x1A0 | win10-1809 |
| Win10 1903 | 0x1A1 | win10-1903 |
| Win10 1909 | 0x1A1 | win10-1909 |
| Win10 2004 | 0x1A7 | win10-2004 |
| Win10 20H2 | 0x1A7 | win10-20h2 |
| Win10 21H1 | 0x1A7 | win10-21h1 |
| Win10 21H2 | 0x1A9 | win10-21h2 |
| Win10 22H2 | 0x1A9 | win10-22h2 |
| Win11 21H2 | 0x1B2 | win11-21h2 |
| Win11 22H2 | 0x1B6 | win11-22h2 |
| Win11 23H2 | 0x1B6 | win11-23h2 |
| Win11 24H2 | 0x1B9 | win11-24h2 |
| Server 2016 | 0x194 | winserver-2016 |
| Server 2019 | 0x1A0 | winserver-2019 |
| Server 2022 | 0x1AF | winserver-2022 |
| Server 2025 | 0x1B9 | winserver-2025 |
Module noyau
APIs liées
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 ENDPrustTake 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