> Windows Syscalls
ntoskrnl.exeT1106T1564

NtAssignProcessToJobObject

Asocia un proceso a un job object para que se le apliquen los límites, contabilidad y política de terminación del job.

Prototipo

NTSTATUS NtAssignProcessToJobObject(
  HANDLE JobHandle,
  HANDLE ProcessHandle
);

Argumentos

NameTypeDirDescription
JobHandleHANDLEinHandle al job objetivo (JOB_OBJECT_ASSIGN_PROCESS requerido).
ProcessHandleHANDLEinHandle al proceso asignado (PROCESS_SET_QUOTA | PROCESS_TERMINATE). No debe estar ya en un job incompatible (los jobs anidados se relajaron en Win8+).

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070x8Bwin10-1507
Win10 16070x8Bwin10-1607
Win10 17030x8Cwin10-1703
Win10 17090x8Cwin10-1709
Win10 18030x8Dwin10-1803
Win10 18090x8Dwin10-1809
Win10 19030x8Dwin10-1903
Win10 19090x8Dwin10-1909
Win10 20040x8Fwin10-2004
Win10 20H20x8Fwin10-20h2
Win10 21H10x8Fwin10-21h1
Win10 21H20x8Fwin10-21h2
Win10 22H20x8Fwin10-22h2
Win11 21H20x8Fwin11-21h2
Win11 22H20x8Fwin11-22h2
Win11 23H20x8Fwin11-23h2
Win11 24H20x91win11-24h2
Server 20160x8Bwinserver-2016
Server 20190x8Dwinserver-2019
Server 20220x8Fwinserver-2022
Server 20250x91winserver-2025

Módulo del kernel

ntoskrnl.exeNtAssignProcessToJobObject

APIs relacionadas

AssignProcessToJobObjectCreateJobObjectWIsProcessInJobNtCreateJobObjectNtSetInformationJobObjectNtQueryInformationJobObject

Stub del syscall

4C 8B D1            mov r10, rcx
B8 91 00 00 00      mov eax, 0x91
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

NtAssignProcessToJobObject es el paso de cableado que convierte un job recién creado en algo que afecta realmente a un proceso. Una vez asignado, el proceso hereda todos los límites del job (límites de working-set, restricciones de UI, tasa de CPU, política de breakaway) y contribuye a su contabilidad. Antes de Windows 8, un proceso solo podía estar en un job; los jobs anidados desde Win8 obligan al kernel a recorrer una cadena de jobs en cada chequeo. El patrón sandbox clásico es `NtCreateJobObject → NtSetInformationJobObject(límites + restricciones UI) → NtCreateUserProcess(suspendido) → NtAssignProcessToJobObject → NtResumeThread`.

Uso común por malware

Defensivo en la inmensa mayoría de los casos. El interés ofensivo es sandbox-aware: si el job permite JOB_OBJECT_LIMIT_BREAKAWAY_OK, un hijo lanzado con CREATE_BREAKAWAY_FROM_JOB escapa del contenedor; muchos bypass de AppContainer y de la sandbox de Chromium se apoyan en este hecho. Algunos frameworks red-team llaman a NtAssignProcessToJobObject sobre su propio implante para adjuntarle una política KILL_ON_JOB_CLOSE, de modo que cerrar el handle del implante mate a todos los helpers spawneados — útil para una retirada limpia. Señal débil aislada, significativa solo en cadena con NtSetInformationJobObject y consultas de política.

Oportunidades de detección

Sin evento dedicado de Sysmon. ETW Microsoft-Windows-Kernel-Process registra cambios de pertenencia a job de un proceso; emparejar la asignación con el proceso origen (¿quién posee JobHandle?) es la señal accionable. Los hooks EDR sobre NtAssignProcessToJobObject deben correlacionarse con el NtCreateJobObject inmediatamente anterior y cualquier NtSetInformationJobObject que haya puesto BREAKAWAY_OK o KILL_ON_JOB_CLOSE. La detección de alto valor es un proceso que se autoasigna a un job nuevo y a continuación lanza inmediatamente hijos con CREATE_BREAKAWAY_FROM_JOB — eso tiene forma de fuga de sandbox, no forma normal de sandbox.

Ejemplos de syscalls directos

asmx64 direct stub (Win11 24H2 SSN)

; Direct syscall stub for NtAssignProcessToJobObject (SSN 0x91 on Win11 24H2 / Server 2025)
NtAssignProcessToJobObject PROC
    mov  r10, rcx          ; syscall convention
    mov  eax, 091h         ; SSN for win11-24h2
    syscall
    ret
NtAssignProcessToJobObject ENDP

cSandbox-spawn skeleton (step 2 — assign suspended child)

// Continued from NtCreateJobObject / NtSetInformationJobObject sandbox setup.
// Spawn the target suspended, attach to the job, only then resume.
PROCESS_INFORMATION pi = { 0 };
STARTUPINFOW si = { sizeof(si) };
CreateProcessW(L"C:\\Windows\\System32\\notepad.exe",
               NULL, NULL, NULL, FALSE,
               CREATE_SUSPENDED,
               NULL, NULL, &si, &pi);

NTSTATUS s = NtAssignProcessToJobObject(hJob, pi.hProcess);
if (!NT_SUCCESS(s)) {
    TerminateProcess(pi.hProcess, 1);
    return s;
}

NtResumeThread(pi.hThread, NULL);   // job limits are now in effect for the child

rustwindows-sys + naked syscall stub

// Cargo: windows-sys = "0.59"  (Win32_System_JobObjects)
use std::arch::asm;

#[unsafe(naked)]
unsafe extern "system" fn nt_assign_process_to_job_object_stub() {
    asm!(
        "mov r10, rcx",
        "mov eax, 0x91",    // Win11 24H2; resolve dynamically for other builds
        "syscall",
        "ret",
        options(noreturn),
    );
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20