Kubetier
← Permission Reference
T1

create pods/binding

Binding an unscheduled Pod to any chosen Node bypasses the scheduler's taint checks entirely, since the kubelet never re-validates taints.

Binding is a separate subresource most policy engines never inspect, unlike spec.nodeName at pod create, so it also evades admission policy.

This matches the real system:kube-scheduler role, which holds create on pods/binding but not on pods itself.

A compromised scheduler inherits this and can redirect any pending Pod, not just its own.

T0 with following verbs:

A chosen pod placed on a control plane node, past the taint meant to exclude it

pods/binding assigns a node directly, and the taint that keeps workloads off the control plane is enforced by the scheduler rather than at admission.

The binding decides where; a pod spec with hostPath or privileged decides what it can do once there.

API Group
(core)
Scope
namespaced
Audit Level
Request

Escalation Paths

  1. Compromise a scheduler component, built-in or custom, whose ServiceAccount holds create on pods/binding but not pods itself, matching the real system:kube-scheduler role

  2. RBAC cannot filter by a Pod's schedulerName field, so any Pod already Pending in the cluster is fair game, not only ones addressed to that scheduler

  3. Create a Binding object for a target Pod naming the desired Node directly, skipping the scheduler's own logic entirely

  4. The kubelet does not re-check taints at admission, so the Pod runs even on a NoSchedule-tainted node with no matching toleration

  5. Admission policy engines typically register their webhook on pods CREATE/UPDATE only.

    Binding is a different subresource they never inspect, so node-placement policies never see it

  6. Targeting a control plane node places a workload past the taint meant to keep it off.

    Combined with a privileged/hostPath Pod spec, this reaches node compromise

Additional rights needed:

none
K8s docs ↗

Included in Built-in Roles

K8s docs ↗