Pods
| Operation | Description | Sample | Rule |
|---|---|---|---|
| get-pods | Reads one pod's full spec and status. Elastic's new-terms rule alerts when the combination of decision, username, and user agent has not appeared in the prior 10 days. | Y | Y |
| list-pods | Lists pods matching a query. Splunk's EKS pod-scan rule flags an unauthenticated (system:anonymous) list of /api/v1/pods as pre-attack reconnaissance. | Y | Y |
| watch-pods | Opens a long-lived watch stream for pod changes cluster-wide. Elastic's new-terms user-agent rule alerts on a not-previously-seen identity doing this. | Y | Y |
| create-pods | Pod created (execution, privilege escalation via hostPID/hostNetwork/hostIPC, privileged container). | Y | Y |
| update-pods | Modifies an existing pod's spec (image, command, env). Elastic flags this verb from an anonymous/unauthenticated caller as unauthorized API server access. | Y | Y |
| patch-pods | Partially modifies a pod's spec. Elastic flags this verb from an anonymous/unauthenticated caller as unauthorized API server access, the same signal as update. | Y | Y |
| delete-pods | Y | N | |
| deletecollection-pods | Y | N | |
| get-pods-attach | Y | Y | |
| create-pods-attach | Container attach (kubectl attach; interactive session). | Y | Y |
| create-pods-binding | Y | N | |
| get-pods-ephemeralcontainers | Ephemeral debug containers injected into a running pod. | Y | N |
| update-pods-ephemeralcontainers | Adds an ephemeral debug container to a running pod via update. Elastic flags this from a non-system identity: it can inject tooling or reach mounted secrets. | Y | Y |
| patch-pods-ephemeralcontainers | Same ephemeral-container injection as update, via patch. Elastic's rule excludes node/kube-system service accounts and expects only approved admins here. | Y | Y |
| create-pods-eviction | Y | N | |
| get-pods-exec | Some exec clients issue GET instead of create on pods/exec. Elastic's exec-to-pod rule matches verb (get, create), so a create-only watch misses it. | Y | Y |
| create-pods-exec | Remote command execution in a container (kubectl exec issues create on pods/exec subresource). | Y | Y |
| get-pods-log | Y | Y | |
| get-pods-portforward | Y | Y | |
| create-pods-portforward | Port forwarding from a pod (kubectl port-forward). | Y | Y |
| get-pods-proxy | N | N | |
| create-pods-proxy | N | N | |
| update-pods-proxy | N | N | |
| patch-pods-proxy | N | N | |
| delete-pods-proxy | N | N | |
| get-pods-resize | Y | N | |
| update-pods-resize | Y | N | |
| patch-pods-resize | Y | N | |
| get-pods-status | Y | N | |
| update-pods-status | Y | N | |
| patch-pods-status | Y | N | |
| any-pods | Synthetic aggregation for rules that filter the pods resource with no specific verb. Not a distinct audit record; hosts rule listings that key on objectRef.resource alone. | N | Y |
get pods
#Description
Reads one pod's full spec and status. Elastic's new-terms rule alerts when the combination of decision, username, and user agent has not appeared in the prior 10 days.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods?timeout=3s",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:48:49.498026Z",
"stageTimestamp": "2026-07-02T04:48:49.499767Z",
"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. The rule groups GKE audit get/list events on namespaces, nodes, pods, configmaps, serviceaccounts, roles, rolebindings, clusterroles, and clusterrolebindings into one-minute windows per Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches list-pods: list pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, get-pods-attach: get pods/attach, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1613↳ also matches list-pods: list pods Investigation guide
Triage and analysis#
Investigating GKE Multi-Resource Discovery#
client.user.email, source.ip, and user_agent.original. It alerts when five or more distinct resource kinds appear and the burst includes both cluster-layout kinds (namespaces, pods, or nodes) and RBAC kinds. Allowed and denied authorizations are both included: failures still signal probing.Possible investigation steps#
Esql.enumerated_resources, Esql.enumerated_namespaces, and Esql.enumerated_resource_names for ordering and targeted APIs.source.ip and user_agent.original match expected admin or automation clients.False positive analysis#
Response and remediation#
References #
list pods
#Description
Lists pods matching a query. Splunk's EKS pod-scan rule flags an unauthenticated (system:anonymous) list of /api/v1/pods as pre-attack reconnaissance.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods?limit=500",
"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": "pods",
"namespace": "dw-harn",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:48:49.256022Z",
"stageTimestamp": "2026-07-02T04:48:49.257796Z",
"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 (splunk rule field) | eq | pods | 1 rule | splunk |
user.username (splunk rule field) | eq | system:anonymous | 1 rule | splunk |
verb (splunk rule field) | eq | list | 1 rule | splunk |
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. The rule groups GKE audit get/list events on namespaces, nodes, pods, configmaps, serviceaccounts, roles, rolebindings, clusterroles, and clusterrolebindings into one-minute windows per Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, get-pods-attach: get pods/attach, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1613↳ also matches get-pods: get pods Investigation guide
Triage and analysis#
Investigating GKE Multi-Resource Discovery#
client.user.email, source.ip, and user_agent.original. It alerts when five or more distinct resource kinds appear and the burst includes both cluster-layout kinds (namespaces, pods, or nodes) and RBAC kinds. Allowed and denied authorizations are both included: failures still signal probing.Possible investigation steps#
Esql.enumerated_resources, Esql.enumerated_namespaces, and Esql.enumerated_resource_names for ordering and targeted APIs.source.ip and user_agent.original match expected admin or automation clients.False positive analysis#
Response and remediation#
Splunk #
aws_cloudwatchlogs_eks data source, filtering for events where…T1526
References #
watch pods
#Description
Opens a long-lived watch stream for pod changes cluster-wide. Elastic's new-terms user-agent rule alerts on a not-previously-seen identity doing this.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods?allowWatchBookmarks=true&fieldSelector=metadata.name%3Ddw-harn-pod-evict&resourceVersionMatch=NotOlderThan&sendInitialEvents=true&timeoutSeconds=381&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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pod-evict",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:48:58.128429Z",
"stageTimestamp": "2026-07-02T04:48:58.664505Z",
"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-pods: get pods, list-pods: list pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, get-pods-attach: get pods/attach, and 6 more 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 pods
#Description
Pod created (execution, privilege escalation via hostPID/hostNetwork/hostIPC, privileged container).
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "a9157591-37ac-42da-8de5-713be7a08bbd",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/default/pods?fieldManager=kubectl-client-side-apply&fieldValidation=Strict",
"verb": "create",
"user": {
"username": "kubernetes-admin",
"uid": "aws-iam-authenticator",
"groups": [
"system:masters",
"system:authenticated"
]
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.27.2 (darwin/arm64) kubernetes/7f6f68f",
"objectRef": {
"resource": "pods",
"namespace": "default",
"name": "privileged-the-pod",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 201
},
"requestObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "privileged-the-pod",
"namespace": "default",
"creationTimestamp": null,
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"annotations": {},
"name": "privileged-the-pod",
"namespace": "default"
},
"spec": {
"containers": [
{
"image": "nginx:latest",
"name": "privileged-the-pod",
"ports": [
{
"containerPort": 80
}
],
"securityContext": {
"privileged": true
}
}
],
"hostNetwork": true,
"hostPID": true
}
}
}
},
"spec": {
"containers": [
{
"name": "privileged-the-pod",
"image": "nginx:latest",
"ports": [
{
"hostPort": 80,
"containerPort": 80,
"protocol": "TCP"
}
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "Always",
"securityContext": {
"privileged": true
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"hostNetwork": true,
"hostPID": true,
"securityContext": {},
"schedulerName": "default-scheduler",
"enableServiceLinks": true
},
"status": {}
},
"responseObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "privileged-the-pod",
"namespace": "default",
"uid": "53754112-d064-43bc-9d31-532ebca3afc3",
"resourceVersion": "2614847",
"creationTimestamp": "2023-12-13T15:48:34Z",
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"annotations": {},
"name": "privileged-the-pod",
"namespace": "default"
},
"spec": {
"containers": [
{
"image": "nginx:latest",
"name": "privileged-the-pod",
"ports": [
{
"containerPort": 80
}
],
"securityContext": {
"privileged": true
}
}
],
"hostNetwork": true,
"hostPID": true
}
}
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-42hr5",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "privileged-the-pod",
"image": "nginx:latest",
"ports": [
{
"hostPort": 80,
"containerPort": 80,
"protocol": "TCP"
}
],
"resources": {},
"volumeMounts": [
{
"name": "kube-api-access-42hr5",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "Always",
"securityContext": {
"privileged": true
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"hostNetwork": true,
"hostPID": true,
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"phase": "Pending",
"qosClass": "BestEffort"
}
},
"requestReceivedTimestamp": "2023-12-13T15:48:34.794464Z",
"stageTimestamp": "2023-12-13T15:48:34.995656Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "",
"mutation.webhook.admission.k8s.io/round_0_index_0": {
"configuration": "pod-identity-webhook",
"webhook": "iam-for-pods.amazonaws.com",
"mutated": false
},
"mutation.webhook.admission.k8s.io/round_0_index_1": {
"configuration": "vpc-resource-mutating-webhook",
"webhook": "mpod.vpc.k8s.aws",
"mutated": false
},
"pod-security.kubernetes.io/enforce-policy": "privileged:latest"
}
}
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 |
|---|---|---|---|---|
verb | eq | create | 15 rules | falco, panther, sigma, splunk |
objectRef.resource | eq | pods | 13 rules | falco, sigma, splunk |
kubernetes.audit.objectRef.resource (elastic rule field) | eq | pods | 10 rules | elastic |
kubernetes.audit.annotations.authorization_k8s_io/decision (elastic rule field) | eq | allow | 8 rules | elastic |
objectRef.subresource (falco rule field) | is_null | | 7 rules | falco |
stage (falco rule field) | eq | responsecomplete | 7 rules | falco |
username (panther rule field) | contains | serviceaccount | 7 rules | panther |
kubernetes.audit.verb (elastic rule field) | eq | create | 4 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | create | 6 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | patch | 6 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | update | 6 rules | elastic |
objectRef:resource (panther rule field) | eq | pods | 6 rules | panther |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.create | 5 rules | elastic |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.patch | 5 rules | elastic |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.update | 5 rules | elastic |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Anonymous identities creating or mutating pods indicates the API server accepts unauthenticated workload changes. Failed unauthenticated creates may appear with an empty Capabilities such as SYS_ADMIN, NET_ADMIN, and BPF can enable host escape. Review The GCP Fleet integration with GKE audit logs enabled is required to be compatible with this rule. Host IPC lets a pod interact with host IPC facilities. Review the pod spec, actor, and whether the change was expected. The GCP Fleet integration with GKE audit logs enabled is required to be compatible with this rule.Sigma #
T1611T1036, T1036.005T1611Elastic #
T1610↳ also matches update-pods: update pods, patch-pods: patch pods Investigation guide
Triage and analysis#
Investigating GKE Anonymous Pod Create/Update/Patch#
client.user.email and Unauthorized / forbidden status.Investigation steps#
client.user.email, event.action, event.outcome, orchestrator.resource.name, orchestrator.namespace, and source.ip.system:anonymous.False positives#
T1610, T1611Investigation guide
Triage and analysis#
Investigating GKE Container Created with Excessive Linux Capabilities#
gcp.audit.request.spec.containers and the creating identity.Investigation steps#
user.email, namespace, and follow-on API activity from the same actor.False positives#
Setup#
T1610, T1611↳ also matches update-pods: update pods, patch-pods: patch pods Investigation guide
Triage and analysis#
Investigating GKE Pod Created With HostIPC#
Investigation steps#
gcp.audit.request.spec.hostIPC and targeted namespace or pod.user.email and correlate with other risky pod modifications.False positives#
Setup#
Splunk #
T1204↳ also matches update-pods: update pods T1204T1204↳ also matches update-pods: update pods Panther #
T1611↳ also matches update-pods: update pods, patch-pods: patch pods T1041, T1611↳ also matches update-pods: update pods, patch-pods: patch pods T1610, T1611↳ also matches update-pods: update pods, patch-pods: patch pods Falco #
References #
update pods
#Description
Modifies an existing pod's spec (image, command, env). Elastic flags this verb from an anonymous/unauthenticated caller as unauthorized API server access.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods?fieldManager=kubectl-replace&fieldValidation=Strict",
"verb": "update",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"uid": "00000000-0000-0000-0000-000000000000",
"apiVersion": "v1",
"resourceVersion": "1328"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1328",
"generation": 1,
"creationTimestamp": "2026-07-02T22:48:39Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-6v2nh",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 1,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "Initialized",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
},
{
"type": "Ready",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "ContainersReady",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "PodScheduled",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T22:48:39Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T22:48:40Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://22a94e64e6b0f15416b36663b28abc4da5a9e92f9cc537badb41f3458a4ef2ef",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"responseObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1328",
"generation": 1,
"creationTimestamp": "2026-07-02T22:48:39Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-6v2nh",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 1,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "Initialized",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
},
{
"type": "Ready",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "ContainersReady",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "PodScheduled",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T22:48:39Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T22:48:40Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://22a94e64e6b0f15416b36663b28abc4da5a9e92f9cc537badb41f3458a4ef2ef",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"requestReceivedTimestamp": "2026-07-02T22:48:44.249655Z",
"stageTimestamp": "2026-07-02T22:48:44.255109Z",
"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\"",
"pod-security.kubernetes.io/enforce-policy": "privileged:latest"
}
}
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 |
|---|---|---|---|---|
kubernetes.audit.objectRef.resource (elastic rule field) | eq | pods | 6 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | create | 6 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | patch | 6 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | update | 6 rules | elastic |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.create | 5 rules | elastic |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.patch | 5 rules | elastic |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.update | 5 rules | elastic |
kubernetes.audit.annotations.authorization_k8s_io/decision (elastic rule field) | eq | allow | 4 rules | elastic |
objectRef:resource (panther rule field) | eq | pods | 4 rules | panther |
verb (splunk rule field) | eq | update | 2 rules | splunk |
verb (panther rule field) | in | create | 4 rules | panther |
verb (panther rule field) | in | update | 4 rules | panther |
verb (panther rule field) | in | patch | 3 rules | panther |
objectRef.resource (splunk rule field) | eq | pods | 2 rules | splunk |
client.user.email (elastic rule field) | eq | system:anonymous | 1 rule | elastic |
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. Anonymous identities creating or mutating pods indicates the API server accepts unauthenticated workload changes. Failed unauthenticated creates may appear with an empty Host IPC lets a pod interact with host IPC facilities. Review the pod spec, actor, and whether the change was expected. The GCP Fleet integration with GKE audit logs enabled is required to be compatible with this rule.Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, list-pods: list pods, watch-pods: watch pods, create-pods: create pods, patch-pods: patch pods, get-pods-attach: get pods/attach, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1610↳ also matches create-pods: create pods, patch-pods: patch pods Investigation guide
Triage and analysis#
Investigating GKE Anonymous Pod Create/Update/Patch#
client.user.email and Unauthorized / forbidden status.Investigation steps#
client.user.email, event.action, event.outcome, orchestrator.resource.name, orchestrator.namespace, and source.ip.system:anonymous.False positives#
T1610, T1611↳ also matches create-pods: create pods, patch-pods: patch pods Investigation guide
Triage and analysis#
Investigating GKE Pod Created With HostIPC#
Investigation steps#
gcp.audit.request.spec.hostIPC and targeted namespace or pod.user.email and correlate with other risky pod modifications.False positives#
Setup#
Splunk #
T1204↳ also matches create-pods: create pods T1204↳ also matches create-pods: create pods Panther #
T1611↳ also matches create-pods: create pods, patch-pods: patch pods T1041, T1611↳ also matches create-pods: create pods, patch-pods: patch pods T1610, T1611↳ also matches create-pods: create pods, patch-pods: patch pods
References #
patch pods
#Description
Partially modifies a pod's spec. Elastic flags this verb from an anonymous/unauthenticated caller as unauthorized API server access, the same signal as update.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods?fieldManager=kubectl-patch",
"verb": "patch",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"metadata": {
"labels": {
"dw-harn-patched": "1"
}
}
},
"responseObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1327",
"generation": 1,
"creationTimestamp": "2026-07-02T22:48:39Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-6v2nh",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 1,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "Initialized",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
},
{
"type": "Ready",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "ContainersReady",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "PodScheduled",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T22:48:39Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T22:48:40Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://22a94e64e6b0f15416b36663b28abc4da5a9e92f9cc537badb41f3458a4ef2ef",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
}
}
},
"requestReceivedTimestamp": "2026-07-02T22:48:43.987530Z",
"stageTimestamp": "2026-07-02T22:48:44.014996Z",
"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\"",
"pod-security.kubernetes.io/enforce-policy": "privileged:latest"
}
}
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 |
|---|---|---|---|---|
kubernetes.audit.objectRef.resource (elastic rule field) | eq | pods | 6 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | create | 6 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | patch | 6 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | update | 6 rules | elastic |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.create | 5 rules | elastic |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.patch | 5 rules | elastic |
EventType (elastic rule field) | in | io.k8s.core.v1.pods.update | 5 rules | elastic |
kubernetes.audit.annotations.authorization_k8s_io/decision (elastic rule field) | eq | allow | 4 rules | elastic |
objectRef:resource (panther rule field) | eq | pods | 3 rules | panther |
verb (panther rule field) | in | create | 3 rules | panther |
verb (panther rule field) | in | patch | 3 rules | panther |
verb (panther rule field) | in | update | 3 rules | panther |
client.user.email (elastic rule field) | eq | system:anonymous | 1 rule | elastic |
client.user.email (elastic rule field) | eq | system:unauthenticated | 1 rule | elastic |
client.user.email (elastic rule field) | is_null | | 1 rule | elastic |
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. Anonymous identities creating or mutating pods indicates the API server accepts unauthenticated workload changes. Failed unauthenticated creates may appear with an empty Host IPC lets a pod interact with host IPC facilities. Review the pod spec, actor, and whether the change was expected. The GCP Fleet integration with GKE audit logs enabled is required to be compatible with this rule.Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, list-pods: list pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, get-pods-attach: get pods/attach, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1610↳ also matches create-pods: create pods, update-pods: update pods Investigation guide
Triage and analysis#
Investigating GKE Anonymous Pod Create/Update/Patch#
client.user.email and Unauthorized / forbidden status.Investigation steps#
client.user.email, event.action, event.outcome, orchestrator.resource.name, orchestrator.namespace, and source.ip.system:anonymous.False positives#
T1610, T1611↳ also matches create-pods: create pods, update-pods: update pods Investigation guide
Triage and analysis#
Investigating GKE Pod Created With HostIPC#
Investigation steps#
gcp.audit.request.spec.hostIPC and targeted namespace or pod.user.email and correlate with other risky pod modifications.False positives#
Setup#
Panther #
T1611↳ also matches create-pods: create pods, update-pods: update pods T1041, T1611↳ also matches create-pods: create pods, update-pods: update pods T1610, T1611↳ also matches create-pods: create pods, update-pods: update pods
References #
delete pods
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"kind": "DeleteOptions",
"apiVersion": "meta.k8s.io/__internal",
"gracePeriodSeconds": 0,
"propagationPolicy": "Background"
},
"responseObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1808",
"generation": 3,
"creationTimestamp": "2026-07-02T04:48:48Z",
"deletionTimestamp": "2026-07-02T04:48:58Z",
"deletionGracePeriodSeconds": 0,
"labels": {
"app": "dw-harn"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-jx7nf",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-jx7nf",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-j4cpn",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 2,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "Initialized",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:48Z"
},
{
"type": "Ready",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "ContainersReady",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "PodScheduled",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:48Z"
}
],
"message": "dw-harn",
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.10",
"podIPs": [
{
"ip": "10.244.0.10"
}
],
"startTime": "2026-07-02T04:48:48Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T04:48:49Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://cbb5514b60b38dcd34d9a3cd6d26f1f35a35af4f9a0abee6f98a0f1b682342c6",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-jx7nf",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"ephemeralContainerStatuses": [
{
"name": "debugger-j4cpn",
"state": {
"terminated": {
"exitCode": 0,
"reason": "Completed",
"startedAt": "2026-07-02T04:48:57Z",
"finishedAt": "2026-07-02T04:48:57Z",
"containerID": "containerd://f7713901b9339c12233bfcdc7a1624b9d31c1838905a863c3d104c6acaa81553"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://f7713901b9339c12233bfcdc7a1624b9d31c1838905a863c3d104c6acaa81553",
"resources": {},
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"requestReceivedTimestamp": "2026-07-02T04:48:58.857582Z",
"stageTimestamp": "2026-07-02T04:48:58.866520Z",
"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 #
deletecollection pods
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods",
"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": "pods",
"namespace": "dw-harn",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"responseObject": {
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"resourceVersion": "1414"
},
"items": [
{
"metadata": {
"name": "dw-harn-jobs-hjgj4",
"generateName": "dw-harn-jobs-",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "868",
"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",
"job-name": "dw-harn-jobs"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-v4bbn",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"volumeMounts": [
{
"name": "kube-api-access-v4bbn",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Never",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 1,
"phase": "Succeeded",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 1,
"status": "False",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:06Z"
},
{
"type": "Initialized",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:04Z",
"reason": "PodCompleted"
},
{
"type": "Ready",
"observedGeneration": 1,
"status": "False",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:05Z",
"reason": "PodCompleted"
},
{
"type": "ContainersReady",
"observedGeneration": 1,
"status": "False",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:05Z",
"reason": "PodCompleted"
},
{
"type": "PodScheduled",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:04Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.9",
"podIPs": [
{
"ip": "10.244.0.9"
}
],
"startTime": "2026-07-02T23:13:04Z",
"containerStatuses": [
{
"name": "c",
"state": {
"terminated": {
"exitCode": 0,
"reason": "Completed",
"startedAt": "2026-07-02T23:13:05Z",
"finishedAt": "2026-07-02T23:13:05Z",
"containerID": "containerd://cc0555bd5981d9fa11273115e18994573fa5de6c180a942ffda517e448b566ac"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://cc0555bd5981d9fa11273115e18994573fa5de6c180a942ffda517e448b566ac",
"started": false,
"resources": {},
"volumeMounts": [
{
"name": "kube-api-access-v4bbn",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "BestEffort",
"resources": {}
}
},
{
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1403",
"generation": 2,
"creationTimestamp": "2026-07-02T23:15:29Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-wffxk",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-wffxk",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-sb6mg",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 2,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:15:29Z"
},
{
"type": "Initialized",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:15:29Z"
},
{
"type": "Ready",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:15:29Z"
},
{
"type": "ContainersReady",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:15:29Z"
},
{
"type": "PodScheduled",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:15:29Z"
}
],
"message": "dw-harn",
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.12",
"podIPs": [
{
"ip": "10.244.0.12"
}
],
"startTime": "2026-07-02T23:15:29Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T23:15:29Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://6c712e71c8533320855d14fcb4a35b0607ede3432ff4e0648f942f963a5e9295",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-wffxk",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"ephemeralContainerStatuses": [
{
"name": "debugger-sb6mg",
"state": {
"terminated": {
"exitCode": 0,
"reason": "Completed",
"startedAt": "2026-07-02T23:16:06Z",
"finishedAt": "2026-07-02T23:16:06Z",
"containerID": "containerd://a10672a7ba0453e05c9453d1957c1af1ea622a27e31fe947367de002123ec2f2"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://a10672a7ba0453e05c9453d1957c1af1ea622a27e31fe947367de002123ec2f2",
"resources": {},
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
{
"metadata": {
"name": "dw-harn-replicationcontrollers-4lkgq",
"generateName": "dw-harn-replicationcontrollers-",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "990",
"generation": 1,
"creationTimestamp": "2026-07-02T23:13:38Z",
"labels": {
"app": "dw-harn"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-zhflt",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {},
"volumeMounts": [
{
"name": "kube-api-access-zhflt",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 1,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:39Z"
},
{
"type": "Initialized",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:38Z"
},
{
"type": "Ready",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:39Z"
},
{
"type": "ContainersReady",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:39Z"
},
{
"type": "PodScheduled",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:38Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.10",
"podIPs": [
{
"ip": "10.244.0.10"
}
],
"startTime": "2026-07-02T23:13:38Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T23:13:39Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://8c005ccf8124b12dda4d565bd8c93d4f2baac1d665e4be944537bbc33df5059b",
"started": true,
"resources": {},
"volumeMounts": [
{
"name": "kube-api-access-zhflt",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "BestEffort",
"resources": {}
}
},
{
"metadata": {
"name": "dw-harn-replicationcontrollers-xhqqz",
"generateName": "dw-harn-replicationcontrollers-",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "999",
"generation": 1,
"creationTimestamp": "2026-07-02T23:13:43Z",
"labels": {
"app": "dw-harn"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-4954t",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {},
"volumeMounts": [
{
"name": "kube-api-access-4954t",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 1,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:43Z"
},
{
"type": "Initialized",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:43Z"
},
{
"type": "Ready",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:43Z"
},
{
"type": "ContainersReady",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:43Z"
},
{
"type": "PodScheduled",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T23:13:43Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T23:13:43Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T23:13:43Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://e9401c60e561db88dd8e3eccee1cb9da508a2e3a9bc68a0a1a66cb3f4be11c4a",
"started": true,
"resources": {},
"volumeMounts": [
{
"name": "kube-api-access-4954t",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "BestEffort",
"resources": {}
}
}
]
},
"requestReceivedTimestamp": "2026-07-02T23:16:08.698127Z",
"stageTimestamp": "2026-07-02T23:16:08.959450Z",
"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 pods/attach
#The audit log records that this call happened, not the interactive session that followed; Falco or Tetragon add that in-session visibility. Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis. 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.Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/attach?container=c&stderr=true&stdout=true",
"verb": "get",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "attach"
},
"responseStatus": {
"metadata": {},
"code": 101
},
"requestReceivedTimestamp": "2026-07-02T22:48:44.678739Z",
"stageTimestamp": "2026-07-02T22:48:52.632830Z",
"annotations": {
"apiserver.latency.k8s.io/authentication": "105.068µs",
"apiserver.latency.k8s.io/authorization": "33.719µs",
"apiserver.latency.k8s.io/etcd": "1.669812ms",
"apiserver.latency.k8s.io/total": "7.954084922s",
"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 Kind Value Rules Vendors objectRef.resource (falco rule field)eq pods1 rule falco objectRef.subresource (falco rule field)is_not_null 1 rule falco verb (falco rule field)eq get1 rule falco Detection Rules #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, list-pods: list pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
Falco #
References #
create pods/attach
#Description
Container attach (kubectl attach; interactive session).
The audit log records that this call happened, not the interactive session that followed; Falco or Tetragon add that in-session visibility. Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis. 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.Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/attach?container=c&stderr=true&stdout=true",
"verb": "create",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "attach"
},
"responseStatus": {
"metadata": {},
"code": 101
},
"requestReceivedTimestamp": "2026-07-02T22:48:52.711282Z",
"stageTimestamp": "2026-07-02T22:49:00.677343Z",
"annotations": {
"apiserver.latency.k8s.io/authentication": "106.127µs",
"apiserver.latency.k8s.io/authorization": "31.005µs",
"apiserver.latency.k8s.io/etcd": "2.32657ms",
"apiserver.latency.k8s.io/total": "7.966054776s",
"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 Kind Value Rules Vendors objectRef.resource (falco rule field)eq pods1 rule falco objectRef.subresource (falco rule field)is_not_null 1 rule falco objectRef:resource (panther rule field)eq pods1 rule panther verb (falco rule field)eq get1 rule falco Detection Rules #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, list-pods: list pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
Panther #
Falco #
References #
create pods/binding
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pod-bind/binding",
"verb": "create",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pod-bind",
"apiVersion": "v1",
"subresource": "binding"
},
"responseStatus": {
"metadata": {},
"status": "Success",
"code": 201
},
"requestObject": {
"kind": "Binding",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pod-bind",
"namespace": "dw-harn"
},
"target": {
"kind": "Node",
"name": "node-control-plane",
"apiVersion": "v1"
}
},
"responseObject": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Success",
"code": 201
},
"requestReceivedTimestamp": "2026-07-02T04:48:57.861172Z",
"stageTimestamp": "2026-07-02T04:48:57.864867Z",
"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 pods/ephemeralcontainers
#Description
Ephemeral debug containers injected into a running pod.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/ephemeralcontainers",
"verb": "get",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "ephemeralcontainers"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T22:49:17.168775Z",
"stageTimestamp": "2026-07-02T22:49:17.170894Z",
"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 pods/ephemeralcontainers
#Description
Adds an ephemeral debug container to a running pod via update. Elastic flags this from a non-system identity: it can inject tooling or reach mounted secrets.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/ephemeralcontainers",
"verb": "update",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"uid": "00000000-0000-0000-0000-000000000000",
"apiVersion": "v1",
"resourceVersion": "1395",
"subresource": "ephemeralcontainers"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1395",
"generation": 2,
"creationTimestamp": "2026-07-02T22:48:39Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-6v2nh",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-qrp4k",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 2,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "Initialized",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
},
{
"type": "Ready",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "ContainersReady",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "PodScheduled",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T22:48:39Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T22:48:40Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://22a94e64e6b0f15416b36663b28abc4da5a9e92f9cc537badb41f3458a4ef2ef",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"ephemeralContainerStatuses": [
{
"name": "debugger-qrp4k",
"state": {
"running": {
"startedAt": "2026-07-02T22:49:16Z"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://03cfd3d6a09e438581fdaebc43da96cdaf4031afd2385027089505a7715dd9e8",
"resources": {},
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"responseObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1395",
"generation": 2,
"creationTimestamp": "2026-07-02T22:48:39Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-6v2nh",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-qrp4k",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 2,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "Initialized",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
},
{
"type": "Ready",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "ContainersReady",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "PodScheduled",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T22:48:39Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T22:48:40Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://22a94e64e6b0f15416b36663b28abc4da5a9e92f9cc537badb41f3458a4ef2ef",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"ephemeralContainerStatuses": [
{
"name": "debugger-qrp4k",
"state": {
"running": {
"startedAt": "2026-07-02T22:49:16Z"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://03cfd3d6a09e438581fdaebc43da96cdaf4031afd2385027089505a7715dd9e8",
"resources": {},
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"requestReceivedTimestamp": "2026-07-02T22:49:17.235993Z",
"stageTimestamp": "2026-07-02T22:49:17.242118Z",
"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\"",
"pod-security.kubernetes.io/enforce-policy": "privileged:latest"
}
}
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 |
|---|---|---|---|---|
azure.platformlogs.properties.log.objectRef.resource (elastic rule field) | eq | pods | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | patch | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | update | 1 rule | elastic |
objectRef.resource (falco rule field) | eq | pods | 1 rule | falco |
objectRef.subresource (falco rule field) | is_not_null | | 1 rule | falco |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → AKS kube-audit events are carried under the flattened Ephemeral containers allow adding a container to an existing pod for troubleshooting. When abused, they can gain interactive access to a workload, read sensitive files, and run tools that were not present in the original image. 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. Ephemeral containers allow adding a container to an existing pod for troubleshooting. When abused, they can be used to gain interactive access to a workload, read sensitive files, and run tools that were not present in the original image.Elastic #
T1610↳ also matches patch-pods-ephemeralcontainers: patch pods/ephemeralcontainers Investigation guide
Triage and analysis#
Investigating Azure AKS Ephemeral Container Added to Pod#
azure.platformlogs.properties.log.* subtree and share the ARM operation event.action: Microsoft.ContainerService/managedClusters/diagnosticLogs/Read. An ephemeral container is attached to a running pod (via kubectl debug) and shares that pod's process and network namespaces. Adversaries use it as a stealthier alternative to exec to read mounted secrets and interact with the workload.Possible investigation steps#
azure.platformlogs.properties.log.user.username (and its groups in azure.platformlogs.properties.log.user.groups) and whether it should debug pods. A username of masterclient with the system:masters group is the AKS local cluster-admin certificate (az aks get-credentials --admin); on clusters with local accounts disabled it should not appear at all, so its presence is itself notable. Entra-integrated admins appear as their UPN/objectId instead.azure.platformlogs.properties.log.requestObject.spec.ephemeralContainers.* fields: the image, command, and targetContainerName show what was run and against which container, and securityContext.capabilities.add (e.g. SYS_PTRACE, SYS_ADMIN) or a privileged context indicates offensive debugging.azure.platformlogs.properties.log.userAgent to distinguish an interactive kubectl debug from automation or custom tooling, and azure.platformlogs.properties.log.responseStatus.code to tell a successful injection (200) from a denied attempt (403) by an identity lacking RBAC.azure.platformlogs.properties.log.objectRef.name / azure.platformlogs.properties.log.objectRef.namespace.azure.platformlogs.properties.log.sourceIPs and pivot on it for related exec sessions, secret reads, or RBAC changes.False positive analysis#
Response and remediation#
T1609, T1611↳ also matches patch-pods-ephemeralcontainers: patch pods/ephemeralcontainers Investigation guide
Triage and analysis#
Investigating GKE Ephemeral Container Added to Pod#
Possible investigation steps#
client.user.email, source.ip, and user_agent.original and confirm the identity is authorized to use ephemeral containers.gcp.audit.resource_name to identify the targeted pod and owning workload.False positive analysis#
kubectl debug may match. Allowlist known admin identities after review.Response and remediation#
T1609, T1611↳ also matches patch-pods-ephemeralcontainers: patch pods/ephemeralcontainers Investigation guide
Triage and analysis#
Investigating Kubernetes Ephemeral Container Added to Pod#
Possible investigation steps#
Response and remediation#
Falco #
References #
patch pods/ephemeralcontainers
#Description
Same ephemeral-container injection as update, via patch. Elastic's rule excludes node/kube-system service accounts and expects only approved admins here.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/ephemeralcontainers",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "ephemeralcontainers"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"spec": {
"ephemeralContainers": [
{
"command": [
"true"
],
"image": "docker.io/library/busybox:1.36",
"name": "debugger-j4cpn",
"resources": {},
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
},
"terminationMessagePolicy": "File"
}
]
}
},
"responseObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1781",
"generation": 2,
"creationTimestamp": "2026-07-02T04:48:48Z",
"labels": {
"app": "dw-harn"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-jx7nf",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-jx7nf",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-j4cpn",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 1,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "Initialized",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:48Z"
},
{
"type": "Ready",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "ContainersReady",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "PodScheduled",
"observedGeneration": 1,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:48Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.10",
"podIPs": [
{
"ip": "10.244.0.10"
}
],
"startTime": "2026-07-02T04:48:48Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T04:48:49Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://cbb5514b60b38dcd34d9a3cd6d26f1f35a35af4f9a0abee6f98a0f1b682342c6",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-jx7nf",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
}
}
},
"requestReceivedTimestamp": "2026-07-02T04:48:57.516952Z",
"stageTimestamp": "2026-07-02T04:48:57.526224Z",
"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\"",
"pod-security.kubernetes.io/enforce-policy": "privileged:latest"
}
}
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 |
|---|---|---|---|---|
azure.platformlogs.properties.log.objectRef.resource (elastic rule field) | eq | pods | 1 rule | elastic |
objectRef.subresource (falco rule field) | is_not_null | | 1 rule | falco |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → AKS kube-audit events are carried under the flattened Ephemeral containers allow adding a container to an existing pod for troubleshooting. When abused, they can gain interactive access to a workload, read sensitive files, and run tools that were not present in the original image. 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. Ephemeral containers allow adding a container to an existing pod for troubleshooting. When abused, they can be used to gain interactive access to a workload, read sensitive files, and run tools that were not present in the original image.Elastic #
T1610↳ also matches update-pods-ephemeralcontainers: update pods/ephemeralcontainers Investigation guide
Triage and analysis#
Investigating Azure AKS Ephemeral Container Added to Pod#
azure.platformlogs.properties.log.* subtree and share the ARM operation event.action: Microsoft.ContainerService/managedClusters/diagnosticLogs/Read. An ephemeral container is attached to a running pod (via kubectl debug) and shares that pod's process and network namespaces. Adversaries use it as a stealthier alternative to exec to read mounted secrets and interact with the workload.Possible investigation steps#
azure.platformlogs.properties.log.user.username (and its groups in azure.platformlogs.properties.log.user.groups) and whether it should debug pods. A username of masterclient with the system:masters group is the AKS local cluster-admin certificate (az aks get-credentials --admin); on clusters with local accounts disabled it should not appear at all, so its presence is itself notable. Entra-integrated admins appear as their UPN/objectId instead.azure.platformlogs.properties.log.requestObject.spec.ephemeralContainers.* fields: the image, command, and targetContainerName show what was run and against which container, and securityContext.capabilities.add (e.g. SYS_PTRACE, SYS_ADMIN) or a privileged context indicates offensive debugging.azure.platformlogs.properties.log.userAgent to distinguish an interactive kubectl debug from automation or custom tooling, and azure.platformlogs.properties.log.responseStatus.code to tell a successful injection (200) from a denied attempt (403) by an identity lacking RBAC.azure.platformlogs.properties.log.objectRef.name / azure.platformlogs.properties.log.objectRef.namespace.azure.platformlogs.properties.log.sourceIPs and pivot on it for related exec sessions, secret reads, or RBAC changes.False positive analysis#
Response and remediation#
T1609, T1611↳ also matches update-pods-ephemeralcontainers: update pods/ephemeralcontainers Investigation guide
Triage and analysis#
Investigating GKE Ephemeral Container Added to Pod#
Possible investigation steps#
client.user.email, source.ip, and user_agent.original and confirm the identity is authorized to use ephemeral containers.gcp.audit.resource_name to identify the targeted pod and owning workload.False positive analysis#
kubectl debug may match. Allowlist known admin identities after review.Response and remediation#
T1609, T1611↳ also matches update-pods-ephemeralcontainers: update pods/ephemeralcontainers Investigation guide
Triage and analysis#
Investigating Kubernetes Ephemeral Container Added to Pod#
Possible investigation steps#
Response and remediation#
Falco #
References #
create pods/eviction
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pod-evict/eviction",
"verb": "create",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pod-evict",
"apiVersion": "v1",
"subresource": "eviction"
},
"responseStatus": {
"metadata": {},
"status": "Success",
"code": 201
},
"requestObject": {
"kind": "Eviction",
"apiVersion": "policy/v1",
"metadata": {
"name": "dw-harn-pod-evict",
"namespace": "dw-harn"
},
"deleteOptions": {
"gracePeriodSeconds": 0
}
},
"responseObject": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Success",
"code": 201
},
"requestReceivedTimestamp": "2026-07-02T04:48:58.720084Z",
"stageTimestamp": "2026-07-02T04:48:58.731234Z",
"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 pods/exec
#Description
Some exec clients issue GET instead of create on pods/exec. Elastic's exec-to-pod rule matches verb (get, create), so a create-only watch misses it.
The audit log records that this call happened, not the interactive session that followed; Falco or Tetragon add that in-session visibility. Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis. Full rule details for this event, including ATT&CK technique mappings and native queries → AKS kube-audit events are carried under the flattened This alert fires when a successful pods/exec API call includes a command targeting GKE/GCP instance metadata. Review This alert fires when a successful pods/exec API call includes a command matching sensitive path or filename patterns. Review Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/exec?command=echo&command=dw-harn&container=c&stderr=true&stdout=true",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "exec"
},
"responseStatus": {
"metadata": {},
"code": 101
},
"requestReceivedTimestamp": "2026-07-02T04:48:49.327201Z",
"stageTimestamp": "2026-07-02T04:48:49.364478Z",
"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 Kind Value Rules Vendors EventType (elastic rule field)in io.k8s.core.v1.pods.exec.create5 rules elastic EventType (elastic rule field)in io.k8s.core.v1.pods.exec.get5 rules elastic kubernetes.audit.objectRef.subresource (elastic rule field)eq exec5 rules elastic ServiceName (elastic rule field)eq k8s.io4 rules elastic kubernetes.audit.requestURI (elastic rule field)contains command=4 rules elastic kubernetes.audit.stage (elastic rule field)in ResponseComplete2 rules elastic kubernetes.audit.stage (elastic rule field)in ResponseStarted2 rules elastic kubernetes.audit.verb (elastic rule field)in get2 rules elastic verb (panther rule field)in create2 rules panther verb (panther rule field)in get2 rules panther azure.platformlogs.category (elastic rule field)eq kube-audit1 rule elastic azure.platformlogs.properties.log.objectRef.resource (elastic rule field)eq pods1 rule elastic azure.platformlogs.properties.log.verb (elastic rule field)in create1 rule elastic azure.platformlogs.properties.log.verb (elastic rule field)in get1 rule elastic objectRef.resource (falco rule field)eq pods1 rule falco Detection Rules #
Elastic #
T1609↳ also matches create-pods-exec: create pods/exec Investigation guide
Triage and analysis#
Investigating Azure AKS Attempted User Exec into Pod#
azure.platformlogs.properties.log.* subtree and share the ARM operation event.action: Microsoft.ContainerService/managedClusters/diagnosticLogs/Read. This rule alerts on a pods/exec request by an identity that is not node, control-plane, or kube-system infrastructure. Exec into a pod grants an interactive shell inside the workload, which adversaries use to read mounted secrets, pivot, and stage tooling.Possible investigation steps#
azure.platformlogs.properties.log.user.username and its groups in azure.platformlogs.properties.log.user.groups, and the target pod in azure.platformlogs.properties.log.objectRef.name / azure.platformlogs.properties.log.objectRef.namespace.azure.platformlogs.properties.log.requestURI and the client in azure.platformlogs.properties.log.userAgent (interactive kubectl vs a scripted client).azure.platformlogs.properties.log.sourceIPs. Pivot on it for related API activity, secret reads, or RBAC changes from the same identity.False positive analysis#
Response and remediation#
T1552, T1552.005, T1609↳ also matches create-pods-exec: create pods/exec Investigation guide
Triage and analysis#
Investigating GKE Pod Exec Cloud Instance Metadata Access#
gcp.audit.labels.command.gke.io/command for the full command string.Possible investigation steps#
client.user.email), source IP, and user agent that performed exec.gcp.audit.resource_name to the target pod/namespace and determine whether the workload should ever call metadata.False positive analysis#
Response and remediation#
T1552, T1552.001, T1552.007, T1609↳ also matches create-pods-exec: create pods/exec Investigation guide
Triage and analysis#
Investigating GKE Pod Exec Sensitive File or Credential Path Access#
gcp.audit.labels.command.gke.io/command for the reconstructed command string.Possible investigation steps#
client.user.email), source IP, and user agent for the exec caller.gcp.audit.resource_name (namespace/pod) to a workload owner, image, and change history.False positive analysis#
Response and remediation#
Panther #
T1530, T1552↳ also matches create-pods-exec: create pods/exec Falco #
References #
create pods/exec
#Description
Remote command execution in a container (kubectl exec issues create on pods/exec subresource).
The audit log records that this call happened, not the interactive session that followed; Falco or Tetragon add that in-session visibility. Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis. 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. AKS kube-audit events are carried under the flattened This alert fires when a successful pods/exec API call includes a command targeting GKE/GCP instance metadata. Review Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/exec?command=true&container=c&stderr=true&stdout=true",
"verb": "create",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "exec"
},
"responseStatus": {
"metadata": {},
"code": 101
},
"requestReceivedTimestamp": "2026-07-02T22:48:44.469099Z",
"stageTimestamp": "2026-07-02T22:48:44.514767Z",
"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 Kind Value Rules Vendors EventType (elastic rule field)in io.k8s.core.v1.pods.exec.create5 rules elastic EventType (elastic rule field)in io.k8s.core.v1.pods.exec.get5 rules elastic kubernetes.audit.objectRef.subresource (elastic rule field)eq exec5 rules elastic ServiceName (elastic rule field)eq k8s.io4 rules elastic kubernetes.audit.requestURI (elastic rule field)contains command=4 rules elastic kubernetes.audit.stage (elastic rule field)in ResponseComplete2 rules elastic kubernetes.audit.stage (elastic rule field)in ResponseStarted2 rules elastic objectRef.resourceeq pods2 rules falco, sigma username (panther rule field)contains serviceaccount2 rules panther verb (panther rule field)in create2 rules panther verb (panther rule field)in get2 rules panther azure.platformlogs.properties.log.objectRef.resource (elastic rule field)eq pods1 rule elastic azure.platformlogs.properties.log.verb (elastic rule field)in create1 rule elastic azure.platformlogs.properties.log.verb (elastic rule field)in get1 rule elastic objectRef.subresource (falco rule field)is_not_null 1 rule falco Detection Rules #
Sigma #
T1609Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, list-pods: list pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1609↳ also matches get-pods-exec: get pods/exec Investigation guide
Triage and analysis#
Investigating Azure AKS Attempted User Exec into Pod#
azure.platformlogs.properties.log.* subtree and share the ARM operation event.action: Microsoft.ContainerService/managedClusters/diagnosticLogs/Read. This rule alerts on a pods/exec request by an identity that is not node, control-plane, or kube-system infrastructure. Exec into a pod grants an interactive shell inside the workload, which adversaries use to read mounted secrets, pivot, and stage tooling.Possible investigation steps#
azure.platformlogs.properties.log.user.username and its groups in azure.platformlogs.properties.log.user.groups, and the target pod in azure.platformlogs.properties.log.objectRef.name / azure.platformlogs.properties.log.objectRef.namespace.azure.platformlogs.properties.log.requestURI and the client in azure.platformlogs.properties.log.userAgent (interactive kubectl vs a scripted client).azure.platformlogs.properties.log.sourceIPs. Pivot on it for related API activity, secret reads, or RBAC changes from the same identity.False positive analysis#
Response and remediation#
T1552, T1552.005, T1609↳ also matches get-pods-exec: get pods/exec Investigation guide
Triage and analysis#
Investigating GKE Pod Exec Cloud Instance Metadata Access#
gcp.audit.labels.command.gke.io/command for the full command string.Possible investigation steps#
client.user.email), source IP, and user agent that performed exec.gcp.audit.resource_name to the target pod/namespace and determine whether the workload should ever call metadata.False positive analysis#
Response and remediation#
Panther #
T1078.004, T1550.001, T1552.007Falco #
References #
get pods/log
#The audit log records that this call happened, not the interactive session that followed; Falco or Tetragon add that in-session visibility. 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.Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/log?container=c",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "log"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:48:49.430544Z",
"stageTimestamp": "2026-07-02T04:48:49.439154Z",
"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 #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, list-pods: list pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
References #
get pods/portforward
#The audit log records that this call happened, not the interactive session that followed; Falco or Tetragon add that in-session visibility. 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.Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/portforward?timeout=3s",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "portforward"
},
"responseStatus": {
"metadata": {},
"code": 101
},
"requestReceivedTimestamp": "2026-07-02T04:48:49.510891Z",
"stageTimestamp": "2026-07-02T04:48:57.450547Z",
"annotations": {
"apiserver.latency.k8s.io/authentication": "98.409µs",
"apiserver.latency.k8s.io/authorization": "26.763µs",
"apiserver.latency.k8s.io/etcd": "1.56406ms",
"apiserver.latency.k8s.io/total": "7.939650371s",
"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 #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, list-pods: list pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
Falco #
References #
create pods/portforward
#Description
Port forwarding from a pod (kubectl port-forward).
The audit log records that this call happened, not the interactive session that followed; Falco or Tetragon add that in-session visibility. 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.Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/portforward?timeout=3s",
"verb": "create",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "portforward"
},
"responseStatus": {
"metadata": {},
"code": 101
},
"requestReceivedTimestamp": "2026-07-02T22:49:08.775116Z",
"stageTimestamp": "2026-07-02T22:49:16.727177Z",
"annotations": {
"apiserver.latency.k8s.io/authentication": "74.099µs",
"apiserver.latency.k8s.io/authorization": "16.315µs",
"apiserver.latency.k8s.io/etcd": "1.43771ms",
"apiserver.latency.k8s.io/total": "7.952054383s",
"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 #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-pods: get pods, list-pods: list pods, watch-pods: watch pods, create-pods: create pods, update-pods: update pods, patch-pods: patch pods, and 6 more Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
Falco #
References #
get pods/proxy
#create pods/proxy
#update pods/proxy
#patch pods/proxy
#delete pods/proxy
#get pods/resize
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/resize",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "resize"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:48:57.668922Z",
"stageTimestamp": "2026-07-02T04:48:57.670371Z",
"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 pods/resize
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/resize",
"verb": "update",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"uid": "00000000-0000-0000-0000-000000000000",
"apiVersion": "v1",
"resourceVersion": "1395",
"subresource": "resize"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1395",
"generation": 2,
"creationTimestamp": "2026-07-02T22:48:39Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-6v2nh",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-qrp4k",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 2,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "Initialized",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
},
{
"type": "Ready",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "ContainersReady",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "PodScheduled",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T22:48:39Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T22:48:40Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://22a94e64e6b0f15416b36663b28abc4da5a9e92f9cc537badb41f3458a4ef2ef",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"ephemeralContainerStatuses": [
{
"name": "debugger-qrp4k",
"state": {
"running": {
"startedAt": "2026-07-02T22:49:16Z"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://03cfd3d6a09e438581fdaebc43da96cdaf4031afd2385027089505a7715dd9e8",
"resources": {},
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"responseObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1395",
"generation": 2,
"creationTimestamp": "2026-07-02T22:48:39Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-6v2nh",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-qrp4k",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 2,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "Initialized",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
},
{
"type": "Ready",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "ContainersReady",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "PodScheduled",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T22:48:39Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T22:48:40Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://22a94e64e6b0f15416b36663b28abc4da5a9e92f9cc537badb41f3458a4ef2ef",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"ephemeralContainerStatuses": [
{
"name": "debugger-qrp4k",
"state": {
"running": {
"startedAt": "2026-07-02T22:49:16Z"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://03cfd3d6a09e438581fdaebc43da96cdaf4031afd2385027089505a7715dd9e8",
"resources": {},
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"requestReceivedTimestamp": "2026-07-02T22:49:17.097404Z",
"stageTimestamp": "2026-07-02T22:49:17.106035Z",
"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\"",
"pod-security.kubernetes.io/enforce-policy": "privileged:latest"
}
}
References #
patch pods/resize
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/resize?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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "resize"
},
"responseStatus": {
"metadata": {},
"status": "Failure",
"message": "Pod \"dw-harn-pods\" is invalid: spec.containers[0].resources.requests: Forbidden: resource requests cannot be removed",
"reason": "Invalid",
"details": {
"name": "dw-harn-pods",
"kind": "Pod",
"causes": [
{
"reason": "FieldValueForbidden",
"message": "Forbidden: resource requests cannot be removed",
"field": "spec.containers[0].resources.requests"
}
]
},
"code": 422
},
"requestObject": {
"spec": {
"containers": [
{
"name": "c",
"resources": {
"requests": {
"cpu": "20m"
}
}
}
]
}
},
"responseObject": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "Pod \"dw-harn-pods\" is invalid: spec.containers[0].resources.requests: Forbidden: resource requests cannot be removed",
"reason": "Invalid",
"details": {
"name": "dw-harn-pods",
"kind": "Pod",
"causes": [
{
"reason": "FieldValueForbidden",
"message": "Forbidden: resource requests cannot be removed",
"field": "spec.containers[0].resources.requests"
}
]
},
"code": 422
},
"requestReceivedTimestamp": "2026-07-02T04:48:57.671450Z",
"stageTimestamp": "2026-07-02T04:48:57.675638Z",
"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 pods/status
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/status",
"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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "status"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:48:57.591897Z",
"stageTimestamp": "2026-07-02T04:48:57.593497Z",
"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 pods/status
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/status",
"verb": "update",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=97ca5ec05d5b7c1923d58d85f4449a4c26b2df61defa2a59b4045149ffed589e"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"uid": "00000000-0000-0000-0000-000000000000",
"apiVersion": "v1",
"resourceVersion": "1392",
"subresource": "status"
},
"responseStatus": {
"metadata": {},
"status": "Failure",
"message": "Operation cannot be fulfilled on pods \"dw-harn-pods\": the object has been modified; please apply your changes to the latest version and try again",
"reason": "Conflict",
"details": {
"name": "dw-harn-pods",
"kind": "pods"
},
"code": 409
},
"requestObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1392",
"generation": 2,
"creationTimestamp": "2026-07-02T22:48:39Z",
"labels": {
"app": "dw-harn",
"dw-harn-patched": "1"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-6v2nh",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-qrp4k",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 2,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "Initialized",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
},
{
"type": "Ready",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "ContainersReady",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:40Z"
},
{
"type": "PodScheduled",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T22:48:39Z"
}
],
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.11",
"podIPs": [
{
"ip": "10.244.0.11"
}
],
"startTime": "2026-07-02T22:48:39Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T22:48:40Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://22a94e64e6b0f15416b36663b28abc4da5a9e92f9cc537badb41f3458a4ef2ef",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-6v2nh",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"ephemeralContainerStatuses": [
{
"name": "debugger-qrp4k",
"state": {
"waiting": {
"reason": "ContainerCreating"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": ""
}
],
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"responseObject": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "Operation cannot be fulfilled on pods \"dw-harn-pods\": the object has been modified; please apply your changes to the latest version and try again",
"reason": "Conflict",
"details": {
"name": "dw-harn-pods",
"kind": "pods"
},
"code": 409
},
"requestReceivedTimestamp": "2026-07-02T22:49:16.959389Z",
"stageTimestamp": "2026-07-02T22:49:16.966869Z",
"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 pods/status
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/pods/dw-harn-pods/status?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": "pods",
"namespace": "dw-harn",
"name": "dw-harn-pods",
"apiVersion": "v1",
"subresource": "status"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"status": {
"message": "dw-harn"
}
},
"responseObject": {
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-pods",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1785",
"generation": 2,
"creationTimestamp": "2026-07-02T04:48:48Z",
"labels": {
"app": "dw-harn"
}
},
"spec": {
"volumes": [
{
"name": "kube-api-access-jx7nf",
"projected": {
"sources": [
{
"serviceAccountToken": {
"expirationSeconds": 3607,
"path": "token"
}
},
{
"configMap": {
"name": "kube-root-ca.crt",
"items": [
{
"key": "ca.crt",
"path": "ca.crt"
}
]
}
},
{
"downwardAPI": {
"items": [
{
"path": "namespace",
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.namespace"
}
}
]
}
}
],
"defaultMode": 420
}
}
],
"containers": [
{
"name": "c",
"image": "docker.io/library/busybox:1.36",
"command": [
"sh",
"-c",
"sleep 3600"
],
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-jx7nf",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"ephemeralContainers": [
{
"name": "debugger-j4cpn",
"image": "docker.io/library/busybox:1.36",
"command": [
"true"
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {
"add": [
"SYS_PTRACE"
]
}
}
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 0,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "node-control-plane",
"securityContext": {},
"schedulerName": "default-scheduler",
"tolerations": [
{
"key": "node.kubernetes.io/not-ready",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
},
{
"key": "node.kubernetes.io/unreachable",
"operator": "Exists",
"effect": "NoExecute",
"tolerationSeconds": 300
}
],
"priority": 0,
"enableServiceLinks": true,
"preemptionPolicy": "PreemptLowerPriority"
},
"status": {
"observedGeneration": 2,
"phase": "Running",
"conditions": [
{
"type": "PodReadyToStartContainers",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "Initialized",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:48Z"
},
{
"type": "Ready",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "ContainersReady",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:49Z"
},
{
"type": "PodScheduled",
"observedGeneration": 2,
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2026-07-02T04:48:48Z"
}
],
"message": "dw-harn",
"hostIP": "172.19.0.2",
"hostIPs": [
{
"ip": "172.19.0.2"
}
],
"podIP": "10.244.0.10",
"podIPs": [
{
"ip": "10.244.0.10"
}
],
"startTime": "2026-07-02T04:48:48Z",
"containerStatuses": [
{
"name": "c",
"state": {
"running": {
"startedAt": "2026-07-02T04:48:49Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": "docker.io/library/busybox@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662",
"containerID": "containerd://cbb5514b60b38dcd34d9a3cd6d26f1f35a35af4f9a0abee6f98a0f1b682342c6",
"started": true,
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"cpu": "10m",
"memory": "16Mi"
}
},
"volumeMounts": [
{
"name": "kube-api-access-jx7nf",
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"readOnly": true,
"recursiveReadOnly": "Disabled"
}
],
"user": {
"linux": {
"uid": 0,
"gid": 0,
"supplementalGroups": [
0,
10
]
}
}
}
],
"qosClass": "Burstable",
"ephemeralContainerStatuses": [
{
"name": "debugger-j4cpn",
"state": {
"waiting": {
"reason": "ContainerCreating"
}
},
"lastState": {},
"ready": false,
"restartCount": 0,
"image": "docker.io/library/busybox:1.36",
"imageID": ""
}
],
"allocatedResources": {
"cpu": "10m",
"memory": "16Mi"
},
"resources": {
"requests": {
"memory": "16Mi"
}
}
}
},
"requestReceivedTimestamp": "2026-07-02T04:48:57.594404Z",
"stageTimestamp": "2026-07-02T04:48:57.599788Z",
"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 pods (synthetic aggregation)
#Description
Synthetic aggregation for rules that filter the pods resource with no specific verb. Not a distinct audit record; hosts rule listings that key on objectRef.resource alone.
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 |
|---|---|---|---|---|
kubernetes.audit.objectRef.resource (elastic rule field) | in | nodes | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | pods | 2 rules | elastic |
EventType (elastic rule field) | in | get | 1 rule | elastic |
EventType (elastic rule field) | in | list | 1 rule | elastic |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries →Elastic #
get/list traffic across distinct API resource kinds that answer those questions (namespaces, workloads, roles, cluster-wide roles) is a common setup and orientation pattern for both interactive attackers and automated recon scripts. It is less typical for steady-state controllers, which usually touch a narrow set of resources repeatedly. This rule highlights that cross-resource burst from a single client fingerprint within a one-minute bucket so analysts can separate routine automation from potential discovery and permission reconnaissance ahead of follow-on actions.T1613T1078