NtCreateJobObject
Crée un job object — le conteneur noyau utilisé pour appliquer limites, comptabilité et politique de terminaison à un ensemble de processus.
Prototype
NTSTATUS NtCreateJobObject( PHANDLE JobHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes );
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| JobHandle | PHANDLE | out | Reçoit le handle du job object nouvellement créé en cas de succès. |
| DesiredAccess | ACCESS_MASK | in | Droits d'accès pour le handle retourné, typiquement JOB_OBJECT_ALL_ACCESS pour les propriétaires. |
| ObjectAttributes | POBJECT_ATTRIBUTES | in | Nom et attributs optionnels ; NULL crée un job anonyme (le cas le plus courant pour le sandboxing). |
IDs de syscalls par version de Windows
| Version de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0xA1 | win10-1507 |
| Win10 1607 | 0xA3 | win10-1607 |
| Win10 1703 | 0xA6 | win10-1703 |
| Win10 1709 | 0xA7 | win10-1709 |
| Win10 1803 | 0xA8 | win10-1803 |
| Win10 1809 | 0xA8 | win10-1809 |
| Win10 1903 | 0xA9 | win10-1903 |
| Win10 1909 | 0xA9 | win10-1909 |
| Win10 2004 | 0xAD | win10-2004 |
| Win10 20H2 | 0xAD | win10-20h2 |
| Win10 21H1 | 0xAD | win10-21h1 |
| Win10 21H2 | 0xAE | win10-21h2 |
| Win10 22H2 | 0xAE | win10-22h2 |
| Win11 21H2 | 0xB1 | win11-21h2 |
| Win11 22H2 | 0xB2 | win11-22h2 |
| Win11 23H2 | 0xB2 | win11-23h2 |
| Win11 24H2 | 0xB4 | win11-24h2 |
| Server 2016 | 0xA3 | winserver-2016 |
| Server 2019 | 0xA8 | winserver-2019 |
| Server 2022 | 0xB0 | winserver-2022 |
| Server 2025 | 0xB4 | winserver-2025 |
Module noyau
APIs liées
Stub du syscall
4C 8B D1 mov r10, rcx B8 B4 00 00 00 mov eax, 0xB4 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
NtCreateJobObject alloue une structure noyau `_EJOB` et retourne un handle. Seule, elle ne fait rien d'observable : l'objet prend du sens dès que des processus y sont assignés via NtAssignProcessToJobObject et qu'une politique y est appliquée via NtSetInformationJobObject. Les jobs sont le socle du sandboxing Windows — les renderers Chromium / Edge, AppContainer / Windows Sandbox et la gestion moderne des processus enfants Win32 reposent tous sur les jobs. Les jobs imbriqués (Win8+) permettent de superposer des politiques sans casser les assignations antérieures. Le SSN dérive toutes les quelques mises à jour majeures.
Usage courant par les malwares
Presque entièrement bénin. Le schéma offensif intéressant est l'inverse — *s'échapper* d'un job via PROCESS_CREATE_FLAGS_BREAKAWAY_FROM_JOB lors d'un spawn enfant (quand le job le permet) ou en terminant le processus contrôleur pour que la politique JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE se déclenche et efface des preuves. Un petit nombre d'outils red-team créent leur propre job pour appliquer JobObjectExtendedLimitInformation avec JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE à un stager qui s'autodétruit si l'implant disparaît. Signal offensif faible — honnêtement, les jobs sont partout sur un système sain.
Opportunités de détection
Sysmon n'a pas d'événement dédié aux job objects aujourd'hui. La télémétrie utile vient d'ETW Microsoft-Windows-Kernel-Process (les enregistrements de démarrage de processus exposent l'ID du job via TokenInformation) et de hooks EDR sur ntdll!NtCreateJobObject combinés à ntdll!NtAssignProcessToJobObject. L'angle blue-team n'est pas « qui a créé un job » (tout le monde le fait) mais « qui a créé un job incluant un processus qu'il n'a pas lancé » — signe d'une tentative de confinement ou de contrôle de terminaison. À combiner avec NtSetInformationJobObject(JobObjectExtendedLimitInformation) pour signaler KILL_ON_JOB_CLOSE sur des jobs inhabituels.
Exemples de syscalls directs
asmx64 direct stub (Win11 24H2 SSN)
; Direct syscall stub for NtCreateJobObject (SSN 0xB4 on Win11 24H2 / Server 2025)
NtCreateJobObject PROC
mov r10, rcx ; syscall convention
mov eax, 0B4h ; SSN for win11-24h2
syscall
ret
NtCreateJobObject ENDPcSandbox-spawn skeleton (step 1 — create the job)
// First step of a sandboxed child-process pattern.
// Pair with NtAssignProcessToJobObject + NtSetInformationJobObject to fully wire it up.
HANDLE hJob = NULL;
NTSTATUS s = NtCreateJobObject(&hJob,
JOB_OBJECT_ALL_ACCESS,
NULL); // anonymous, unnamed
if (!NT_SUCCESS(s)) return s;
// At this point hJob is empty; nothing happens to any process until
// NtAssignProcessToJobObject(hJob, hChild) is called.rustwindows-sys + naked syscall stub
// Cargo: windows-sys = "0.59" (Win32_System_JobObjects)
use std::arch::asm;
#[unsafe(naked)]
unsafe extern "system" fn nt_create_job_object_stub() {
asm!(
"mov r10, rcx",
"mov eax, 0xB4", // Win11 24H2; resolve dynamically for other builds
"syscall",
"ret",
options(noreturn),
);
}Mappings MITRE ATT&CK
Last verified: 2026-05-20