A scheduled job gives an attacker code that runs again and again without anyone logging on, often as SYSTEM or root, which makes job schedulers one of the most common persistence and remote execution paths on any host. MITRE D3FEND names the defence D3-SJA Scheduled Job Analysis (synonym: Scheduled Job Execution). It is a Detect tactic countermeasure under Operating System Monitoring (D3-OSM), defined as analysis of source files, processes, destination files, or destination servers associated with a scheduled job to detect unauthorised use of job scheduling. This card covers the artefact it analyses, the ATT&CK techniques D3FEND relates it to, the telemetry to collect on Windows, Linux and Kubernetes, and how to prove the analysis works. It is written for detection engineers, endpoint owners and incident responders.
Key takeaways
- The artefact is the job schedule. D3FEND defines a Job Schedule as the specification of tasks to be executed at particular times or intervals, stored under
C:\Windows\System32\Tasksor the registry on Windows and in/etc/crontabon Linux. - Analyse what the job points at, not only that it exists. D3FEND's article checks the job's source files, processes, destination files and remote servers against signatures, allowlists or reputation sources.
- Two inferred ATT&CK relations. D3FEND relates D3-SJA to Scheduled Task/Job (T1053) and Masquerade Task or Service (T1036.004) because both modify the Job Schedule artefact.
- Creation events beat command lines. Watching
schtasks.exe(MITRE CAR-2013-08-001) misses tasks created through APIs or by dropping files; Windows Security event 4698 records the full task XML whatever the method. - Schedulers are everywhere. Task Scheduler, at, cron, systemd timers and Kubernetes CronJobs all need coverage, and D3FEND notes that jobs can be scheduled in many creative ways.
D3-SJA at a glance
| Field | Value |
|---|---|
| D3FEND ID | D3-SJA Scheduled Job Analysis |
| Tactic | Detect |
| Parent technique | D3-OSM Operating System Monitoring |
| Relation | analyzes Job Schedule |
| What it observes | Job definitions, the binaries and scripts they run, the accounts they run as, and any remote server they contact |
| D3FEND references | MITRE CAR-2013-05-004 (Execution with AT), CAR-2013-08-001 (Execution with schtasks), McAfee patent US20160105450A1 |
| Typical data sources | Windows Security events 4698 to 4702, process creation telemetry, file integrity monitoring on cron and timer directories, Kubernetes audit logs |
| Main limitation | Legitimate administrators and software use the same schedulers, so baselining decides the noise level |
How it works
D3FEND's description has two stages. First, identify the details of a scheduled job: the files it runs, the process that created it, files it writes and servers it reaches. Second, compare those details against an anti-malware signature database, an allowlist or a reputation server; on a match against a bad list, execution is denied and an alert raised. The McAfee patent D3FEND cites does this by intercepting access to the task scheduler with hooking or file filters and checking the entity that tried to create the job.
D3FEND also extends the scope beyond classic schedulers: triggers that run a command after a system event, such as WMI Event Subscriptions on Windows, are part of the same problem. WMI subscriptions are their own ATT&CK technique (T1546.003, Windows Management Instrumentation Event Subscription), but a D3-SJA programme that ignores them leaves an obvious gap. Sysmon Event IDs 19, 20 and 21 record WMI filter, consumer and binding activity.
In practice, implementations combine three checks on every new or changed job:
- Action check: the command or binary path, its hash, signature and prevalence across the fleet, and whether it sits in a user-writable directory.
- Principal check: who created the job and which account it runs as. A task running as SYSTEM created by a standard user session is a priority.
- Location and naming check: where the definition lives and whether its name imitates a legitimate vendor task, which is the Masquerade Task or Service pattern.
ATT&CK techniques D3FEND relates to D3-SJA
Relationship type: inferred, not a direct mapping. D3FEND marks these relations as inferred and experimental: the techniques modify the Job Schedule artefact that D3-SJA analyses. They show relevance, not guaranteed coverage. Each ID was checked against ATT&CK v20.
| ATT&CK ID | Name | Tactics (ATT&CK v20) | What D3-SJA looks for |
|---|---|---|---|
| T1053 | Scheduled Task/Job | Execution, Persistence, Privilege Escalation | New or changed jobs whose action, principal or target server is unknown or untrusted |
| T1036.004 | Masquerade Task or Service | Stealth | Jobs named or placed to look like vendor or operating system tasks while running unexpected binaries |
The T1053 sub-techniques show where the schedule lives: At (T1053.002), Cron (T1053.003), Scheduled Task (T1053.005), Systemd Timers (T1053.006) and Container Orchestration Job (T1053.007). CAR-2013-08-001 rates moderate coverage of T1053.005. For attacker behaviour and mitigations, see the T1053 Scheduled Task/Job Defensive Guide and the T1036 Masquerading Defensive Guide; this page does not repeat them.
Where it is implemented
| Platform | Schedule location | Telemetry for D3-SJA |
|---|---|---|
| Windows Task Scheduler | C:\Windows\System32\Tasks and the registry (per D3FEND) | Security events 4698 created, 4699 deleted, 4700 enabled, 4701 disabled, 4702 updated (Audit Other Object Access Events); process creation for schtasks.exe and at.exe; file creation in the Tasks folder (Sysmon Event ID 11) |
| Windows WMI | WMI repository event filters and consumers | Sysmon Event IDs 19, 20, 21 |
| Linux cron | /etc/crontab, /etc/cron.d/, user crontabs under /var/spool/cron/ | File integrity monitoring and audit watches on those paths; process creation for crontab |
| Linux systemd | .timer units and the .service they activate | Unit file changes in systemd unit directories; the timer's Unit= value or same-named service |
| Kubernetes | CronJob objects in the API server | Kubernetes audit log entries for create and update on cronjobs; the image and service account in the job template |
Product classes that implement D3-SJA include endpoint detection and response agents (job creation alerts and scheduler hooks), SIEM analytics over Windows and Linux logs, file integrity monitoring, and Kubernetes admission and audit tooling. Event 4698 is the richest single source on Windows: Microsoft's documentation shows its TaskContent field carries the full task XML, including the principal, logon type and the <Exec><Command> action, and recommends watching for tasks created in the Task Scheduler Library root. See the Windows Event Log Guide, the Sysmon Guide and the Linux Logging and auditd for Defenders Guide.
A systemd timer activates the service with the same name by default, or the unit named in Unit=. Analysing the timer alone tells you when something runs but not what: always resolve and inspect the activated service's ExecStart=.
Where identity fits
Scheduled jobs are a quiet home for credentials. Microsoft's event 4698 guidance recommends alerting when TaskContent contains <LogonType>Password</LogonType>, because the account's password is then stored and can be extracted by an administrator. Cron entries and job scripts often carry tokens or passwords in arguments. Record the run-as account for every job, prefer managed service accounts, and see How to Find credentials in cron jobs and scheduled tasks. Kubernetes CronJobs run under a service account named in the pod template, so a new CronJob is also a new use of that identity.
Implementation steps
- Turn on the events. Enable Audit Other Object Access Events on Windows endpoints and servers so 4698 to 4702 are written, and forward them centrally. Add Sysmon or EDR process and WMI telemetry.
- Cover Linux paths. Watch
/etc/crontab,/etc/cron.d/,/var/spool/cron/and systemd unit directories for writes, using file integrity monitoring or audit rules. - Baseline per image. Export the task list, crontabs and timers from a clean build of each image. Store task name, action path, hash, signer and run-as account.
- Write the analytics. Alert on: new tasks in the library root; actions in user-writable paths such as user profile,
TemporProgramData; jobs running as SYSTEM or root created from a non-administrative session; remote creation (the/sflag CAR-2013-08-001 highlights); tasks with names that copy vendor tasks but point at unsigned binaries. - Enrich with reputation. Hash the action binary or script and check it against your allowlist and reputation source, as D3FEND describes. See the D3-FHRA File Hash Reputation Analysis.
- Pilot in alert-only mode. Run two weeks on one business unit, record the cause of every alert, and add suppressions keyed on hash, signer and change ticket, never on task name alone.
- Decide on blocking. D3FEND's description includes denying execution on a match. Only enable prevention after the pilot shows a low false positive rate, and keep a documented rollback (switch the rule back to alert).
How to verify it works
- Windows unit test: CAR-2013-08-001 gives a test: create a one-off task with
schtasks /Create /SC ONCEthat launchescalc.exe, confirm the analytic fires, then delete it withschtasks /Delete. Also create a task through the Task Scheduler user interface and confirm event 4698 still alerts, which proves you are not relying on the command line only. - Linux test: add a harmless entry in
/etc/cron.d/and a test timer, confirm both alerts arrive, then remove them. - Masquerade test: create a task under a vendor-like folder name pointing at an unsigned test binary in a user directory; the path and signer checks should fire.
- Kubernetes test: in a test namespace, create a CronJob with an unapproved image and confirm the audit log analytic flags it.
| Metric | What it shows |
|---|---|
| Event coverage | Share of Windows hosts sending 4698 in the last 7 days, and Linux hosts with scheduler path monitoring |
| Unexplained jobs | New jobs not matched to a change, software package or known hash, per week |
| Privileged job ratio | New jobs running as SYSTEM or root, reviewed against approvals |
| Stored credential jobs | Count of tasks with password logon type, trending to zero |
| Test pass rate | Share of monthly planted jobs detected on each platform |
The thresholds you set for these metrics are local choices; the metrics above are examples, not a standard.
Limits, bypasses and failure patterns
- Command line only: detecting
schtasks.exemisses tasks registered through the COM API, PowerShell cmdlets or file drops. Use creation events as the primary signal. - Audit policy not set: 4698 is not written unless the subcategory is enabled. Check policy on every host class, not only domain controllers.
- Ignoring updates: a task that is modified (4702) to point at a new action is as dangerous as a new task. Track changes, not only creation.
- Timer without service: inspecting a systemd timer without the service it activates, or a CronJob without its pod template, misses the actual payload.
- Name-based suppression: allowlisting by task name lets a masquerading task through. Suppress by action hash and signer.
- Missing other triggers: WMI subscriptions and other event triggers sit outside the scheduler but give the same outcome, as D3FEND's considerations note.
Framework mapping
| Framework | Reference | Relevance |
|---|---|---|
| NIST SP 800-53 Rev 5 | SI-4 System Monitoring | Monitoring hosts for unauthorised job creation |
| NIST SP 800-53 Rev 5 | AU-12 Audit Record Generation | Enabling task scheduler events |
| NIST SP 800-53 Rev 5 | CM-3 Configuration Change Control | Approved jobs used to explain alerts |
| NIST CSF 2.0 | DE.CM-09 | Runtime monitoring of computing software and data |
| ATT&CK mitigations | M1047 Audit, M1026 Privileged Account Management, M1028 Operating System Configuration | Prevention side of T1053; see the linked mitigation guides |
| MITRE D3FEND | D3-OSM (parent) | Placement in the D3FEND tree |
The NIST mapping is NHI Mgmt Group's view, not part of D3FEND. For the mitigations, see M1047 Audit and M1026 Privileged Account Management.
Related countermeasures
Siblings under Operating System Monitoring cover adjacent persistence state: D3-SICA System Init Config Analysis, D3-USICA User Session Init Config Analysis, D3-SDM System Daemon Monitoring and D3-SFA System File Analysis (whose child is D3-SBV Service Binary Verification). When a job launches an interpreter, D3-SEA Script Execution Analysis and D3-PSA Process Spawn Analysis take over.
Practitioner checklist
- Enable Audit Other Object Access Events and forward 4698 to 4702 from every Windows host class.
- Monitor cron files, cron directories and systemd timer and service units on Linux.
- Collect Kubernetes audit events for CronJob create and update.
- Baseline jobs per image with action hash, signer and run-as account.
- Alert on jobs in the library root, actions in user-writable paths and privileged jobs from non-administrative sessions.
- Flag tasks that store passwords and move them to managed service accounts.
- Include WMI event subscriptions in scope.
- Run planted job tests monthly on each platform and track the pass rate.
Standards and references
- MITRE D3FEND: Scheduled Job Analysis (D3-SJA)
- MITRE CAR: CAR-2013-08-001 Execution with schtasks
- MITRE CAR: CAR-2013-05-004 Execution with AT
- MITRE ATT&CK: T1053 Scheduled Task/Job
- Microsoft Learn: 4698 A scheduled task was created
- Microsoft Learn: Sysmon
- Linux man-pages: crontab(5)
- freedesktop.org: systemd.timer
Related NHI Mgmt Group resources: MITRE D3FEND Guide · T1053 Scheduled Task/Job Defensive Guide · How to Find credentials in cron jobs and scheduled tasks · D3-SICA System Init Config Analysis