
Modelo Nuclei para detetar CVE-2026-33017, uma vulnerabilidade de execução remota de código não autenticada no Langflow ≤ 1.8.2. Realiza pré-verificações não destrutivas para distinguir builds vulneráveis de corrigidas através da análise de respostas HTTP.
Template Nuclei que detecta CVE-2026-33017 — uma vulnerabilidade de execução remota de código não autenticada no Langflow ≤ 1.8.2 acessível através do endpoint público de construção de fluxo:
POST /api/v1/build_public_tmp/{flow_id}/flow
O manipulador vulnerável aceita um grafo de fluxo data controlado pelo atacante e passa data.nodes[].data.node.template.code.value diretamente para exec() do Python durante a construção do grafo, sem sandboxing. A correção (≥ 1.9.0) remove o parâmetro data da assinatura do manipulador, então uma versão corrigida rejeita a mesma requisição na camada de validação do FastAPI com HTTP 422.
O template é não destrutivo. Ele envia um payload inerte contra um ID de fluxo zero-UUID, portanto não pode alcançar exec() mesmo em um host vulnerável. Ele distingue o manipulador vulnerável do corrigido apenas pela assinatura da resposta HTTP.
| Etapa | Requisição | O que informa |
|---|---|---|
| 1 | GET /api/v1/version |
Roteamento para a etapa 2:
Uma confirmação real de RCE ainda requer (a) um UUID de fluxo PÚBLICO real no alvo e (b) um callback fora de banda (DNS/HTTP). Essa etapa não está incluída aqui de propósito — este template é a pré-verificação segura que decide se vale a pena executar um exploit ativo.
Host único:
nuclei -t CVE-2026-33017.yaml -u https://target.example.com
Escaneamento em lote a partir de uma lista:
nuclei -t CVE-2026-33017.yaml -l targets.txt -rl 20 -c 10
Com saída de depuração (veja as requisições/respostas brutas):
nuclei -t CVE-2026-33017.yaml -u https://target.example.com -debug-req -debug-resp
Valide o template localmente antes de executá-lo:
nuclei -validate -t CVE-2026-33017.yaml
Alvo vulnerável:
[CVE-2026-33017] [http] [critical] https://target.example.com [vulnerable-flow-not-found] ["1.8.2","base"]
Alvo corrigido — nenhum achado emitido (resposta 422 não corresponde a nenhuma regra).
Consultas comuns de descoberta para hosts Langflow (use apenas contra ativos que você está autorizado a testar):
http.title:"Langflow"app="Langflow"intitle:"Langflow" inurl:"/flows"AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HEm builds vulneráveis, o manipulador público é declarado aproximadamente como:
@router.post("/build_public_tmp/{flow_id}/flow")
async def build_public_flow(flow_id: UUID, data: FlowDataRequest | None = None, ...):
...
await verify_public_flow_and_get_user(flow_id, ...)
...
# data.nodes[].data.node.template.code.value reaches exec() in the
# Component build path
data é controlado pelo atacante. O manipulador corrigido remove o parâmetro completamente e força data=None, por isso uma requisição que inclui um campo data no corpo é rejeitada com 422 em builds corrigidos.
/api/v1/build_public_tmp/ no proxy reverso.LANGFLOW_AUTO_LOGIN=False, configure credenciais de superusuário e rotacione LANGFLOW_SECRET_KEY.access_type=PUBLIC são aqueles que um atacante visaria na URL.Este template é publicado apenas para segurança defensiva e testes autorizados. Executá-lo contra sistemas que você não possui ou para os quais não tem permissão explícita por escrito para testar é ilegal na maioria das jurisdições e viola os termos de serviço da plataforma.
Ao usar este template, você concorda que:
lopseg — https://github.com/lopseg
Pull requests e issues são bem-vindos.
MIT
| Confirma que o alvo é Langflow e extrai a versão da build. |
| 2 | POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000000/flow com um corpo contendo o campo data e um template.code.value inerte | Decisão de roteamento abaixo. |
| Status | Corpo contém | Veredito |
|---|
404 | flow / public | VULNERÁVEL — manipulador aceitou data, a busca falhou porque o UUID é falso. |
200 | job_id / build / task | VULNERÁVEL — manipulador aceitou data e entrou no caminho de construção. |
5xx | exec / Component / traceback | VULNERÁVEL — manipulador alcançou o caminho de código exec antes de falhar. |
422 | Field required / extra / data | CORRIGIDO — a assinatura do manipulador não aceita mais data. |