Jobs
| Operation | Description | Sample | Rule |
|---|---|---|---|
| get-jobs | Y | Y | |
| list-jobs | Y | Y | |
| watch-jobs | Y | Y | |
| create-jobs | Job created (cronjob-class persistence or batch execution). | Y | Y |
| update-jobs | Replaces an existing Job's spec, the batch-execution primitive a CronJob (or attacker) uses to run a pod once. Sigma's cronjob/job rule covers this verb. | Y | Y |
| patch-jobs | Modifies an existing Job's spec. Same Sigma cronjob/job-modification rule as update; changing a Job in place is stealthier than creating a new one. | Y | Y |
| delete-jobs | Removes a Job, ending its pod-running task early or clearing evidence of a one-off execution. Same Sigma cronjob/job-modification rule tracks this verb too. | Y | Y |
| deletecollection-jobs | Y | N | |
| get-jobs-status | Y | N | |
| update-jobs-status | Y | N | |
| patch-jobs-status | Y | N | |
| any-jobs | Synthetic aggregation for rules that filter the jobs resource with no specific verb. Not a distinct audit record; hosts rule listings that key on objectRef.resource alone. | N | N |
get jobs
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs/dw-harn-jobs",
"verb": "get",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"name": "dw-harn-jobs",
"apiGroup": "batch",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:47:36.164973Z",
"stageTimestamp": "2026-07-02T04:47:36.166169Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload.Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches list-jobs: list jobs, watch-jobs: watch jobs, create-jobs: create jobs, update-jobs: update jobs, patch-jobs: patch jobs Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
References #
list jobs
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs?limit=500&timeout=3s",
"verb": "list",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"apiGroup": "batch",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:47:36.280480Z",
"stageTimestamp": "2026-07-02T04:47:36.281856Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload.Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-jobs: get jobs, watch-jobs: watch jobs, create-jobs: create jobs, update-jobs: update jobs, patch-jobs: patch jobs Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
References #
watch jobs
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs?resourceVersion=1567&timeout=3s&watch=true",
"verb": "watch",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"apiGroup": "batch",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:47:36.282975Z",
"stageTimestamp": "2026-07-02T04:47:39.286146Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload.Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-jobs: get jobs, list-jobs: list jobs, create-jobs: create jobs, update-jobs: update jobs, patch-jobs: patch jobs Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
References #
create jobs
#Description
Job created (cronjob-class persistence or batch execution).
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "582c31ab-4906-49bb-9ff9-872f980ccb84",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/test2/jobs?fieldManager=kubectl-create&fieldValidation=Strict",
"verb": "create",
"user": {
"username": "k8s-test-user",
"uid": "aws-iam-authenticator:591511147606:AROAYTOGP2RLFHNBOTP5J",
"groups": [
"system:authenticated"
]
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.27.2 (darwin/arm64) kubernetes/7f6f68f",
"objectRef": {
"resource": "jobs",
"namespace": "test2",
"apiGroup": "batch",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"status": "Failure",
"message": "jobs.batch is forbidden: User \"k8s-test-user\" cannot create resource \"jobs\" in API group \"batch\" in the namespace \"test2\"",
"reason": "Forbidden",
"details": {
"group": "batch",
"kind": "jobs"
},
"code": 403
},
"responseObject": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "jobs.batch is forbidden: User \"k8s-test-user\" cannot create resource \"jobs\" in API group \"batch\" in the namespace \"test2\"",
"reason": "Forbidden",
"details": {
"group": "batch",
"kind": "jobs"
},
"code": 403
},
"requestReceivedTimestamp": "2023-12-07T14:44:53.358394Z",
"stageTimestamp": "2023-12-07T14:44:53.375985Z",
"annotations": {
"authorization.k8s.io/decision": "forbid",
"authorization.k8s.io/reason": ""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
objectRef.resource (sigma rule field) | eq | cronjobs | 1 rule | sigma |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload.Sigma #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-jobs: get jobs, list-jobs: list jobs, watch-jobs: watch jobs, update-jobs: update jobs, patch-jobs: patch jobs Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
References #
update jobs
#Description
Replaces an existing Job's spec, the batch-execution primitive a CronJob (or attacker) uses to run a pod once. Sigma's cronjob/job rule covers this verb.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs/dw-harn-jobs?fieldManager=kubectl-replace&fieldValidation=Strict",
"verb": "update",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=4cf95d11cbd90036bab41cdc6b88cc8f91550e9135ed4bb61495b02f647812ff"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"name": "dw-harn-jobs",
"uid": "00000000-0000-0000-0000-000000000000",
"apiGroup": "batch",
"apiVersion": "v1",
"resourceVersion": "736"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"kind": "Job",
"apiVersion": "batch/v1",
"metadata": {
"name": "dw-harn-jobs",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "736",
"generation": 1,
"creationTimestamp": "2026-07-02T21:31:02Z",
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"dw-harn-patched": "1",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"parallelism": 1,
"completions": 1,
"backoffLimit": 0,
"selector": {
"matchLabels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000"
}
},
"manualSelector": false,
"template": {
"metadata": {
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"securityContext": {},
"schedulerName": "default-scheduler"
}
},
"completionMode": "NonIndexed",
"suspend": false,
"podReplacementPolicy": "TerminatingOrFailed"
},
"status": {
"conditions": [
{
"type": "SuccessCriteriaMet",
"status": "True",
"lastProbeTime": "2026-07-02T21:31:05Z",
"lastTransitionTime": "2026-07-02T21:31:05Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
},
{
"type": "Complete",
"status": "True",
"lastProbeTime": "2026-07-02T21:31:05Z",
"lastTransitionTime": "2026-07-02T21:31:05Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
}
],
"startTime": "2026-07-02T21:31:02Z",
"completionTime": "2026-07-02T21:31:05Z",
"succeeded": 1,
"terminating": 0,
"uncountedTerminatedPods": {},
"ready": 0
}
},
"responseObject": {
"kind": "Job",
"apiVersion": "batch/v1",
"metadata": {
"name": "dw-harn-jobs",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "736",
"generation": 1,
"creationTimestamp": "2026-07-02T21:31:02Z",
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"dw-harn-patched": "1",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"parallelism": 1,
"completions": 1,
"backoffLimit": 0,
"selector": {
"matchLabels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000"
}
},
"manualSelector": false,
"template": {
"metadata": {
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"securityContext": {},
"schedulerName": "default-scheduler"
}
},
"completionMode": "NonIndexed",
"suspend": false,
"podReplacementPolicy": "TerminatingOrFailed"
},
"status": {
"conditions": [
{
"type": "SuccessCriteriaMet",
"status": "True",
"lastProbeTime": "2026-07-02T21:31:05Z",
"lastTransitionTime": "2026-07-02T21:31:05Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
},
{
"type": "Complete",
"status": "True",
"lastProbeTime": "2026-07-02T21:31:05Z",
"lastTransitionTime": "2026-07-02T21:31:05Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
}
],
"startTime": "2026-07-02T21:31:02Z",
"completionTime": "2026-07-02T21:31:05Z",
"succeeded": 1,
"terminating": 0,
"uncountedTerminatedPods": {},
"ready": 0
}
},
"requestReceivedTimestamp": "2026-07-02T21:31:05.870084Z",
"stageTimestamp": "2026-07-02T21:31:05.873754Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
objectRef.resource (sigma rule field) | eq | cronjobs | 1 rule | sigma |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload.Sigma #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-jobs: get jobs, list-jobs: list jobs, watch-jobs: watch jobs, create-jobs: create jobs, patch-jobs: patch jobs Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
References #
patch jobs
#Description
Modifies an existing Job's spec. Same Sigma cronjob/job-modification rule as update; changing a Job in place is stealthier than creating a new one.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs/dw-harn-jobs?fieldManager=kubectl-patch",
"verb": "patch",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"name": "dw-harn-jobs",
"apiGroup": "batch",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"metadata": {
"labels": {
"dw-harn-patched": "1"
}
}
},
"responseObject": {
"kind": "Job",
"apiVersion": "batch/v1",
"metadata": {
"name": "dw-harn-jobs",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1580",
"generation": 1,
"creationTimestamp": "2026-07-02T04:47:36Z",
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"dw-harn-patched": "1",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"parallelism": 1,
"completions": 1,
"backoffLimit": 0,
"selector": {
"matchLabels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000"
}
},
"manualSelector": false,
"template": {
"metadata": {
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"securityContext": {},
"schedulerName": "default-scheduler"
}
},
"completionMode": "NonIndexed",
"suspend": false,
"podReplacementPolicy": "TerminatingOrFailed"
},
"status": {
"startTime": "2026-07-02T04:47:36Z",
"active": 1,
"terminating": 0,
"uncountedTerminatedPods": {},
"ready": 0
}
},
"requestReceivedTimestamp": "2026-07-02T04:47:39.352748Z",
"stageTimestamp": "2026-07-02T04:47:39.358201Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
objectRef.resource (sigma rule field) | eq | cronjobs | 1 rule | sigma |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload.Sigma #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-jobs: get jobs, list-jobs: list jobs, watch-jobs: watch jobs, create-jobs: create jobs, update-jobs: update jobs Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
References #
delete jobs
#Description
Removes a Job, ending its pod-running task early or clearing evidence of a one-off execution. Same Sigma cronjob/job-modification rule tracks this verb too.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs/dw-harn-jobs",
"verb": "delete",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"name": "dw-harn-jobs",
"apiGroup": "batch",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"status": "Success",
"details": {
"name": "dw-harn-jobs",
"group": "batch",
"kind": "jobs",
"uid": "00000000-0000-0000-0000-000000000000"
},
"code": 200
},
"requestObject": {
"kind": "DeleteOptions",
"apiVersion": "meta.k8s.io/__internal",
"propagationPolicy": "Background"
},
"responseObject": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Success",
"details": {
"name": "dw-harn-jobs",
"group": "batch",
"kind": "jobs",
"uid": "00000000-0000-0000-0000-000000000000"
}
},
"requestReceivedTimestamp": "2026-07-02T04:47:39.419131Z",
"stageTimestamp": "2026-07-02T04:47:39.422108Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
objectRef.resource (sigma rule field) | eq | cronjobs | 1 rule | sigma |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries →Sigma #
References #
deletecollection jobs
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs?labelSelector=dw-harn-patched",
"verb": "deletecollection",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=3ffde68ef687218e01296d94b0aa59c81cc98de2bd73ab70e21510c8cd4b9cec"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"apiGroup": "batch",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"responseObject": {
"kind": "JobList",
"apiVersion": "batch/v1",
"metadata": {
"resourceVersion": "866"
},
"items": [
{
"metadata": {
"name": "dw-harn-jobs",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "865",
"generation": 1,
"creationTimestamp": "2026-07-02T23:13:04Z",
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"dw-harn-patched": "1",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"parallelism": 1,
"completions": 1,
"backoffLimit": 0,
"selector": {
"matchLabels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000"
}
},
"manualSelector": false,
"template": {
"metadata": {
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"securityContext": {},
"schedulerName": "default-scheduler"
}
},
"completionMode": "NonIndexed",
"suspend": false,
"podReplacementPolicy": "TerminatingOrFailed"
},
"status": {
"conditions": [
{
"type": "SuccessCriteriaMet",
"status": "True",
"lastProbeTime": "2026-07-02T23:13:07Z",
"lastTransitionTime": "2026-07-02T23:13:07Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
},
{
"type": "Complete",
"status": "True",
"lastProbeTime": "2026-07-02T23:13:07Z",
"lastTransitionTime": "2026-07-02T23:13:07Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
}
],
"startTime": "2026-07-02T23:13:04Z",
"completionTime": "2026-07-02T23:13:07Z",
"succeeded": 1,
"terminating": 0,
"uncountedTerminatedPods": {},
"ready": 0
}
}
]
},
"requestReceivedTimestamp": "2026-07-02T23:13:08.498723Z",
"stageTimestamp": "2026-07-02T23:13:08.505044Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
References #
get jobs/status
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs/dw-harn-jobs/status",
"verb": "get",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=4cf95d11cbd90036bab41cdc6b88cc8f91550e9135ed4bb61495b02f647812ff"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"name": "dw-harn-jobs",
"apiGroup": "batch",
"apiVersion": "v1",
"subresource": "status"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T21:31:05.940246Z",
"stageTimestamp": "2026-07-02T21:31:05.942013Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
References #
update jobs/status
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs/dw-harn-jobs/status?fieldManager=kubectl-replace&fieldValidation=Strict",
"verb": "update",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=4cf95d11cbd90036bab41cdc6b88cc8f91550e9135ed4bb61495b02f647812ff"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"name": "dw-harn-jobs",
"uid": "00000000-0000-0000-0000-000000000000",
"apiGroup": "batch",
"apiVersion": "v1",
"resourceVersion": "736",
"subresource": "status"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"kind": "Job",
"apiVersion": "batch/v1",
"metadata": {
"name": "dw-harn-jobs",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "736",
"generation": 1,
"creationTimestamp": "2026-07-02T21:31:02Z",
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"dw-harn-patched": "1",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"parallelism": 1,
"completions": 1,
"backoffLimit": 0,
"selector": {
"matchLabels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000"
}
},
"manualSelector": false,
"template": {
"metadata": {
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"securityContext": {},
"schedulerName": "default-scheduler"
}
},
"completionMode": "NonIndexed",
"suspend": false,
"podReplacementPolicy": "TerminatingOrFailed"
},
"status": {
"conditions": [
{
"type": "SuccessCriteriaMet",
"status": "True",
"lastProbeTime": "2026-07-02T21:31:05Z",
"lastTransitionTime": "2026-07-02T21:31:05Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
},
{
"type": "Complete",
"status": "True",
"lastProbeTime": "2026-07-02T21:31:05Z",
"lastTransitionTime": "2026-07-02T21:31:05Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
}
],
"startTime": "2026-07-02T21:31:02Z",
"completionTime": "2026-07-02T21:31:05Z",
"succeeded": 1,
"terminating": 0,
"uncountedTerminatedPods": {},
"ready": 0
}
},
"responseObject": {
"kind": "Job",
"apiVersion": "batch/v1",
"metadata": {
"name": "dw-harn-jobs",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "736",
"generation": 1,
"creationTimestamp": "2026-07-02T21:31:02Z",
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"dw-harn-patched": "1",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"parallelism": 1,
"completions": 1,
"backoffLimit": 0,
"selector": {
"matchLabels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000"
}
},
"manualSelector": false,
"template": {
"metadata": {
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"securityContext": {},
"schedulerName": "default-scheduler"
}
},
"completionMode": "NonIndexed",
"suspend": false,
"podReplacementPolicy": "TerminatingOrFailed"
},
"status": {
"conditions": [
{
"type": "SuccessCriteriaMet",
"status": "True",
"lastProbeTime": "2026-07-02T21:31:05Z",
"lastTransitionTime": "2026-07-02T21:31:05Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
},
{
"type": "Complete",
"status": "True",
"lastProbeTime": "2026-07-02T21:31:05Z",
"lastTransitionTime": "2026-07-02T21:31:05Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
}
],
"startTime": "2026-07-02T21:31:02Z",
"completionTime": "2026-07-02T21:31:05Z",
"succeeded": 1,
"terminating": 0,
"uncountedTerminatedPods": {},
"ready": 0
}
},
"requestReceivedTimestamp": "2026-07-02T21:31:06.023662Z",
"stageTimestamp": "2026-07-02T21:31:06.027038Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
References #
patch jobs/status
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/batch/v1/namespaces/dw-harn/jobs/dw-harn-jobs/status?fieldManager=kubectl-patch",
"verb": "patch",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=786fc563dbb253683c44d23d0aac3742ea61ade7f27a43f50934a82662e15409"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "jobs",
"namespace": "dw-harn",
"name": "dw-harn-jobs",
"apiGroup": "batch",
"apiVersion": "v1",
"subresource": "status"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {},
"responseObject": {
"kind": "Job",
"apiVersion": "batch/v1",
"metadata": {
"name": "dw-harn-jobs",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "777",
"generation": 1,
"creationTimestamp": "2026-07-02T22:17:44Z",
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"dw-harn-patched": "1",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"parallelism": 1,
"completions": 1,
"backoffLimit": 0,
"selector": {
"matchLabels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000"
}
},
"manualSelector": false,
"template": {
"metadata": {
"labels": {
"batch.kubernetes.io/controller-uid": "00000000-0000-0000-0000-000000000000",
"batch.kubernetes.io/job-name": "dw-harn-jobs",
"controller-uid": "00000000-0000-0000-0000-000000000000",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"securityContext": {},
"schedulerName": "default-scheduler"
}
},
"completionMode": "NonIndexed",
"suspend": false,
"podReplacementPolicy": "TerminatingOrFailed"
},
"status": {
"conditions": [
{
"type": "SuccessCriteriaMet",
"status": "True",
"lastProbeTime": "2026-07-02T22:17:48Z",
"lastTransitionTime": "2026-07-02T22:17:48Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
},
{
"type": "Complete",
"status": "True",
"lastProbeTime": "2026-07-02T22:17:48Z",
"lastTransitionTime": "2026-07-02T22:17:48Z",
"reason": "CompletionsReached",
"message": "Reached expected number of succeeded pods"
}
],
"startTime": "2026-07-02T22:17:45Z",
"completionTime": "2026-07-02T22:17:48Z",
"succeeded": 1,
"terminating": 0,
"uncountedTerminatedPods": {},
"ready": 0
}
},
"requestReceivedTimestamp": "2026-07-02T22:17:48.759079Z",
"stageTimestamp": "2026-07-02T22:17:48.762126Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
References #
any verb on jobs (synthetic aggregation)
#Description
Synthetic aggregation for rules that filter the jobs resource with no specific verb. Not a distinct audit record; hosts rule listings that key on objectRef.resource alone.