> Windows Syscalls
ntoskrnl.exeT1106T1564

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

NameTypeDirDescription
JobHandlePHANDLEoutReçoit le handle du job object nouvellement créé en cas de succès.
DesiredAccessACCESS_MASKinDroits d'accès pour le handle retourné, typiquement JOB_OBJECT_ALL_ACCESS pour les propriétaires.
ObjectAttributesPOBJECT_ATTRIBUTESinNom 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 WindowsID de syscallBuild
Win10 15070xA1win10-1507
Win10 16070xA3win10-1607
Win10 17030xA6win10-1703
Win10 17090xA7win10-1709
Win10 18030xA8win10-1803
Win10 18090xA8win10-1809
Win10 19030xA9win10-1903
Win10 19090xA9win10-1909
Win10 20040xADwin10-2004
Win10 20H20xADwin10-20h2
Win10 21H10xADwin10-21h1
Win10 21H20xAEwin10-21h2
Win10 22H20xAEwin10-22h2
Win11 21H20xB1win11-21h2
Win11 22H20xB2win11-22h2
Win11 23H20xB2win11-23h2
Win11 24H20xB4win11-24h2
Server 20160xA3winserver-2016
Server 20190xA8winserver-2019
Server 20220xB0winserver-2022
Server 20250xB4winserver-2025

Module noyau

ntoskrnl.exeNtCreateJobObject

APIs liées

CreateJobObjectWOpenJobObjectWIsProcessInJobNtAssignProcessToJobObjectNtSetInformationJobObjectNtQueryInformationJobObject

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 ENDP

cSandbox-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