Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
Kestra-cve-2026-53576 — End-to-end reproduction and cross-layer detection of CVE-2026-53576, the unauthenticated RCE in Kestra - taken past the base PoC to show how a common Docker-socket misconfiguration turns container-root into full host compromise. | Kitploit
Tools/GitHubGitHub/atlasvector/kestra-cve-2026-53576
Privilege EscalationContainer SecurityPersistence MechanismsVulnerability AnalysisExploitationPost-ExploitationPenetration TestingPapers & ResearchRed TeamingIncident ResponseLabs & Practice
2124 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share
GitHub
atlasvector/kestra-cve-2026-53576

Kestra-cve-2026-53576

End-to-end reproduction and cross-layer detection of CVE-2026-53576, the unauthenticated RCE in Kestra - taken past the base PoC to show how a common Docker-socket misconfiguration turns container-root into full host compromise.

View Repository

Unauthenticated RCE in Kestra via a Trailing-Path Auth Bypass (CVE-2026-53576)

Contents

  • Executive Summary
  • 1. Summary
  • 2. Affected / Fixed Versions
  • 3. Test Environment & Pre-Flight Check
  • 4. Root Cause
  • 5. Attack Simulation
  • 6. Detection Engineering
  • 7. ATT&CK Mapping
  • 8. Remediation & Hardening
  • 9. References

Executive Summary

Kestra, an open-source workflow orchestration platform, shipped an authentication filter that decided whether a request needed credentials by checking if the URL ended with /configs - a check meant to expose one harmless public endpoint.

Because the check only looked at the tail of the string, any request whose URL happened to end that way skipped authentication entirely, including endpoints that create and run arbitrary code. The result: anyone who can reach a vulnerable Kestra instance over the network can run commands as root with zero credentials, no phishing, no password guessing, no privilege escalation step required.

In this exercise, that single gap was carried end-to-end against a self-hosted lab instance:

  • Unauthenticated code execution.
  • Discovery of an exposed Docker socket.
  • Escalation to full root access on the underlying host.
  • Two independent persistence mechanisms (an SSH backdoor key and a scheduled beacon).

Every stage was captured against defensive telemetry (network IDS, host runtime security, Linux audit, and system logs).

Business impact if unpatched: complete compromise of the host running Kestra, not just the application - and by extension anything else reachable from that host.

Fix: upgrade to Kestra 1.0.45 / 1.3.21 or later (patch alone closes the primary vulnerability; the escalation and persistence stages require a separate, independent fix - don't mount the Docker socket into application containers, see Section 8).

1. Summary

This report documents CVE-2026-53576, a CVSS 10.0 unauthenticated remote code execution vulnerability in Kestra ≤1.3.20, caused by a path-suffix authentication bypass (AuthenticationFilter.java, endsWith("/configs")).

An attacker who names a workflow's namespace and ID configs can create and execute arbitrary shell commands with no credentials, as root, inside the Kestra container. Fixed in 1.0.45 and 1.3.21. The identical bug was also reported independently under CVE-2026-49869, which is the CISA KEV-listed number tied to real in-the-wild exploitation. Both should be cited together, since public sources and scanners may reference either one.

2. Affected / Fixed Versions

VulnerableKestra ≤ 1.3.20 (and pre-1.0.45 on the 1.0.x line)
Fixed1.0.45 / 1.3.21+
CVECVE-2026-53576
Twin advisoryCVE-2026-49869 - same bug, CISA KEV-listed (in-the-wild)

Timeline

DateEvent
2026-06-02Kestra 1.3.21 released; changelog references a "potential authentication bypass in the authentication filter"
2026-06-03Kestra 1.0.45 released on the 1.0.x line
2026-09-02CVE-2026-49869 (the twin advisory) added to the CISA KEV catalog
2026-09-22 to 09-24This lab reproduction, detection build, and cross-layer validation

3. Test Environment & Pre-Flight Check

Self-hosted homelab: - Debian host (hostname docker, kernel 6.12.107+deb13-amd64), - Docker Engine 29.8.1. - Kestra deployed as the official kestra/kestra:v1.3.20 image, reachable through a Caddy reverse proxy at kestra.int.atlasvec.com. - Telemetry stack under test: Falco (runtime/eBPF, host-level), - Suricata 8.0.3 IDS (passive SPAN mirror), forwarding toward Splunk.

Before touching anything, I confirmed the target was actually vulnerable and the telemetry stack was live. I also took a snapshot of the pre-attack state so I could revert once I was done.

Kestra running the vulnerable version: 01-kestra-version-v1.3.20

The container itself, up and reachable: 06-docker-kestra-running

Falco's units loaded on the host: 02-falco-units-one-active

Falco actively emitting events (modern eBPF mode): 03-falco-modern-bpf-active-emitting

Suricata's service active: 04-suricata-systemctl-active

And its eve.json writing live events: 05-suricata-eve-json-live

4. Root Cause

This is two mistakes lining up, not one.

First, the authentication filter decides whether a request can skip auth by matching the end of the request path:

// AuthenticationFilter.java — the vulnerable check, confirmed against the self-hosted v1.3.20 source
if (path.endsWith("/configs")) {
    // treated as a public, unauthenticated path
}

That check exists to expose a single harmless endpoint, the public instance config. Because endsWith only reads the tail of the string, it cannot tell that one safe path apart from any other path that happens to end the same way.

Second, Kestra's router still dispatches those look-alike paths to their real, sensitive handlers. /api/v1/main/flows/configs reaches the flow-create handler. /api/v1/main/executions/configs/configs reaches the execution handler. The filter waves both through as public, and the router runs them anyway. Name a flow's namespace and ID configs, and a code-executing endpoint now ends in /configs, so it inherits the public path's free pass.

The captured request pair shows it plainly. GET /api/v1/main/flows/search with no credentials returns 401. POST /api/v1/main/flows/configs with the same empty auth header returns 200 and stores the flow (see §5.1).

5. Attack Simulation

Every step below is captured with its own screenshot. All of it runs inside my own isolated homelab against a self-hosted Kestra instance behind the reverse proxy.

5.1 Stage 1 - auth bypass -> root inside the Kestra container

Download Tool