ClusterRoleBindings
| Operation | Description | Sample | Rule |
|---|---|---|---|
| get-clusterrolebindings | Y | Y | |
| list-clusterrolebindings | Y | Y | |
| watch-clusterrolebindings | Y | Y | |
| create-clusterrolebindings | ClusterRoleBinding created (RBAC privilege escalation or persistence). | Y | Y |
| update-clusterrolebindings | Changes an existing ClusterRoleBinding's subjects (roleRef is immutable), quietly adding a principal to an already-approved cluster-admin-class grant. | Y | Y |
| patch-clusterrolebindings | Same subject-widening mechanism as update, via patch. Sigma's rolebinding-modification rule and Elastic's service-account RBAC-write rule both cover this verb. | Y | Y |
| delete-clusterrolebindings | Removes a ClusterRoleBinding, revoking whatever access it granted. Sigma and Elastic both track deletion alongside create/update/patch as a tracked RBAC change. | Y | Y |
| deletecollection-clusterrolebindings | Y | N | |
| any-clusterrolebindings | Synthetic aggregation for rules that filter the clusterrolebindings resource with no specific verb. Not a distinct audit record; hosts rule listings that key on objectRef.resource alone. | N | Y |
get clusterrolebindings
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/dw-harn-clusterrolebindings",
"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": "clusterrolebindings",
"name": "dw-harn-clusterrolebindings",
"apiGroup": "rbac.authorization.k8s.io",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:48:14.335182Z",
"stageTimestamp": "2026-07-02T04:48:14.336392Z",
"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 |
|---|---|---|---|---|
container.id (elastic rule field) | wildcard | * | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | eq | pods | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | namespaces | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | nodes | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | pods | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectaccessreviews | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectrulesreviews | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | serviceaccounts | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | in | ResponseComplete | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | in | ResponseStarted | 1 rule | elastic |
kubernetes.audit.verb (elastic rule field) | in | watch | 1 rule | elastic |
process.args (elastic rule field) | in | /bin/chmod | 1 rule | elastic |
process.args (elastic rule field) | in | /bin/which | 1 rule | elastic |
process.args (elastic rule field) | in | /usr/bin/chmod | 1 rule | elastic |
process.args (elastic rule field) | in | /usr/bin/which | 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. 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-clusterrolebindings: list clusterrolebindings, watch-clusterrolebindings: watch clusterrolebindings, create-clusterrolebindings: create clusterrolebindings, update-clusterrolebindings: update clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings 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-clusterrolebindings: list clusterrolebindings 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 clusterrolebindings
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings?labelSelector=dw-harn-patched%3D1",
"verb": "list",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=fd038e49e5a46840f8f58360c3f09257f92bccd0cadad3ad68fcfec20b99b52c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "clusterrolebindings",
"apiGroup": "rbac.authorization.k8s.io",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T22:13:08.976432Z",
"stageTimestamp": "2026-07-02T22:13:08.978011Z",
"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 |
|---|---|---|---|---|
container.id (elastic rule field) | wildcard | * | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | eq | pods | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | namespaces | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | nodes | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | pods | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectaccessreviews | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectrulesreviews | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | serviceaccounts | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | in | ResponseComplete | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | in | ResponseStarted | 1 rule | elastic |
kubernetes.audit.verb (elastic rule field) | in | watch | 1 rule | elastic |
process.args (elastic rule field) | in | /bin/chmod | 1 rule | elastic |
process.args (elastic rule field) | in | /bin/which | 1 rule | elastic |
process.args (elastic rule field) | in | /usr/bin/chmod | 1 rule | elastic |
process.args (elastic rule field) | in | /usr/bin/which | 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. 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-clusterrolebindings: get clusterrolebindings, watch-clusterrolebindings: watch clusterrolebindings, create-clusterrolebindings: create clusterrolebindings, update-clusterrolebindings: update clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings 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-clusterrolebindings: get clusterrolebindings 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 #
watch clusterrolebindings
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings?resourceVersion=927&timeout=3s&watch=true",
"verb": "watch",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=fd038e49e5a46840f8f58360c3f09257f92bccd0cadad3ad68fcfec20b99b52c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "clusterrolebindings",
"apiGroup": "rbac.authorization.k8s.io",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T22:13:05.594066Z",
"stageTimestamp": "2026-07-02T22:13:08.608229Z",
"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 |
|---|---|---|---|---|
container.id (elastic rule field) | wildcard | * | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | eq | pods | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | namespaces | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | nodes | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | pods | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectaccessreviews | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectrulesreviews | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | serviceaccounts | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | in | ResponseComplete | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | in | ResponseStarted | 1 rule | elastic |
kubernetes.audit.verb (elastic rule field) | in | watch | 1 rule | elastic |
process.args (elastic rule field) | in | /bin/chmod | 1 rule | elastic |
process.args (elastic rule field) | in | /bin/which | 1 rule | elastic |
process.args (elastic rule field) | in | /usr/bin/chmod | 1 rule | elastic |
process.args (elastic rule field) | in | /usr/bin/which | 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.Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-clusterrolebindings: get clusterrolebindings, list-clusterrolebindings: list clusterrolebindings, create-clusterrolebindings: create clusterrolebindings, update-clusterrolebindings: update clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings 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 clusterrolebindings
#Description
ClusterRoleBinding created (RBAC privilege escalation or persistence).
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings?fieldManager=kubectl-create&fieldValidation=Strict",
"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": "clusterrolebindings",
"name": "dw-harn-clusterrolebindings",
"apiGroup": "rbac.authorization.k8s.io",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 201
},
"requestObject": {
"kind": "ClusterRoleBinding",
"apiVersion": "rbac.authorization.k8s.io/v1",
"metadata": {
"name": "dw-harn-clusterrolebindings"
},
"subjects": [
{
"kind": "ServiceAccount",
"name": "default",
"namespace": "dw-harn"
}
],
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "view"
}
},
"responseObject": {
"kind": "ClusterRoleBinding",
"apiVersion": "rbac.authorization.k8s.io/v1",
"metadata": {
"name": "dw-harn-clusterrolebindings",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1672",
"creationTimestamp": "2026-07-02T04:48:14Z"
},
"subjects": [
{
"kind": "ServiceAccount",
"name": "default",
"namespace": "dw-harn"
}
],
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "view"
}
},
"requestReceivedTimestamp": "2026-07-02T04:48:14.274756Z",
"stageTimestamp": "2026-07-02T04:48:14.277475Z",
"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 |
|---|---|---|---|---|
kubernetes.audit.objectRef.resource (elastic rule field) | in | clusterrolebindings | 4 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | rolebindings | 4 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | clusterroles | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | roles | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.create | 3 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.patch | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.update | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.rolebindings.create | 2 rules | elastic |
kubernetes.audit.annotations.authorization_k8s_io/decision (elastic rule field) | eq | allow | 3 rules | elastic |
objectRef.resource | eq | clusterrolebindings | 3 rules | falco, sigma |
verb | eq | create | 3 rules | falco, sigma |
kubernetes.audit.verb (elastic rule field) | eq | create | 2 rules | elastic |
stage (falco rule field) | eq | responsecomplete | 2 rules | falco |
client.user.email (elastic rule field) | starts_with | system:serviceaccount: | 1 rule | elastic |
container.id (elastic rule field) | wildcard | * | 1 rule | elastic |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Identify who created or changed the binding and which subject received cluster-admin. This rule detects creation of a RoleBinding or ClusterRoleBinding whose subject is a ServiceAccount. Attackers often bind over-privileged roles to an existing workload service account to operate with elevated rights. This rule detects service accounts performing allowed write actions on RBAC resources. Stolen or over-privileged service account tokens can silently alter authorization to gain or retain elevated access.Sigma #
Elastic #
T1098, T1098.006↳ also matches update-clusterrolebindings: update clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings Investigation guide
Triage and analysis#
Investigating GKE Cluster-Admin Role Binding Created or Modified#
Investigation steps#
client.user.email, source.ip, and gcp.audit.request for the bound subject.False positives#
system:apiserver during control plane reconciliation (excluded).T1098, T1098.006Investigation guide
Triage and analysis#
Investigating GKE Creation of a RoleBinding Referencing a ServiceAccount#
Possible investigation steps#
client.user.email, source.ip, gcp.audit.request.roleRef, and gcp.audit.request.subjects.False positive analysis#
Response and remediation#
T1098, T1098.006↳ also matches update-clusterrolebindings: update clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings, delete-clusterrolebindings: delete clusterrolebindings Investigation guide
Triage and analysis#
Investigating GKE Service Account Modified RBAC Objects#
Possible investigation steps#
client.user.email, event.action, and gcp.audit.resource_name.False positive analysis#
Response and remediation#
Panther #
T1078.004, T1098Falco #
References #
update clusterrolebindings
#Description
Changes an existing ClusterRoleBinding's subjects (roleRef is immutable), quietly adding a principal to an already-approved cluster-admin-class grant.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/dw-harn-clusterrolebindings?fieldManager=kubectl-replace&fieldValidation=Strict",
"verb": "update",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=4cf95d11cbd90036bab41cdc6b88cc8f91550e9135ed4bb61495b02f647812ff"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "clusterrolebindings",
"name": "dw-harn-clusterrolebindings",
"uid": "00000000-0000-0000-0000-000000000000",
"apiGroup": "rbac.authorization.k8s.io",
"apiVersion": "v1",
"resourceVersion": "874"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"kind": "ClusterRoleBinding",
"apiVersion": "rbac.authorization.k8s.io/v1",
"metadata": {
"name": "dw-harn-clusterrolebindings",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "874",
"creationTimestamp": "2026-07-02T21:31:51Z",
"labels": {
"dw-harn-patched": "1"
}
},
"subjects": [
{
"kind": "ServiceAccount",
"name": "default",
"namespace": "dw-harn"
}
],
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "view"
}
},
"responseObject": {
"kind": "ClusterRoleBinding",
"apiVersion": "rbac.authorization.k8s.io/v1",
"metadata": {
"name": "dw-harn-clusterrolebindings",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "874",
"creationTimestamp": "2026-07-02T21:31:51Z",
"labels": {
"dw-harn-patched": "1"
}
},
"subjects": [
{
"kind": "ServiceAccount",
"name": "default",
"namespace": "dw-harn"
}
],
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "view"
}
},
"requestReceivedTimestamp": "2026-07-02T21:31:55.200864Z",
"stageTimestamp": "2026-07-02T21:31:55.203101Z",
"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 |
|---|---|---|---|---|
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.create | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.patch | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.update | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.rolebindings.create | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | eq | pods | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | clusterrolebindings | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | clusterroles | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | rolebindings | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | roles | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | namespaces | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | nodes | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | pods | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectaccessreviews | 1 rule | elastic |
client.user.email (elastic rule field) | starts_with | system:serviceaccount: | 1 rule | elastic |
container.id (elastic rule field) | wildcard | * | 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. Identify who created or changed the binding and which subject received cluster-admin. This rule detects service accounts performing allowed write actions on RBAC resources. Stolen or over-privileged service account tokens can silently alter authorization to gain or retain elevated access.Sigma #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-clusterrolebindings: get clusterrolebindings, list-clusterrolebindings: list clusterrolebindings, watch-clusterrolebindings: watch clusterrolebindings, create-clusterrolebindings: create clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1098, T1098.006↳ also matches create-clusterrolebindings: create clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings Investigation guide
Triage and analysis#
Investigating GKE Cluster-Admin Role Binding Created or Modified#
Investigation steps#
client.user.email, source.ip, and gcp.audit.request for the bound subject.False positives#
system:apiserver during control plane reconciliation (excluded).T1098, T1098.006↳ also matches create-clusterrolebindings: create clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings, delete-clusterrolebindings: delete clusterrolebindings Investigation guide
Triage and analysis#
Investigating GKE Service Account Modified RBAC Objects#
Possible investigation steps#
client.user.email, event.action, and gcp.audit.resource_name.False positive analysis#
Response and remediation#
References #
patch clusterrolebindings
#Description
Same subject-widening mechanism as update, via patch. Sigma's rolebinding-modification rule and Elastic's service-account RBAC-write rule both cover this verb.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/dw-harn-clusterrolebindings?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": "clusterrolebindings",
"name": "dw-harn-clusterrolebindings",
"apiGroup": "rbac.authorization.k8s.io",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"metadata": {
"labels": {
"dw-harn-patched": "1"
}
}
},
"responseObject": {
"kind": "ClusterRoleBinding",
"apiVersion": "rbac.authorization.k8s.io/v1",
"metadata": {
"name": "dw-harn-clusterrolebindings",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1684",
"creationTimestamp": "2026-07-02T04:48:14Z",
"labels": {
"dw-harn-patched": "1"
}
},
"subjects": [
{
"kind": "ServiceAccount",
"name": "default",
"namespace": "dw-harn"
}
],
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "view"
}
},
"requestReceivedTimestamp": "2026-07-02T04:48:17.535853Z",
"stageTimestamp": "2026-07-02T04:48:17.539866Z",
"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 |
|---|---|---|---|---|
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.create | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.patch | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.update | 2 rules | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.rolebindings.create | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | clusterrolebindings | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | rolebindings | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | namespaces | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectaccessreviews | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | selfsubjectrulesreviews | 1 rule | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | serviceaccounts | 1 rule | elastic |
client.user.email (elastic rule field) | starts_with | system:serviceaccount: | 1 rule | elastic |
container.id (elastic rule field) | wildcard | * | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | in | ResponseComplete | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | in | ResponseStarted | 1 rule | elastic |
kubernetes.audit.user.username (elastic rule field) | starts_with | system:serviceaccount: | 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. Identify who created or changed the binding and which subject received cluster-admin. This rule detects service accounts performing allowed write actions on RBAC resources. Stolen or over-privileged service account tokens can silently alter authorization to gain or retain elevated access.Sigma #
Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-clusterrolebindings: get clusterrolebindings, list-clusterrolebindings: list clusterrolebindings, watch-clusterrolebindings: watch clusterrolebindings, create-clusterrolebindings: create clusterrolebindings, update-clusterrolebindings: update clusterrolebindings Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1098, T1098.006↳ also matches create-clusterrolebindings: create clusterrolebindings, update-clusterrolebindings: update clusterrolebindings Investigation guide
Triage and analysis#
Investigating GKE Cluster-Admin Role Binding Created or Modified#
Investigation steps#
client.user.email, source.ip, and gcp.audit.request for the bound subject.False positives#
system:apiserver during control plane reconciliation (excluded).T1098, T1098.006↳ also matches create-clusterrolebindings: create clusterrolebindings, update-clusterrolebindings: update clusterrolebindings, delete-clusterrolebindings: delete clusterrolebindings Investigation guide
Triage and analysis#
Investigating GKE Service Account Modified RBAC Objects#
Possible investigation steps#
client.user.email, event.action, and gcp.audit.resource_name.False positive analysis#
Response and remediation#
References #
delete clusterrolebindings
#Description
Removes a ClusterRoleBinding, revoking whatever access it granted. Sigma and Elastic both track deletion alongside create/update/patch as a tracked RBAC change.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/dw-harn-clusterrolebindings",
"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": "clusterrolebindings",
"name": "dw-harn-clusterrolebindings",
"apiGroup": "rbac.authorization.k8s.io",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"status": "Success",
"details": {
"name": "dw-harn-clusterrolebindings",
"group": "rbac.authorization.k8s.io",
"kind": "clusterrolebindings",
"uid": "00000000-0000-0000-0000-000000000000"
},
"code": 200
},
"requestObject": {
"kind": "DeleteOptions",
"apiVersion": "meta.k8s.io/__internal",
"propagationPolicy": "Background"
},
"responseObject": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Success",
"details": {
"name": "dw-harn-clusterrolebindings",
"group": "rbac.authorization.k8s.io",
"kind": "clusterrolebindings",
"uid": "00000000-0000-0000-0000-000000000000"
}
},
"requestReceivedTimestamp": "2026-07-02T04:48:17.600626Z",
"stageTimestamp": "2026-07-02T04:48:17.604502Z",
"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 | eq | clusterrolebindings | 2 rules | falco, sigma |
objectRef.resource (sigma rule field) | eq | rolebindings | 1 rule | sigma |
verb | eq | delete | 2 rules | falco, sigma |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.create | 1 rule | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.patch | 1 rule | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.clusterrolebindings.update | 1 rule | elastic |
EventType (elastic rule field) | in | io.k8s.authorization.rbac.v1.rolebindings.create | 1 rule | elastic |
client.user.email (elastic rule field) | starts_with | system:serviceaccount: | 1 rule | elastic |
jevt.rawtime (falco rule field) | is_not_null | | 1 rule | falco |
kubernetes.audit.user.username (elastic rule field) | starts_with | system:serviceaccount: | 1 rule | elastic |
responseStatus.code (falco rule field) | starts_with | 2 | 1 rule | falco |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → This rule detects service accounts performing allowed write actions on RBAC resources. Stolen or over-privileged service account tokens can silently alter authorization to gain or retain elevated access. 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 Kubernetes service accounts performing allowed write actions on RBAC resources such as Roles and RoleBindings, which is atypical because service accounts rarely administer permissions. It matters because stolen or over-privileged service account tokens can silently alter authorization to gain or retain elevated access across the cluster. An attacker commonly uses a compromised workload’s token to create or patch a binding that grants cluster-admin privileges to their service account for persistent control.Sigma #
Elastic #
T1098, T1098.006↳ also matches create-clusterrolebindings: create clusterrolebindings, update-clusterrolebindings: update clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings Investigation guide
Triage and analysis#
Investigating GKE Service Account Modified RBAC Objects#
Possible investigation steps#
client.user.email, event.action, and gcp.audit.resource_name.False positive analysis#
Response and remediation#
T1098, T1098.006↳ also matches create-clusterrolebindings: create clusterrolebindings, update-clusterrolebindings: update clusterrolebindings, patch-clusterrolebindings: patch clusterrolebindings Investigation guide
Triage and analysis#
Investigating Kubernetes Service Account Modified RBAC Objects#
Possible investigation steps#
False positive analysis#
Response and remediation#
kubectl rollout undo where applicable) and verify no new subjects gained wildcard or cluster-admin-equivalent access.cluster-admin, introduces * verbs/resources, or binds a service account to privileged ClusterRoles across namespaces.Falco #
References #
deletecollection clusterrolebindings
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings?labelSelector=dw-harn-patched",
"verb": "deletecollection",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=3ffde68ef687218e01296d94b0aa59c81cc98de2bd73ab70e21510c8cd4b9cec"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "clusterrolebindings",
"apiGroup": "rbac.authorization.k8s.io",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"responseObject": {
"kind": "ClusterRoleBindingList",
"apiVersion": "rbac.authorization.k8s.io/v1",
"metadata": {
"resourceVersion": "1075"
},
"items": [
{
"metadata": {
"name": "dw-harn-clusterrolebindings",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1075",
"creationTimestamp": "2026-07-02T23:14:06Z",
"labels": {
"dw-harn-patched": "1"
}
},
"subjects": [
{
"kind": "ServiceAccount",
"name": "default",
"namespace": "dw-harn"
}
],
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "view"
}
}
]
},
"requestReceivedTimestamp": "2026-07-02T23:14:09.605806Z",
"stageTimestamp": "2026-07-02T23:14:09.611150Z",
"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 clusterrolebindings (synthetic aggregation)
#Description
Synthetic aggregation for rules that filter the clusterrolebindings 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 |
|---|---|---|---|---|
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.T1613