NtSetInformationJobObject
Définit une politique ou une limite sur un job object via une des classes d'information JOBOBJECTINFOCLASS.
Prototype
NTSTATUS NtSetInformationJobObject( HANDLE JobHandle, JOBOBJECTINFOCLASS JobObjectInformationClass, PVOID JobObjectInformation, ULONG JobObjectInformationLength );
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| JobHandle | HANDLE | in | Handle vers le job object (JOB_OBJECT_SET_ATTRIBUTES requis). |
| JobObjectInformationClass | JOBOBJECTINFOCLASS | in | Sélectionne la politique : JobObjectExtendedLimitInformation, JobObjectBasicUIRestrictions, JobObjectAssociateCompletionPortInformation, JobObjectCpuRateControlInformation, etc. |
| JobObjectInformation | PVOID | in | Pointeur vers la structure spécifique à la classe (ex. JOBOBJECT_EXTENDED_LIMIT_INFORMATION). |
| JobObjectInformationLength | ULONG | in | Taille en octets de la structure pointée par JobObjectInformation. Doit correspondre exactement à la classe. |
IDs de syscalls par version de Windows
| Version 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 |
Module noyau
APIs liées
Stub du 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
Notes non documentées
NtSetInformationJobObject est le syscall d'application de politique pour les jobs. L'enum JobObjectInformationClass sélectionne ce qui est positionné : JobObjectExtendedLimitInformation (le cheval de bataille — plafonds de nombre de processus, plafonds de working-set, JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, JOB_OBJECT_LIMIT_BREAKAWAY_OK, JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK), JobObjectBasicUIRestrictions (interdire le presse-papiers, les handles USER, les paramètres système — utilisé par toutes les sandboxes modernes), JobObjectAssociateCompletionPortInformation (transformer le job en source d'événements pour les notifications JOB_OBJECT_MSG_* sur un IOCP — surveillance « event-driven » des sorties de processus et des dépassements de limites), JobObjectCpuRateControlInformation, et la famille Win10 `JobObjectNetRateControlInformation`. Le SSN dérive presque à chaque mise à jour majeure.
Usage courant par les malwares
Majoritairement défensif. L'intérêt offensif se concentre sur deux coins : (1) positionner JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE sur un job contenant les helpers d'un implant pour que la fermeture du handle implant fasse disparaître tous les artefacts — une primitive de sortie propre ; (2) basculer JOB_OBJECT_LIMIT_BREAKAWAY_OK ou JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK sur un job contrôlé pour laisser les enfants s'échapper, ce que font précisément les exploits de sandbox-escape dès qu'ils obtiennent suffisamment d'accès au job. JobObjectAssociateCompletionPortInformation peut aussi être détourné par un malware de surveillance pour suivre le cycle de vie de processus qu'il contrôle.
Opportunités de détection
ETW Microsoft-Windows-Kernel-Process et Microsoft-Windows-Win32k exposent certains changements de politique de job, mais toutes les classes ne sont pas également instrumentées. La cible à fort signal est JobObjectExtendedLimitInformation avec KILL_ON_JOB_CLOSE ou BREAKAWAY_OK positionné par un processus non-sandbox. Les EDR qui hookent ntdll!NtSetInformationJobObject devraient décoder la classe et signaler (a) les positionneurs inhabituels de BREAKAWAY_OK (préparation de sandbox-escape) et (b) KILL_ON_JOB_CLOSE sur un job qui contient les propres helpers du processus appelant (infrastructure de sortie propre). À combiner avec les événements NtAssignProcessToJobObject pour reconstruire la topologie sandbox complète.
Exemples de syscalls directs
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),
);
}Mappings MITRE ATT&CK
Last verified: 2026-05-20