Исследователь Graham Helton опубликовал интересную находку: разрешение nodes/proxy GET в Kubernetes позволяет выполнять команды в любом поде кластера, включая привилегированные системные.
В чем суть - kubelet принимает решение об авторизации на основе начального HTTP-метода WebSocket handshake (GET), а не проверяет реальную операцию. При использовании WebSocket для /exec endpoint требуется только nodes/proxy GET, хотя должно требоваться CREATE.
Из интересного:
1. Затронуто 69 helm charts (Prometheus, Grafana, Datadog, Elastic Agent, Cilium, New Relic и др.)
2. Обход идет через прямое подключение к Kubelet API (port 10250)
3. AuditPolicy не логирует выполнение команд через прямое подключение к Kubelet
4. Kubernetes Security Team закрыли репорт как "Working as intended"
PoC:
websocat --insecure \
--header "Authorization: Bearer $TOKEN" \
--protocol v4.channel.k8s.io \
"wss://$NODE_IP:10250/exec/default/nginx/nginx?output=1&error=1&command=id"
Детекция:
Автор предоставил скрипт для проверки всех service accounts в кластере.
Рекомендуемое решение от Kubernetes — внедрение KEP-2862 (Fine-Grained Kubelet Authorization), но оно пока в Beta и не решает базовую проблему.
Не забудьте проверить ваши кластера!
#kubernetes #rce #security