NtSetInformationJobObject
Establece una política o límite en un job object mediante una de las clases de información JOBOBJECTINFOCLASS.
Prototipo
NTSTATUS NtSetInformationJobObject( HANDLE JobHandle, JOBOBJECTINFOCLASS JobObjectInformationClass, PVOID JobObjectInformation, ULONG JobObjectInformationLength );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| JobHandle | HANDLE | in | Handle al job object (JOB_OBJECT_SET_ATTRIBUTES requerido). |
| JobObjectInformationClass | JOBOBJECTINFOCLASS | in | Selecciona la política: JobObjectExtendedLimitInformation, JobObjectBasicUIRestrictions, JobObjectAssociateCompletionPortInformation, JobObjectCpuRateControlInformation, etc. |
| JobObjectInformation | PVOID | in | Puntero a la estructura específica de la clase (p. ej. JOBOBJECT_EXTENDED_LIMIT_INFORMATION). |
| JobObjectInformationLength | ULONG | in | Tamaño en bytes de la estructura apuntada por JobObjectInformation. Debe coincidir exactamente con la clase. |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x17B | win10-1507 |
| Win10 1607 | 0x184 | win10-1607 |
| Win10 1703 | 0x18A | win10-1703 |
| Win10 1709 | 0x18D | win10-1709 |
| Win10 1803 | 0x18F | win10-1803 |
| Win10 1809 | 0x190 | win10-1809 |
| Win10 1903 | 0x191 | win10-1903 |
| Win10 1909 | 0x191 | win10-1909 |
| Win10 2004 | 0x197 | win10-2004 |
| Win10 20H2 | 0x197 | win10-20h2 |
| Win10 21H1 | 0x197 | win10-21h1 |
| Win10 21H2 | 0x199 | win10-21h2 |
| Win10 22H2 | 0x199 | win10-22h2 |
| Win11 21H2 | 0x1A2 | win11-21h2 |
| Win11 22H2 | 0x1A6 | win11-22h2 |
| Win11 23H2 | 0x1A6 | win11-23h2 |
| Win11 24H2 | 0x1A9 | win11-24h2 |
| Server 2016 | 0x184 | winserver-2016 |
| Server 2019 | 0x190 | winserver-2019 |
| Server 2022 | 0x19F | winserver-2022 |
| Server 2025 | 0x1A9 | winserver-2025 |
Módulo del kernel
APIs relacionadas
Stub del syscall
4C 8B D1 mov r10, rcx B8 A9 01 00 00 mov eax, 0x1A9 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
NtSetInformationJobObject es el syscall de aplicación de política para jobs. La enum JobObjectInformationClass selecciona qué se establece: JobObjectExtendedLimitInformation (el caballo de batalla — límites de número de procesos, de working-set, JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, JOB_OBJECT_LIMIT_BREAKAWAY_OK, JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK), JobObjectBasicUIRestrictions (denegar portapapeles, handles USER, parámetros del sistema — usado por toda sandbox moderna), JobObjectAssociateCompletionPortInformation (convertir el job en fuente de eventos para notificaciones JOB_OBJECT_MSG_* sobre un IOCP — monitoreo «event-driven» de salidas de proceso e infracciones de límites), JobObjectCpuRateControlInformation y la familia Win10 `JobObjectNetRateControlInformation`. La SSN cambia casi en cada actualización mayor.
Uso común por malware
Predominantemente defensivo. El interés ofensivo se concentra en dos rincones: (1) poner JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE en un job que contiene los helpers del implante para que al cerrar el handle del implante se eliminen todos los artefactos — una primitiva de salida limpia; (2) activar JOB_OBJECT_LIMIT_BREAKAWAY_OK o JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK sobre un job controlado para permitir que los hijos escapen, que es justo lo que hacen los exploits de sandbox-escape en cuanto consiguen acceso suficiente al job. JobObjectAssociateCompletionPortInformation también puede ser abusada por malware de vigilancia para monitorear el ciclo de vida de procesos que controla.
Oportunidades de detección
ETW Microsoft-Windows-Kernel-Process y Microsoft-Windows-Win32k exponen algunos cambios de política de job, pero no todas las clases están igualmente instrumentadas. El objetivo de alta señal es JobObjectExtendedLimitInformation con KILL_ON_JOB_CLOSE o BREAKAWAY_OK puesto por un proceso no-sandbox. Los EDR que hookeen ntdll!NtSetInformationJobObject deberían decodificar la clase y señalar (a) setters inusuales de BREAKAWAY_OK (preparación de sandbox-escape) y (b) KILL_ON_JOB_CLOSE en un job que contiene los propios helpers del proceso llamador (infraestructura de salida limpia). Emparejar con eventos de NtAssignProcessToJobObject para reconstruir la topología sandbox completa.
Ejemplos de syscalls directos
asmx64 direct stub (Win11 24H2 SSN)
; Direct syscall stub for NtSetInformationJobObject (SSN 0x1A9 on Win11 24H2 / Server 2025)
NtSetInformationJobObject PROC
mov r10, rcx ; syscall convention
mov eax, 1A9h ; SSN for win11-24h2
syscall
ret
NtSetInformationJobObject ENDPcSandbox-spawn skeleton (step 3 — apply kill-on-close)
// Make sure every process in the job dies when the last handle to it closes.
JOBOBJECT_EXTENDED_LIMIT_INFORMATION limits = { 0 };
limits.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
| JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION;
NTSTATUS s = NtSetInformationJobObject(hJob,
JobObjectExtendedLimitInformation,
&limits,
sizeof(limits));
// Optional: associate an IOCP for event-driven monitoring
JOBOBJECT_ASSOCIATE_COMPLETION_PORT cp = { (PVOID)0xCAFE, hIoCompletion };
NtSetInformationJobObject(hJob,
JobObjectAssociateCompletionPortInformation,
&cp, sizeof(cp));rustwindows-sys + naked syscall stub
// Cargo: windows-sys = "0.59" (Win32_System_JobObjects)
use std::arch::asm;
#[unsafe(naked)]
unsafe extern "system" fn nt_set_information_job_object_stub() {
asm!(
"mov r10, rcx",
"mov eax, 0x1A9", // Win11 24H2; resolve dynamically for other builds
"syscall",
"ret",
options(noreturn),
);
}Mapeos MITRE ATT&CK
Last verified: 2026-05-20