NtAssignProcessToJobObject
Hängt einen Prozess an ein Job Object, sodass dessen Limits, Accounting und Beendigungs-Policy für ihn gelten.
Prototyp
NTSTATUS NtAssignProcessToJobObject( HANDLE JobHandle, HANDLE ProcessHandle );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| JobHandle | HANDLE | in | Handle auf das Ziel-Job (JOB_OBJECT_ASSIGN_PROCESS erforderlich). |
| ProcessHandle | HANDLE | in | Handle auf den zuzuweisenden Prozess (PROCESS_SET_QUOTA | PROCESS_TERMINATE). Darf nicht bereits in einem inkompatiblen Job sein (verschachtelte Jobs wurden ab Win8+ gelockert). |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0x8B | win10-1507 |
| Win10 1607 | 0x8B | win10-1607 |
| Win10 1703 | 0x8C | win10-1703 |
| Win10 1709 | 0x8C | win10-1709 |
| Win10 1803 | 0x8D | win10-1803 |
| Win10 1809 | 0x8D | win10-1809 |
| Win10 1903 | 0x8D | win10-1903 |
| Win10 1909 | 0x8D | win10-1909 |
| Win10 2004 | 0x8F | win10-2004 |
| Win10 20H2 | 0x8F | win10-20h2 |
| Win10 21H1 | 0x8F | win10-21h1 |
| Win10 21H2 | 0x8F | win10-21h2 |
| Win10 22H2 | 0x8F | win10-22h2 |
| Win11 21H2 | 0x8F | win11-21h2 |
| Win11 22H2 | 0x8F | win11-22h2 |
| Win11 23H2 | 0x8F | win11-23h2 |
| Win11 24H2 | 0x91 | win11-24h2 |
| Server 2016 | 0x8B | winserver-2016 |
| Server 2019 | 0x8D | winserver-2019 |
| Server 2022 | 0x8F | winserver-2022 |
| Server 2025 | 0x91 | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
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
Undokumentierte Hinweise
NtAssignProcessToJobObject ist der Verdrahtungsschritt, der ein frisch erzeugtes Job in etwas verwandelt, das einen Prozess tatsächlich beeinflusst. Nach der Zuweisung erbt der Prozess alle auf das Job gesetzten Limits (Working-Set-Caps, UI-Restriktionen, CPU-Rate, Breakaway-Policy) und trägt zum Accounting des Jobs bei. Vor Windows 8 konnte ein Prozess höchstens in einem Job sein; verschachtelte Jobs seit Win8 zwingen den Kernel, bei jeder Prüfung eine Job-Kette zu durchlaufen. Das klassische Sandbox-Muster lautet `NtCreateJobObject → NtSetInformationJobObject(Limits + UI-Restriktionen) → NtCreateUserProcess(suspendiert) → NtAssignProcessToJobObject → NtResumeThread`.
Häufige Malware-Nutzung
In der weit überwiegenden Mehrzahl der Fälle defensiv. Das offensive Interesse ist sandbox-aware: erlaubt das Job JOB_OBJECT_LIMIT_BREAKAWAY_OK, entkommt ein mit CREATE_BREAKAWAY_FROM_JOB gespawnter Kindprozess dem Container; viele AppContainer- und Chromium-Sandbox-Bypasses stützen sich darauf. Wenige Red-Team-Frameworks rufen NtAssignProcessToJobObject auf das eigene Implant auf, um eine KILL_ON_JOB_CLOSE-Policy anzuhängen — schließt das Implant-Handle, sterben alle gespawnten Helfer mit. Nützlich für sauberen Rückzug. Allein schwaches Signal, sinnvoll nur in Kette mit NtSetInformationJobObject und Policy-Abfragen.
Erkennungsmöglichkeiten
Kein dediziertes Sysmon-Event. ETW Microsoft-Windows-Kernel-Process protokolliert Änderungen der Job-Zugehörigkeit eines Prozesses; das umsetzbare Signal liegt darin, die Zuweisung mit dem Ursprungsprozess zu paaren (wer besitzt JobHandle?). EDR-Hooks auf NtAssignProcessToJobObject sollten mit dem unmittelbar vorhergehenden NtCreateJobObject und jedem NtSetInformationJobObject korreliert werden, der BREAKAWAY_OK oder KILL_ON_JOB_CLOSE gesetzt hat. Hochwertige Detektion: ein Prozess, der sich selbst einem frischen Job zuweist und anschließend sofort Kindprozesse mit CREATE_BREAKAWAY_FROM_JOB spawnt — Form eines Sandbox-Escapes, nicht eines normalen Sandbox-Setups.
Direkte Syscall-Beispiele
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 ENDPcSandbox-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 childrustwindows-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),
);
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20