CVE-2026-49869 · Kestra Authentication Bypass RCE
Executive Summary
What happened: Kestra published GHSA-5vc5-wxxq-3fjx on June 3, 2026 for CVE-2026-49869, a Critical authentication bypass leading to unauthenticated remote code execution; on August 26, Microsoft Security Research reported an observed Kestra compromise and assessed with high confidence that this vulnerability likely provided initial access. The vulnerable OSS filter treated any API path ending in /configs as the public configuration endpoint. An attacker could therefore create or overwrite a flow named configs, trigger that flow without credentials, and use installed script tasks to execute commands as root inside the worker container. Fixed branches begin at 1.0.45 and 1.3.21.
How the observed intrusion unfolded: Microsoft saw two closely timed workflow-origin shell sessions. Follow-on commands queried a mounted Docker socket, enumerated container environment arrays, retrieved and renamed XMRig v6.26.0, enabled RandomX MSR tuning, launched the miner under nohup, and used restrictive permissions and immutable flags around temporary artifacts. A later workflow pulled script content with a curl-pipe-shell pattern, encoded collected output, and stored it through Kestra's key-value interface. Network evidence included a reverse shell to 172.232.38.92:32991 and mining traffic to auto.c3pool.org:443.
Where detection has to live: the best early signal is a Kestra or Java worker lineage spawning a shell, downloader, interpreter, or background utility; curl or wget piped directly into a shell is the strongest portable follow-on. Docker-socket discovery, MSR tuning, XMRig semantics, and permission changes add high-value corroboration. The reported IPs and pool infrastructure are recent but shared, volatile, and reassignable, so they are pivots rather than durable proof. Direct exploit-request detection remains a gap until Kestra or reverse-proxy access logs provide method, path, status, source, and authentication context. Falcon event names, fields, process ancestry, and results still require execution in the intended tenant.
| Priority | Why now | Coverage delivered | Key limitation |
|---|---|---|---|
| Patch and hunt Kestra worker execution | Observed compromise followed public disclosure and the issue is remotely exploitable without credentials | 7 CQL queries: 1 inventory, 3 analyst hunts, 3 alert candidates | Static review only; no Falcon tenant parse, positive canary, or benign baseline evidence |
Source and Claim Review
Eleven current-run snapshots are hash-bound in the accompanying source manifest. Kestra/GitHub and the CVE record share one upstream disclosure group; Microsoft is an independent primary observation source.
Source ledger
| ID | Publisher | Tier | Independence group | Accessed UTC | Status |
|---|---|---|---|---|---|
| S01 | Kestra / GitHub Security Advisory | vendor | kestra-advisory | 2026-08-30T17:37:42Z | retrieved |
| S02 | Microsoft Security Research | primary-research | microsoft-observed-kestra-compromise | 2026-08-30T17:37:42Z | retrieved |
| S03 | CVE Program | primary-research | kestra-advisory | 2026-08-30T17:37:42Z | retrieved |
| S04 | Kestra | vendor | kestra-advisory | 2026-08-30T17:37:42Z | retrieved |
| S05 | Cybersecurity and Infrastructure Security Agency | government | cisa-kev | 2026-08-30T17:37:42Z | retrieved |
| S06 | FIRST | independent-research | first-epss | 2026-08-30T17:37:42Z | retrieved |
| S07 | National Institute of Standards and Technology | government | nist-sp-800-190 | 2026-08-30T17:37:42Z | retrieved |
| S08 | Docker | vendor | docker-docs | 2026-08-30T17:37:42Z | retrieved |
| S09 | Kestra | vendor | kestra-docs | 2026-08-30T17:37:42Z | retrieved |
| S10 | Kestra | vendor | kestra-docs | 2026-08-30T17:37:42Z | retrieved |
| S11 | National Institute of Standards and Technology | government | nist-sp-800-61r3 | 2026-08-30T17:37:42Z | retrieved |
Claim ledger
| Claim | Atomic statement | Sources | Basis | Confidence | Caveat / contradiction |
|---|---|---|---|---|---|
| C01 | Kestra AuthenticationFilter used a suffix match on /configs, allowing other API paths ending in that segment to bypass Basic Authentication. | S01, S03 | direct | high | none |
| C02 | Affected Kestra versions are below 1.0.45 and from 1.1.0 through 1.3.20; fixed releases are 1.0.45 and 1.3.21. | S01, S03 | direct | high | none |
| C03 | The CNA rates CVE-2026-49869 CVSS 3.1 10.0 Critical. | S01, S03 | direct | high | none |
| C04 | An unauthenticated attacker can create or overwrite a flow named configs and trigger it through matching API routes. | S01, S03 | direct | high | none |
| C05 | Default script-execution plugins can turn the bypass into command execution as uid 0 inside the Kestra worker container. | S01, S03 | direct | high | none |
| C06 | The bypass also exposes unauthenticated operations against other resources named configs, including possible log deletion. | S01 | direct | high | none |
| C07 | The vendor advisory documents secondary SSRF potential through the Pebble http() function, including metadata-service reachability in its test environment. | S01 | direct | medium | Deployment-specific reachability varies. |
| C08 | Microsoft reported an observed Kestra compromise on 2026-08-26. | S02 | direct | high | none |
| C09 | Microsoft assesses with high confidence that initial access likely occurred through CVE-2026-49869. | S02 | direct | high | The report expresses an assessment, not definitive exploit-request proof. |
| C10 | The compromised Kestra worker lineage spawned two closely timed workflow-origin shell sessions. | S02 | direct | high | none |
| C11 | Follow-on commands accessed a mounted Docker socket and enumerated Config.Env arrays from reachable containers. | S02 | direct | high | Requires a deployment exposing the Docker socket. |
| C12 | The attacker deployed XMRig v6.26.0, renamed it, enabled RandomX MSR tuning, and communicated with a Monero mining pool. | S02 | direct | high | none |
| C13 | Defense-evasion activity included restrictive permissions and immutable-file operations around a temporary path. | S02 | direct | high | none |
| C14 | A later workflow-origin event used curl piped into a shell, encoded collected output, and stored it through Kestra's key-value interface. | S02 | direct | high | none |
| C15 | The Kestra activity used an interactive reverse shell to 172.232.38.92 on port 32991. | S02 | direct | high | none |
| C16 | The Kestra miner connected to auto.c3pool.org on port 443. | S02 | direct | high | Shared mining infrastructure can produce non-campaign matches. |
| C17 | Microsoft lists 2001:41d0:701:1100::adfd and 47.86.197.116 as c3pool endpoints relevant to the Kestra compromise. | S02 | direct | high | Shared and volatile infrastructure. |
| C18 | The miner was launched with nohup, allowing it to survive shell exit. | S02 | direct | high | Process persistence does not imply restart persistence. |
| C19 | Microsoft recommends patching, interface restriction, least privilege, credential rotation, egress controls, temporary-path hardening, and behavior monitoring for exposed workload compromises. | S02 | direct | high | Guidance is platform-wide and must be adapted to Kestra deployment details. |
| C20 | Kestra published v1.3.21 on 2026-06-02 and listed an authentication-filter bypass fix. | S04 | direct | high | none |
| C21 | CVE-2026-49869 was absent from CISA KEV catalog version 2026.08.27 when checked on 2026-08-30. | S05 | direct | high | Absence is not evidence of non-exploitation. |
| C22 | FIRST EPSS reported probability 0.00991 and percentile 0.60079 for CVE-2026-49869 on 2026-08-30. | S06 | direct | high | The model score does not negate primary observed-compromise reporting. |
Hunt Brief and Attack Chain
The hunt follows the endpoint and network consequences of unauthenticated workflow execution while preserving the actual HTTP exploit sequence as H08, an application-log gap.
Observed and assessed attack chain
| Step | Claims | Behavior | Platform | Detection goal |
|---|---|---|---|---|
| 1 | C04, C09 | Unauthenticated API abuse creates and executes a malicious flow named configs. | network/application | Find exploit-route requests or their earliest endpoint consequence. |
| 2 | C05, C10 | Kestra worker or orchestration lineage launches a Unix shell or execution utility. | linux/container | Detect anomalous child execution from Kestra application context. |
| 3 | C11 | Workflow-origin commands access the Docker socket and enumerate container environment arrays. | linux/container | Identify container-runtime discovery and secret exposure from orchestration context. |
| 4 | C12, C13, C18 | The attacker retrieves, renames, tunes, and backgrounds XMRig while hardening temporary artifacts against cleanup. | linux/container | Find mining preparation, execution, and defense-evasion behavior. |
| 5 | C14 | A later workflow uses curl-pipe-shell and stores encoded collection output via Kestra KV. | linux/container | Detect fileless shell delivery and follow-on collection. |
| 6 | C15, C16, C17 | Compromised workload communicates with reverse-shell and mining infrastructure. | network | Find campaign infrastructure contact and pivot to initiating process lineage. |
Detection hypotheses
| ID | Behavior | Required telemetry | Use | Lookback | Safe validation |
|---|---|---|---|---|---|
| H01 | Identify Kestra process and runtime presence for scoping. | ProcessRollup2 | inventory | 30 days — maximize asset discovery before narrowing compromise windows | Confirm known Kestra test host appears; compare results with CMDB or container inventory and verify unrelated Java services are not mislabeled. |
| H02 | Application-origin shell and utility execution from Kestra context. | ProcessRollup2 | alert-candidate | 14 days — covers recent compromise response while bounding ancestry correlation cost | Run an approved benign Kestra workflow that invokes /bin/sh and confirm one positive; baseline seven days of legitimate script-task parentage and command patterns. |
| H03 | Docker-socket access and container environment discovery. | ProcessRollup2 | hunt | 30 days — discovery may precede or follow monetization and is relatively sparse | In a lab, issue a read-only Docker API container-list or inspect command and verify the command line is captured; compare against approved management-agent baselines. |
| H04 | Network retrieval piped directly into a shell. | ProcessRollup2 | alert-candidate | 14 days — high-signal behavior with moderate environmental false positives | Use a harmless local HTTP response piped to sh in an isolated canary container; verify capture, then measure benign installers for seven days before scheduling. |
| H05 | Cryptominer preparation and execution. | ProcessRollup2, NetworkConnectIP4, NetworkConnectIP6 | alert-candidate | 30 days — miner execution can persist and pool infrastructure may rotate | Use a non-executing command-line canary containing XMRig and a separate approved modprobe simulation string; do not connect to a real mining pool. Baseline authorized performance tooling. |
| H06 | Network contact with reported Kestra compromise infrastructure. | NetworkConnectIP4, NetworkConnectIP6, DnsRequest | hunt | 30 days — indicators are recent but volatile; expire or revalidate after 2026-09-29 | Use historical known-good DNS/network test data or an isolated documentation-domain canary to validate event and field availability; do not contact the listed infrastructure. |
| H07 | Permissions modification and immutable-flag defense evasion in temporary paths. | ProcessRollup2 | hunt | 30 days — rare behavior and useful historical pivot | In an isolated canary directory, apply and remove an immutable flag to a harmless file and verify telemetry; inventory legitimate hardening automation. |
| H08 | HTTP exploit-route sequence against the Kestra API. | Application access logs not yet mapped | gap | 30 days — preserve pre-patch request evidence where retained | After identifying the relevant access-log repository and parser, replay a harmless authenticated request in a lab and validate method/path/authentication fields before writing a tenant-specific query. |
Affected surface and telemetry
Kestra OSS versions before 1.0.45 and versions 1.1.0 through 1.3.20 are affected. The endpoint coverage assumes broadly available Linux process plus IPv4/IPv6 network and DNS events. Kestra or proxy access logs, container file-open events, and a specific parser are not assumed; wrapper depth and worker/task-container lineage require tenant confirmation.
Consolidated IOC Table
Network atomics are source-tagged and time-bounded. API routes and local artifacts are behavioral pivots, not blocklist entries.
| ID | Type | Value | Context | Source | Confidence | Volatility | Action |
|---|---|---|---|---|---|---|---|
| I01 | ipv4 | 172.232.38.92 | Kestra reverse-shell C2 on TCP 32991 | S02 | high | high | detect |
| I02 | domain | auto.c3pool.org | XMRig Monero pool on TCP 443 in the Kestra compromise | S02 | high | high | detect |
| I03 | ipv6 | 2001:41d0:701:1100::adfd | c3pool mining endpoint associated with Kestra activity | S02 | high | high | enrich |
| I04 | ipv4 | 47.86.197.116 | c3pool mining endpoint associated with Kestra activity | S02 | high | high | enrich |
| I05 | url | /api/v1/{tenant}/flows/{namespace}/configs | Unauthenticated vulnerable flow-create or overwrite route pattern | S01 | high | low | hunt |
| I06 | url | /api/v1/{tenant}/executions/{namespace}/configs | Unauthenticated vulnerable flow-execution route pattern | S01 | high | low | hunt |
| I07 | path | /var/run/docker.sock | Mounted runtime socket accessed during post-compromise discovery | S02 | high | low | hunt |
| I08 | path | harvest.sh | Follow-on collection script named by Microsoft | S02 | high | medium | hunt |
ATT&CK Mapping
Mappings below are analyst inferences from source-backed behavior; inventory Q01 carries no ATT&CK mapping.
| Tactic | Technique | Name | Observed behavior | Basis | Sources | Claims |
|---|---|---|---|---|---|---|
| Initial Access | T1190 | Exploit Public-Facing Application | Exploit exposed Kestra API authentication bypass | analyst inference | S01, S02 | C04, C09 |
| Execution | T1059.004 | Unix Shell | Kestra worker launches shell commands and curl-pipe-shell | analyst inference | S01, S02 | C05, C10, C14 |
| Discovery | T1613 | Container and Resource Discovery | Docker socket queries container metadata and environment arrays | analyst inference | S02 | C11 |
| Credential Access | T1552.001 | Unsecured Credentials: Credentials In Files | Collect environment-backed secrets from container configuration | analyst inference | S02 | C11 |
| Command and Control | T1105 | Ingress Tool Transfer | Retrieve XMRig payload | analyst inference | S02 | C12 |
| Defense Evasion | T1222.002 | Linux and Mac File and Directory Permissions Modification | Restrictive permissions and immutable flags on temporary-path artifacts | analyst inference | S02 | C13 |
| Impact | T1496 | Resource Hijacking | XMRig mining and RandomX tuning consume compute for attacker profit | analyst inference | S02 | C12 |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | Reverse-shell and HTTPS mining-pool traffic | analyst inference | S02 | C15, C16 |
No container escape technique is asserted: Microsoft observed Docker-socket access in one deployment, while the vendor advisory did not confirm a direct socket escape in its default test environment.
Native / Non-CQL Hunts
These hunts complement Falcon endpoint queries and are required to validate the initial access path and application context.
| Hunt | Log source | Logic | Response |
|---|---|---|---|
| Malicious flow review | Kestra UI → Executions and Flows | Filter the incident window for flow ID configs, inspect revisions, submitter context, task types, command bodies, outputs, and deletions. | Export records, preserve the flow definition and execution ID, and disable only confirmed malicious flows under incident authority. |
| Exploit-route sequence | io.kestra.webserver.access or reverse-proxy access log | Find unauthenticated PUT requests to flow paths ending /configs followed by POST requests to execution paths ending /configs from the same source/session. | Preserve raw requests and authentication context; block the source only under approved network policy and search for successful worker execution. |
| Docker control-plane access | Docker daemon/audit logs and container runtime inventory | Identify list/inspect calls from the Kestra worker identity and compare affected container Config.Env access with approved task-runner behavior. | Snapshot runtime metadata, remove unneeded socket access, and rotate only credentials within the demonstrated exposure scope. |
| Credential-use follow-through | Cloud, database, and API provider audit consoles | From the compromise time forward, review credential identifiers exposed to the worker for new source locations, scopes, token minting, or unusual data access. | Revoke and reissue in dependency order after evidence preservation; retain identifiers and timestamps, never secret values. |
CrowdStrike LogScale CQL Hunt Queries
All query blocks are static-only designs. Choose the intended Falcon cloud, verify the repository, then run them manually before considering scheduling.
Looks for: process command lines and image paths containing Kestra. Accomplishes: identifies candidate hosts and runtimes for scoping; it is inventory, not evidence of exploitation.
Trace: H01 · A01 · result entity host · dedupe aid, ComputerName
// HUNT: Kestra workload inventory // HYPOTHESIS: H01 // USE: inventory // MITRE: N/A — inventory // CONF: low // FP: medium // COST: low // TIMEFRAME: 30d — discover workloads before narrowing compromise windows // REQUIRES: ProcessRollup2; aid, ComputerName, FileName, ImageFileName, CommandLine; Falcon endpoint event repository // FALSE POSITIVES: Legitimate Kestra servers and unrelated build arguments containing the product name // TUNING: Restrict to known server or container path conventions after validating local deployment patterns // VALIDATION: STATIC-ONLY #event_simpleName=ProcessRollup2 | (CommandLine=/kestra/i OR ImageFileName=/kestra/i OR FileName=/^kestra/i) | table([@timestamp, aid, ComputerName, FileName, ImageFileName, CommandLine], limit=1000)
Looks for: shells, downloaders, interpreters, or nohup launched within direct or two-generation Kestra/Java context. Accomplishes: catches the earliest durable endpoint consequence of malicious workflow execution.
Trace: H02 · A02 · result entity process · dedupe aid, TargetProcessId, @timestamp
// HUNT: Kestra-origin shell and execution utility // HYPOTHESIS: H02 // USE: alert-candidate // MITRE: T1059.004 // CONF: medium // FP: medium // COST: low // TIMEFRAME: 14d — recent compromise window with bounded ancestry review // REQUIRES: ProcessRollup2; aid, ComputerName, FileName, CommandLine, ParentBaseFileName, GrandparentBaseFileName, ParentCommandLine, ParentProcessId, TargetProcessId // FALSE POSITIVES: Approved Kestra script tasks, worker-container troubleshooting, and legitimate automation // TUNING: Exclude approved namespaces, worker images, and exact task command lines only after a benign baseline // VALIDATION: STATIC-ONLY #event_simpleName=ProcessRollup2 | FileName=/^(bash|sh|dash|curl|wget|python|python3|nohup)$/i | (ParentBaseFileName=/^(java|kestra)$/i OR GrandparentBaseFileName=/^(java|kestra)$/i OR ParentCommandLine=/kestra/i) | table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, GrandparentBaseFileName, ParentCommandLine, ParentProcessId, TargetProcessId], limit=1000)
Looks for: commands that query the Docker socket or container API and reference environment/config data. Accomplishes: catches the secret-discovery stage, but needs same-host process context to distinguish administration.
Trace: H03 · A03 · result entity process · dedupe aid, TargetProcessId, @timestamp
// HUNT: Docker socket container environment discovery // HYPOTHESIS: H03 // USE: hunt // MITRE: T1613, T1552.001 // CONF: medium // FP: medium // COST: low // TIMEFRAME: 30d — sparse discovery behavior supports a longer retrospective // REQUIRES: ProcessRollup2; aid, ComputerName, FileName, CommandLine, ParentBaseFileName, TargetProcessId // FALSE POSITIVES: Approved container inventory, management agents, and platform-engineer troubleshooting // TUNING: Exclude signed or path-pinned management agents and approved inventory command lines // VALIDATION: STATIC-ONLY #event_simpleName=ProcessRollup2 | (CommandLine="*/var/run/docker.sock*" OR CommandLine="*/containers/json*" OR CommandLine="*/containers/*/json*") | (CommandLine="*Config.Env*" OR CommandLine="*Env*" OR CommandLine="*inspect*") | table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, TargetProcessId], limit=1000)
Looks for: curl or wget followed by a pipe into sh, bash, or dash. Accomplishes: detects the later fileless delivery pattern with strong portability across Linux workloads.
Trace: H04 · A04 · result entity process · dedupe aid, TargetProcessId, @timestamp
// HUNT: Network retrieval piped directly to Unix shell // HYPOTHESIS: H04 // USE: alert-candidate // MITRE: T1059.004, T1105 // CONF: high // FP: medium // COST: low // TIMEFRAME: 14d — recent high-signal behavior with manageable administrative review // REQUIRES: ProcessRollup2; aid, ComputerName, FileName, CommandLine, ParentBaseFileName, GrandparentBaseFileName, TargetProcessId // FALSE POSITIVES: Bootstrap installers, cloud-init, configuration management, and developer convenience scripts // TUNING: Exclude exact approved installer URLs and signed automation paths; do not exclude curl-pipe-shell globally // VALIDATION: STATIC-ONLY #event_simpleName=ProcessRollup2 | CommandLine=/\b(curl|wget)\b[^\r\n]{0,512}\|\s*(ba|da)?sh\b/i | table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, GrandparentBaseFileName, TargetProcessId], limit=1000)
Looks for: XMRig, RandomX, stratum arguments, or MSR write-enable commands. Accomplishes: catches the monetization stage through durable mining behavior rather than a single payload hash.
Trace: H05 · A05 · result entity process · dedupe aid, TargetProcessId, @timestamp
// HUNT: XMRig and RandomX mining preparation // HYPOTHESIS: H05 // USE: alert-candidate // MITRE: T1496 // CONF: high // FP: low // COST: low // TIMEFRAME: 30d — mining can persist and supports historical compromise review // REQUIRES: ProcessRollup2; aid, ComputerName, FileName, ImageFileName, CommandLine, ParentBaseFileName, TargetProcessId // FALSE POSITIVES: Authorized cryptocurrency mining or approved RandomX performance testing // VALIDATION: STATIC-ONLY #event_simpleName=ProcessRollup2 | (CommandLine=/xmrig|randomx|stratum[+]tcp|donate-level/i OR (FileName=/^modprobe$/i AND CommandLine=/\bmsr\b.*allow_writes/i)) | table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, TargetProcessId], limit=1000)
Looks for: the reported reverse-shell endpoint and c3pool domain or IP endpoints. Accomplishes: provides a fast intrusion-specific pivot; correlate hits with Q02–Q05 before concluding compromise.
Trace: H06 · A06 · result entity ip · dedupe aid, ContextProcessId, remote indicator, @timestamp
// HUNT: Reported Kestra compromise network infrastructure // HYPOTHESIS: H06 // USE: hunt // MITRE: T1071.001 // CONF: high // FP: medium // COST: low // TIMEFRAME: 30d — recent indicators are volatile; revalidate after 2026-09-29 // REQUIRES: NetworkConnectIP4, NetworkConnectIP6, DnsRequest; aid, ComputerName, ContextBaseFileName, ContextProcessId, DomainName, RemoteAddressIP4, RemoteAddressIP6, RemotePort // FALSE POSITIVES: Authorized mining, shared pool use, sinkholing, or later IP reassignment // TUNING: Suppress documented authorized mining hosts and expire network indicators after revalidation // VALIDATION: STATIC-ONLY #event_simpleName=/^(NetworkConnectIP4|NetworkConnectIP6|DnsRequest)$/ | ((RemoteAddressIP4="172.232.38.92" AND RemotePort=32991) OR RemoteAddressIP4="47.86.197.116" OR RemoteAddressIP6="2001:41d0:701:1100::adfd" OR DomainName="auto.c3pool.org") | table([@timestamp, aid, ComputerName, ContextBaseFileName, ContextProcessId, DomainName, RemoteAddressIP4, RemoteAddressIP6, RemotePort], limit=1000)
Looks for: chattr immutable flags or restrictive chmod modes applied under common temporary paths. Accomplishes: catches cleanup resistance but requires ancestry and neighboring-event review for confidence.
Trace: H07 · A07 · result entity process · dedupe aid, TargetProcessId, @timestamp
// HUNT: Temporary-path permissions and immutable-flag changes // HYPOTHESIS: H07 // USE: hunt // MITRE: T1222.002 // CONF: medium // FP: medium // COST: low // TIMEFRAME: 30d — rare behavior supports historical review // REQUIRES: ProcessRollup2; aid, ComputerName, FileName, CommandLine, ParentBaseFileName, TargetProcessId // FALSE POSITIVES: Hardening scripts, backup tools, and package installers manipulating temporary files // TUNING: Exclude exact approved automation paths and service accounts after reviewing surrounding process lineage // VALIDATION: STATIC-ONLY #event_simpleName=ProcessRollup2 | FileName=/^(chattr|chmod)$/i | CommandLine=/(\+i|(^|\s)[04][0-7]{2,3}\s).*(\/tmp\/|\/var\/tmp\/|\/dev\/shm\/)/i | table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, TargetProcessId], limit=1000)
Operationalization and IOA Candidates
Every query has an explicit disposition. Alert packages are complete operational designs but remain blocked from production by missing tenant parse, positive canary, and measured benign-baseline evidence.
| Alert ID | Query | Decision | Readiness | Rationale |
|---|---|---|---|---|
| A01 | Q01 | hunt-only | design-only | Inventory establishes Kestra presence but is not attacker behavior and must not generate a threat alert. |
| A02 | Q02 | alert-package | design-only | Application-origin shell execution has a stable process entity and durable behavior, but parser acceptance, lineage semantics, positive testing, and benign baseline remain unverified. |
| A03 | Q03 | hunt-only | design-only | Docker inspection is context dependent and commonly administrative; direct file-open telemetry and application ancestry are not guaranteed. |
| A04 | Q04 | alert-package | design-only | Curl/wget piped to a shell is a stable process behavior with a usable entity, but legitimate bootstrap activity requires tenant-specific baseline and exclusions. |
| A05 | Q05 | alert-package | design-only | XMRig, RandomX, stratum, and MSR write-enable behavior is high signal with a stable process entity; authorized mining and performance testing still require explicit baseline. |
| A06 | Q06 | hunt-only | design-only | Recent IOCs are useful pivots but volatile, may be shared, and require behavioral correlation before operational alerting. |
| A07 | Q07 | hunt-only | design-only | Temporary-path permission changes require ancestry and local hardening context; the generic query is not sufficiently stable for scheduling. |
A02 · Kestra-Orchestrator-Origin-Execution DESIGN ONLY
- Cadence: 15m with 20m lookback and 5m overlap.
- Grouping and suppression: aid, ComputerName; 60 minutes for the same aid and TargetProcessId; do not suppress a new process ID or materially different CommandLine
- Owner / SLA: Detection Engineering; SOC triage within 15 minutes during coverage hours.
- Positive test: In an isolated canary Kestra worker, run an approved benign flow that launches /bin/sh with a unique marker and no network action.
- Benign baseline: Run Q02 across at least seven representative days, label approved script tasks, and derive exact namespace/image/command exclusions outside the generic pack.
- Rollback: Disable the scheduled search in Falcon Search > Scheduled searches, preserve the last execution details, and revert to analyst-run Q02
A04 · Linux-Download-Piped-To-Shell DESIGN ONLY
- Cadence: 15m with 20m lookback and 5m overlap.
- Grouping and suppression: aid, ComputerName; 60 minutes for identical aid, TargetProcessId, and CommandLine; never suppress a new host
- Owner / SLA: Detection Engineering; SOC triage within 15 minutes during coverage hours.
- Positive test: Serve a harmless echo-only script from a local isolated test service and pipe it to sh inside a canary container; do not contact external infrastructure.
- Benign baseline: Measure at least seven representative days, inventory configuration-management and bootstrap URLs, and test exact allowlist exclusions against the canary.
- Rollback: Disable the scheduled search in Falcon Search > Scheduled searches, preserve the last execution details, and revert to analyst-run Q04
A05 · Linux-XMRig-RandomX-Mining-Behavior DESIGN ONLY
- Cadence: 15m with 30m lookback and 15m overlap.
- Grouping and suppression: aid, ComputerName; 24 hours only for documented authorized test systems and the same process ID; do not suppress new hosts
- Owner / SLA: Detection Engineering; SOC triage within 15 minutes during coverage hours.
- Positive test: Create a non-executing canary command line containing unique xmrig and RandomX markers, plus a separate harmless echo of the modprobe-msr-allow_writes string; do not load modules or mine.
- Benign baseline: Review at least 30 representative days for authorized mining, HPC, or MSR tuning systems and document owners and exclusions.
- Rollback: Disable the scheduled search in Falcon Search > Scheduled searches, preserve the last execution details, and revert to analyst-run Q05
Custom IOA candidates
These are detect-only pilots. Nothing here authorizes prevent mode.
| IOA | Source | Behavior | Exclusions | Pilot | Positive test | Rollback |
|---|---|---|---|---|---|---|
| IOA01 | Q02 | Any matching execution utility; optionally narrow to downloader, shell, and background execution | Exact approved workflow task commands and worker images after measured baseline | detect-only | Approved canary Kestra task launches /bin/sh with a unique marker | Disable IOA rule group and preserve detections and configuration export |
| IOA02 | Q04 | curl or wget content piped to sh, bash, or dash | Exact approved installer URLs and signed automation paths only | detect-only | Harmless local response piped to sh in isolated canary | Disable IOA rule group and preserve detections and configuration export |
| IOA03 | Q05 | xmrig|randomx|stratum or modprobe msr allow_writes | Documented authorized mining and performance-test hosts | detect-only | Non-executing command-line marker; no mining or kernel change | Disable IOA rule group and preserve detections and configuration export |
Machine-Readable IOC Appendix
Copy blocks preserve source tags and a 30-day revalidation date. Treat network values as detect/enrich pivots, not automatic prevention.
type,value,action,severity,expiration,description,tags ipv4,172.232.38.92,detect,high,2026-09-29,Kestra reverse-shell endpoint TCP 32991,source:S02 campaign:kestra domain,auto.c3pool.org,detect,high,2026-09-29,Monero mining pool used in observed Kestra activity,source:S02 campaign:kestra ipv6,2001:41d0:701:1100::adfd,enrich,medium,2026-09-29,c3pool endpoint associated with Kestra activity,source:S02 campaign:kestra ipv4,47.86.197.116,enrich,medium,2026-09-29,c3pool endpoint associated with Kestra activity,source:S02 campaign:kestra
172.232.38.92 auto.c3pool.org 2001:41d0:701:1100::adfd 47.86.197.116
/api/v1/{tenant}/flows/{namespace}/configs
/api/v1/{tenant}/executions/{namespace}/configsNo Kestra-specific malicious file hash was published by the accessible primary compromise source as of 2026-08-30. Local artifacts such as the Docker socket path and collection-script name are carried in section 4 as behavioral context.
Hardening — Tiered and Deployable
Controls are ordered by time-to-risk-reduction. Advisory items require deployment-specific design; deployable designs still require pilot and change approval.
- Upgrade every vulnerable Kestra deployment (M1051; CTRL01) — Upgrade to 1.0.45 or 1.3.21 at minimum, preferably the latest vendor-supported release after compatibility testing; replace pinned container image tags/digests and redeploy through the normal change path. deployable-design Verify: All instances report a fixed or later version; the lab regression request is rejected without valid credentials. Rollback: Restore the previously captured application/database state and prior pinned image only if migration rollback is vendor-supported; otherwise stop and restore from verified backup under change authority.
- Remove direct untrusted reachability to Kestra management surfaces (M1030; CTRL02) — At the existing firewall, load balancer, reverse proxy, or security group, deny direct inbound access to Kestra API/UI ports from untrusted sources and allow only the authenticated access tier or documented administrator/workload ranges. Do not expose management port 8081. advisory Verify: Untrusted direct access is denied while approved authenticated paths and required workflows remain healthy. Rollback: Restore the previous version-controlled network policy after incident/change authority confirms the exposure risk and documents compensating controls.
- Rotate credentials exposed to the compromised worker context (M1026; CTRL03) — After preserving evidence, enumerate credentials available to the affected worker and reachable containers; revoke and reissue them in dependency order, reduce scopes, update the authoritative secret store, and invalidate old values after dependent services confirm the new values. advisory Verify: New credentials authenticate with minimum required scope; revoked values fail; dependent workflows are healthy. Rollback: Re-enable the prior credential only under incident commander and service-owner approval when business continuity requires it; otherwise issue a second replacement and correct dependent configuration.
- Remove or isolate Docker daemon control from Kestra workers (M1048; CTRL04) — Remove the /var/run/docker.sock host volume from the Kestra worker service when unused. Where container execution is required, move it to a dedicated isolated engine or authenticated SSH/mTLS endpoint with a dedicated least-privilege identity and network allowlist; never expose an unauthenticated Docker TCP socket. deployable-design Verify: No host socket mount exists; required tasks succeed only through the isolated authenticated runner; unrelated containers are inaccessible. Rollback: Restore the last approved manifest or endpoint configuration for the pilot pool, redeploy, and re-run health checks; retain compensating network restriction and incident monitoring.
- Deny unexpected worker egress and raw-IP callbacks (M1037; CTRL05) — Apply deny-by-default outbound policy at the worker subnet, container network, or egress proxy. Allow only required package registries, APIs, data services, and control-plane endpoints; block direct raw-IP egress and non-required ports, with DNS and proxy logging enabled. advisory Verify: Approved workflows remain healthy; unapproved raw-IP/non-allowlisted egress is denied and logged. Rollback: Return the pilot policy to audit-only or restore the prior version while preserving logs and keeping campaign indicators explicitly blocked where approved.
- Reduce environment-backed secret exposure and privilege (M1026; CTRL06) — Remove hard-coded credentials from flows. Where supported, reference a managed secret backend with namespace-specific access and short-lived credentials. For OSS, keep SECRET_ values in protected host configuration, restrict process/runtime access, minimize scopes and lifetime, and avoid exposing unrelated credentials to the worker environment. advisory Verify: No literal secret in flow source; the workflow retrieves only the scoped secret and completes; access is auditable where supported. Rollback: Restore the prior secret reference under change control without restoring exposed values; issue a fresh credential if rollback is required.
- Run orchestration tasks with least privilege and resource limits (M1048; CTRL07) — Configure task containers to run as a non-root UID where compatible, disallow privilege escalation, drop unneeded capabilities, use read-only root filesystems where feasible, and enforce CPU/memory limits so a compromised task cannot freely tune or consume host resources. advisory Verify: Tasks run under the approved non-root identity with only required capabilities and enforced limits; prohibited privilege/write tests fail. Rollback: Restore the last approved task-runner security context for the pilot pool and document each compatibility exception with an owner and expiry.
- Capture and protect request-level Kestra access logs (M1047; CTRL08) — Enable micronaut.server.netty.access-logger.enabled=true, set logger-name to io.kestra.webserver.access, and use the documented format containing Date, Duration, Method, Url, Status, Length, Ip, and Port. Forward the log to a protected repository and build a tenant-specific parser before implementing H08. deployable-design Verify: Request records arrive without secret material, fields parse consistently, and application latency remains within the owner-approved threshold. Rollback: Disable the access logger or restore the prior format, restart only if the deployed Kestra/Micronaut version requires it, and verify collector and application health; preserve already collected incident logs.
Deployable-design playbooks
CTRL01 playbook · Upgrade every vulnerable Kestra deployment
- Capture current version, pinned image digest, configuration, database backup, health checks, and representative flow results.
- Review vendor release notes from the current version to the target and confirm rollback support.
- Upgrade one non-production or low-risk cohort to a fixed supported release.
- Verify running version, authentication regression behavior in a lab, queue health, workers, and representative flows.
- Expand only after the pilot meets service thresholds and no migration rollback blocker exists.
- On failure, stop expansion and execute the documented backup/image rollback path.
- Retain version/digest evidence, health results, approvals, and the named platform owner.
CTRL04 playbook · Remove or isolate Docker daemon control from Kestra workers
- Export current Compose/Helm/task-runner configuration and list workflows that require Docker execution.
- Capture worker mounts and confirm whether /var/run/docker.sock is present.
- Remove the socket from one pilot pool or redirect that pool to an authenticated isolated engine.
- Run the representative task suite and verify the worker cannot enumerate unrelated containers.
- Expand only when task success, output collection, and runtime isolation meet owner criteria.
- Rollback the pilot manifest/endpoint if stop conditions occur, then re-run worker and task health checks.
- Retain manifest diff, engine identity, access-denied proof, task results, and approvals.
CTRL08 playbook · Capture and protect request-level Kestra access logs
- Capture current logging configuration, application latency, collector health, and retention settings.
- Enable the documented access logger on one non-production server with a privacy-reviewed format.
- Send harmless authenticated and rejected requests and validate parsed fields and timestamps.
- Monitor volume, latency, secret leakage, and collector backpressure for 24 hours.
- Expand only after parser ownership, retention, and alerting for collector failure are approved.
- Rollback the logger configuration on performance or privacy stop conditions and verify application health.
- Retain redacted sample events, parser version, configuration diff, health metrics, and owner approval.
Containment Runbook
Activation: Confirmed Q02/Q04/Q05 behavior on a Kestra host without an approved workflow explanation; Any connection to I01 from Kestra or shell ancestry; Evidence of Docker-socket environment discovery, XMRig, or unauthorized flow creation/execution; Microsoft-reported Kestra pattern corroborated by two or more independent telemetry types
Decision authority: Incident Commander with Kestra Platform and Business Service Owner input; emergency endpoint isolation may follow the standing incident policy.
| Phase | Trigger | Authority | Owner | Evidence | Recovery |
|---|---|---|---|---|---|
| Validate and declare | Unexplained Kestra-origin execution or corroborated campaign behavior | SOC lead may escalate; Incident Commander declares | SOC / Incident Commander | Original events, query versions, process lineage, Kestra workflow/execution identity | Not applicable; preserve and scope before disruptive action |
| Preserve and scope | Incident declared | Incident Commander | DFIR and Kestra Platform | Raw telemetry, volatile state, flow definitions, logs, containers, mounts, hashes, network and identity audit data | Maintain chain of custody and validated copies before eradication |
| Contain workload | Unauthorized execution, reverse shell, mining, or credential discovery confirmed | Incident Commander plus Business Service Owner; emergency policy if active harm | Endpoint/Container Platform | Isolation timestamp, active connections, affected workers and workflows, continuity decision | Keep unaffected critical workflows on verified clean capacity; document exceptions and monitor them |
| Contain credentials and egress | Secrets or container Config.Env may have been exposed | Incident Commander and credential owners | Secrets/Identity and Network Security | Credential identifiers/scopes, rotation and revocation times, egress policy changes; never secret values | Validate replacement credentials and approved destinations before revocation completes |
| Eradicate and remediate | Evidence preserved and scope sufficiently bounded | Incident Commander and Change Authority | Kestra/Container Platform | Clean image digests, patched versions, removed flows/payloads, corrected mounts, rebuilt hosts/containers | Prefer clean rebuild; restore only verified configuration/data and re-run health/security tests |
| Recover and monitor | Entry point closed, persistence removed, credentials addressed, and clean capacity ready | Incident Commander with Business Service Owner | Service Owner and SOC | Health tests, regression test, credential validation, re-hunt results, heightened monitoring plan | Phased return; rollback to isolated clean capacity if suspicious behavior or service failure recurs |
| Close and improve | Recovery stable and re-hunts clean | Incident Commander | Incident Management and Control Owners | Timeline, root-cause confidence, lessons learned, final query results, control owners/dates | Reopen if delayed telemetry or new indicators identify additional affected assets |
Preservation order
- Alert and query results with exact time window and query version
- Raw Falcon process/network/DNS events
- Full process tree and volatile process/network state
- Suspicious files, paths, hashes, permissions, and container metadata
- Kestra flow definitions, execution records, logs, KV/audit/access logs, and configuration
- Docker/container runtime inventory and mount/socket evidence
- Identity, tokens, credential identifiers, cloud/provider audit records
- Responder actions and tool output with integrity/provenance metadata
Continuity exceptions
- Do not isolate a critical orchestrator until clean capacity or an approved continuity path exists unless active harm outweighs outage risk.
- Do not rotate credentials before preserving identifiers, scopes, use history, and dependency mapping.
- Do not destroy compromised containers or logs before evidence capture; snapshot where policy and platform support it.
- Do not contact the listed attacker or mining infrastructure for testing.
Recovery and closure
Prerequisites: All Kestra instances are on fixed supported versions; Malicious flows, scripts, miners, and unauthorized KV data are removed or systems rebuilt cleanly; Docker socket and privilege exposure are corrected or explicitly risk-accepted; Potentially exposed credentials are rotated/revoked with dependent services healthy; Q02-Q07 re-hunts and access-log review are complete for the scoped window; Falcon sensor, logging, time synchronization, and collector health are confirmed
Closure gates: Incident Commander accepts documented root-cause confidence and remaining gaps; No new correlated hits during at least 72 hours of heightened monitoring; Seven-day retrospective re-hunt completed across affected and peer systems; Service owner confirms workflow integrity and normal operations; All temporary exceptions have owners and expiry dates; Post-incident review assigns durable control and detection actions
Re-hunt: Run Q02-Q07 immediately after containment, again after credential rotation and clean rebuild, at 72 hours, and at seven days; rerun H08 after access-log ingestion becomes available.
Detection Coverage and Validation Evidence
Coverage is scored by evidence state, not by the existence of a query. No row is rated Good because no canary or production evidence exists.
| Technique | Behavior | State | Artifact | Limitation |
|---|---|---|---|---|
| T1190 | Exploit Public-Facing Application | Gap | H08 | Requires parsed Kestra or proxy request logs; endpoint consequences begin at Q02. |
| T1059.004 | Unix Shell | Static | Q02, Q04 | Process ancestry and full command-line capture require tenant confirmation. |
| T1613 | Container and Resource Discovery | Static | Q03 | Command-line view only; direct socket file-open evidence is not assumed. |
| T1552.001 | Credentials in Files | Static | Q03 | Detects discovery commands, not secret contents or confirmed theft. |
| T1105 | Ingress Tool Transfer | Static | Q04, Q05 | Catches delivery/mining semantics; no Kestra-specific payload hash is available. |
| T1222.002 | Linux File Permissions Modification | Static | Q07 | Administrative hardening and package operations need contextual review. |
| T1496 | Resource Hijacking | Static | Q05 | Authorized mining and performance testing require explicit exclusion. |
| T1071.001 | Web Protocols | Static | Q06 | IOC-based and volatile; require same-host behavioral correlation. |
Validation evidence
| Gate / evidence | Recorded state | Meaning |
|---|---|---|
| Structure and safety | Passed by local gate for this exact HTML | 15 sections, offline safety, actions, classes, content floors |
| Field/event vocabulary | Passed heuristic review | Maintained local vocabulary only; not tenant schema proof |
| CQL syntax | Passed heuristic review | Anti-pattern and delimiter checks only; not a Falcon parser |
| IOC provenance | Current-run hashed source snapshots | Network atomics are source-tagged to S02; final status is in the sidecar |
| Falcon tenant execution | No evidence recorded | No parser acceptance, result semantics, canary, benign baseline, or deployment evidence |
Hunt Summary Ticket
This block is ready to paste into an ITSM record; leave Findings blank until the hunt records tenant evidence.
TITLE: CVE-2026-49869 Kestra authentication-bypass RCE hunt — v0.1
SEVERITY: critical — unauthenticated network access can create and execute root-context worker tasks
SCOPE: Kestra OSS; Linux process plus IPv4/IPv6 network and DNS telemetry; Kestra access logs when available
HYPOTHESIS: H02 Kestra/Java worker lineage launches shell or execution utilities
H03 Docker socket and container environment discovery follows execution
H04 curl or wget content is piped directly into a Unix shell
H05 XMRig or RandomX mining behavior monetizes access
H06 reported reverse-shell or mining infrastructure is contacted
H07 temporary artifacts receive restrictive or immutable permissions
H08 unauthenticated /configs flow creation and execution appears in application access logs
QUERIES RUN: Q01 inventory; Q03/Q06/Q07 hunt; Q02/Q04/Q05 alert-candidate
DO FIRST: run Q02 over 14d, then correlate same-host results through Q03–Q07
FINDINGS:
GAPS: H08 parser/repository unknown; ancestry and field semantics not tenant-confirmed; no Kestra-specific payload hash
ACTIONS: Kestra Platform Owner inventories and patches; Detection Engineering parse-tests Q02 and records canary/baseline evidence
OWNER: Detection Engineering with Kestra Platform Owner
VERSION: v0.1 Draft — 2026-08-30 — STATIC REVIEW PASSEDChangelog
This version records no Falcon tenant execution, canary, deployment, or measured production evidence.
References
All references are HTTPS sources captured as current-run UTF-8 snapshots with SHA-256 hashes in the adjacent source manifest. Access dates are UTC.
| ID | Authority / URL | Tier | Accessed | Snapshot | Use |
|---|---|---|---|---|---|
| S01 | Kestra / GitHub Security Advisory | vendor | 2026-08-30T17:37:42Z | S01-kestra-github-advisory.txt | Vulnerability mechanism, affected/fixed versions, exploit routes and impact |
| S02 | Microsoft Security Research | primary-research | 2026-08-30T17:37:42Z | S02-microsoft-kestra-compromise.txt | Observed Kestra compromise, behaviors, network indicators and mitigations |
| S03 | CVE Program | primary-research | 2026-08-30T17:37:42Z | S03-cve-record.txt | CVE status, affected versions, CVSS and CWEs |
| S04 | Kestra | vendor | 2026-08-30T17:37:42Z | S04-kestra-1-3-21-changelog.txt | Kestra 1.3.21 fix release date |
| S05 | Cybersecurity and Infrastructure Security Agency | government | 2026-08-30T17:37:42Z | S05-cisa-kev-check.txt | CISA KEV exact-match context |
| S06 | FIRST | independent-research | 2026-08-30T17:37:42Z | S06-first-epss.txt | EPSS model context |
| S07 | National Institute of Standards and Technology | government | 2026-08-30T17:37:42Z | S07-nist-sp-800-190.txt | Container/orchestrator least-privilege authority |
| S08 | Docker | vendor | 2026-08-30T17:37:42Z | S08-docker-protect-daemon-socket.txt | Docker daemon socket protection authority |
| S09 | Kestra | vendor | 2026-08-30T17:37:42Z | S09-kestra-secrets.txt | Kestra secret handling and edition limitations |
| S10 | Kestra | vendor | 2026-08-30T17:37:42Z | S10-kestra-observability-access-logs.txt | Kestra request access-logging configuration |
| S11 | National Institute of Standards and Technology | government | 2026-08-30T17:37:42Z | S11-nist-sp-800-61r3.txt | Incident response, eradication and recovery authority |
Local static checks do not prove Falcon parsing, tenant field availability, result meaning, positive detection, benign behavior, or prevention.