> Windows Syscalls
ntoskrnl.exeT1222T1222.001T1112

NtSetSecurityObject

Escribe un nuevo SECURITY_DESCRIPTOR (propietario / DACL / SACL / etiqueta) sobre un objeto del kernel por handle.

Prototipo

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

Argumentos

NameTypeDirDescription
HandleHANDLEinHandle al objeto objetivo. El acceso requerido depende de los bits de SecurityInformation: WRITE_DAC para DACL, WRITE_OWNER para OWNER, ACCESS_SYSTEM_SECURITY para SACL.
SecurityInformationSECURITY_INFORMATIONinMáscara de bits de partes a escribir — debe coincidir con los componentes presentes en SecurityDescriptor.
SecurityDescriptorPSECURITY_DESCRIPTORinPuntero al descriptor de seguridad auto-relativo o absoluto a aplicar.

IDs de syscalls por versión de Windows

Versión 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

Módulo del kernel

ntoskrnl.exeNtSetSecurityObject

APIs relacionadas

SetSecurityInfoSetKernelObjectSecuritySetUserObjectSecuritySetFileSecurityWNtQuerySecurityObjectSetNamedSecurityInfoW

Stub del 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

Notas no documentadas

Mitad de escritura del par security-descriptor. El kernel fusiona, reemplaza o quita ACEs según las banderas de control puestas en el descriptor proporcionado (SE_DACL_PROTECTED, SE_SACL_PROTECTED, …). SeAssignSecurityEx realiza la fusión real, con reglas de herencia aplicadas si el objeto es un contenedor. Devuelve STATUS_INVALID_OWNER si el SID propietario provisto no está habilitado en el token del llamador, y STATUS_PRIVILEGE_NOT_HELD cuando se solicita la SACL sin SE_SECURITY_NAME.

Uso común por malware

T1222 *Permissions Modification* es el uso canónico. Dominan dos escenarios. (1) **Endurecimiento de persistencia en registro**: debilitar la DACL de `HKLM\SYSTEM\CurrentControlSet\Services\<implante>` para que un usuario de bajo privilegio pueda reescribir ImagePath / Parameters sin admin (T1222.001). (2) **Auto-protección de implante en archivos**: endurecer la DACL del propio EXE/DLL para que la remediación AV nivel SYSTEM encuentre ACCESS_DENIED, o incluso quitar Administrators de la DACL tras tomar propiedad — así sobreviven algunas notas de rescate (y el propio encriptador) a los intentos de eliminación (T1222.002). Carbanak / FIN7 han usado ambos patrones contra servicios y archivos de tareas programadas.

Oportunidades de detección

Señal de alta fidelidad cuando el *objeto objetivo* es sensible. El Event 4670 de auditoría de acceso a objetos (Permisos sobre un objeto fueron cambiados) dispara si la SACL de auditoría está configurada sobre el objetivo — pero las SACL sobre `HKLM\System\...` raramente están puestas por defecto. Sysmon Event 4 (estado del servicio Sysmon) no cubre esto; los hooks *EDR* sobre NtSetSecurityObject o sobre el RtlSetSecurityObject de más alto nivel son la detección práctica. Buscar: cualquier proceso distinto de `services.exe`, `TrustedInstaller`, `msiexec` o binarios dirigidos por GPO que escriba una DACL sobre una clave de servicio del registro o sobre un fichero bajo Program Files. Una DACL debilitada que conceda `Everyone:F` o `Authenticated Users:F` a un ImagePath de servicio es esencialmente una pista fumante.

Ejemplos de syscalls directos

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

Mapeos MITRE ATT&CK

Last verified: 2026-05-20