
Laboratório Docker local para reproduzir CVE-2026-55255, uma vulnerabilidade IDOR na API de Respostas do Langflow. Valida a execução de fluxo entre usuários em versões vulneráveis vs. corrigidas com um PoC baseado em requisição.
/api/v1/responsesEste repositório contém um laboratório Docker local para reproduzir e validar CVE-2026-55255, uma vulnerabilidade de Referência Direta Insegura a Objetos (IDOR) que afeta a API Responses compatível com OpenAI do Langflow.
Langflow é uma plataforma de código aberto para construir e implantar agentes e fluxos de trabalho baseados em IA. O comportamento vulnerável afeta o endpoint /api/v1/responses, onde um atacante autenticado pode fornecer o UUID do fluxo de outro usuário como o valor model e fazer com que o Langflow execute aquele fluxo pertencente à vítima.
Este laboratório compara duas versões do Langflow:
| Serviço | Versão do Langflow | Propósito | URL |
|---|---|---|---|
| vuln | 1.9.0 | Alvo de comparação vulnerável | http://localhost:7860 |
| patched | 1.9.1 | Alvo de comparação corrigido | http://localhost:7861 |
O caminho de validação HTTP demonstrado neste laboratório local é:```text Authenticated attacker API key → POST /api/v1/responses → request body sets model to victim-owned flow UUID → vulnerable target executes the victim-owned flow → patched target returns flow_not_found and does not execute the victim-owned flow
No alvo vulnerável, a chave de API do atacante pode executar o fluxo da vítima e a resposta contém o marcador exclusivo da vítima:```text
VICTIM_ONLY_CONTEXT_55255_VULN
No alvo corrigido, a mesma requisição cross-user não retorna o marcador da vítima e retorna um corpo de erro no estilo OpenAI:```json {"error":{"message":"Flow with id '' not found","type":"invalid_request_error","code":"flow_not_found"}}
Este laboratório valida o comportamento HTTP vulnerável versus corrigido usando Langflow 1.9.0 e Langflow 1.9.1.
O laboratório é intencionalmente limitado a serviços Docker locais. Ele não visa sistemas externos e não inclui roubo de credenciais, extração de banco de dados, payloads destrutivos, callbacks externos, malware, persistência ou atividade pós-exploração.
## Fatos Verificados
| Afirmação | Evidência | Como verificar neste laboratório |
| ----- | -------- | ------------------------- |
| O CVE-2026-55255 afeta o endpoint `/api/v1/responses` do Langflow. | O GitHub Advisory GHSA-qrpv-q767-xqq2 descreve um IDOR em `/api/v1/responses`. | Revise a seção de Referências e execute o PoC contra ambos os alvos locais. |
| O GitHub Advisory lista versões afetadas como `< 1.9.1` e versão corrigida como `1.9.1`. | GitHub Advisory GHSA-qrpv-q767-xqq2. | Compare as versões vulnerável e corrigida dos alvos em `docker-compose.yml`. |
| Algumas fontes de vulnerabilidade downstream discordam sobre a versão exata corrigida. | GitHub/GitLab listam `1.9.1` como corrigida; algumas páginas de inteligência downstream mencionam `1.9.2` ou contêm texto misto. | Revise a seção de Referências e confie na validação do laboratório para o comportamento testado com 1.9.1. |
| Este laboratório usa Langflow 1.9.0 como alvo de comparação vulnerável. | O serviço `vuln` usa `langflowai/langflow:1.9.0`. | Inspecione `docker-compose.yml` e execute `docker compose ps`. |
| Este laboratório usa Langflow 1.9.1 como alvo de comparação corrigido. | O serviço `patched` usa `langflowai/langflow:1.9.1`. | Inspecione `docker-compose.yml` e execute `docker compose ps`. |
| A API de Respostas do Langflow usa `POST /api/v1/responses`. | A documentação do Langflow descreve o endpoint da API de Respostas compatível com OpenAI. | Execute o PoC ou uma requisição curl manual contra `/api/v1/responses`. |
| A API de Respostas do Langflow aceita um ID de fluxo como o valor `model`. | A documentação do Langflow afirma que o valor `model` é substituído por um `flow_id`. | Inspecione o corpo da requisição do PoC. |
| As requisições à API do Langflow exigem uma chave de API através de `x-api-key`. | A documentação da API do Langflow descreve a autenticação por chave de API com o cabeçalho `x-api-key`. | Inspecione os cabeçalhos da requisição do PoC. |
| O PoC é baseado em requisições. | `poc/validate_idor.py` envia requisições HTTP e não chama Docker, Docker Compose, comandos shell ou APIs de contêiner. | Inspecione `poc/validate_idor.py`. |
| O alvo vulnerável executa um fluxo pertencente à vítima com uma chave de API do atacante. | A resposta vulnerável retorna `VICTIM_ONLY_CONTEXT_55255_VULN`. | Execute o comando PoC vulnerável com o ID de fluxo da vítima e a chave de API do atacante. |
| O alvo corrigido bloqueia o mesmo caminho de execução entre usuários. | A resposta corrigida retorna `error.code = flow_not_found` e não retorna o marcador da vítima. | Execute o comando PoC corrigido com o ID de fluxo da vítima e a chave de API do atacante. |
## Suposições e Desconhecidos
Este laboratório usa Langflow 1.9.0 como alvo de comparação vulnerável porque o GitHub Advisory GHSA-qrpv-q767-xqq2 identifica versões anteriores a 1.9.1 como afetadas, e testes locais confirmaram o comportamento vulnerável na versão 1.9.0.
Este laboratório usa Langflow 1.9.1 como alvo de comparação corrigido porque o GitHub Advisory GHSA-qrpv-q767-xqq2 lista 1.9.1 como a versão corrigida, e testes locais confirmaram que 1.9.1 bloqueia o caminho de execução `/api/v1/responses` entre usuários testado com `flow_not_found`.
Há uma discrepância de versão entre as fontes. Os avisos do GitHub e GitLab listam versões anteriores a 1.9.1 como afetadas e 1.9.1 como corrigida. Algumas páginas de inteligência de vulnerabilidade downstream mencionam 1.9.2 ou contêm texto misto em relação à versão corrigida. Este repositório documenta essa discrepância e valida o comportamento testado diretamente:```text
Langflow 1.9.0
→ attacker API key + victim flow UUID
→ victim marker returned
→ vulnerable behavior observed
Langflow 1.9.1
→ attacker API key + victim flow UUID
→ flow_not_found
→ victim marker not returned
→ blocked behavior observed
Este laboratório assume que o atacante já conhece um UUID de fluxo da vítima. O PoC não força IDs de fluxo por tentativa e erro, enumera fluxos ou tenta descobrir IDs de fluxo da vítima. Este laboratório foca no comportamento observável HTTP de:```text POST /api/v1/responses
com esta forma de requisição:```json
{
"model": "<victim-flow-id>",
"input": "cross-user CVE-2026-55255 validation request",
"stream": false
}
O laboratório demonstra a execução não autorizada de fluxo entre usuários no alvo vulnerável e o comportamento bloqueado no alvo corrigido.
O laboratório não demonstra:
A causa raiz do CVE-2026-55255 é uma falha de autorização na lógica de resolução de fluxo do Langflow.
O endpoint /api/v1/responses aceita um UUID de fluxo através do campo model. Em versões vulneráveis, o caminho de busca de UUID dentro de get_flow_by_id_or_endpoint_name() poderia carregar um objeto Flow diretamente pela chave primária sem garantir que o Flow.user_id resolvido correspondesse ao usuário autenticado por chave de API.