
Lab Docker locale per riprodurre CVE-2026-55255, una vulnerabilità IDOR nell'API Responses di Langflow. Valida l'esecuzione dei flussi tra utenti nelle versioni vulnerabili rispetto a quelle corrette con un PoC basato su richieste.
/api/v1/responsesQuesto repository contiene un lab Docker locale per riprodurre e validare CVE-2026-55255, una vulnerabilità di Insecure Direct Object Reference (IDOR) che colpisce l'API Responses compatibile con OpenAI di Langflow.
Langflow è una piattaforma open-source per creare e distribuire agenti e flussi di lavoro basati sull'IA. Il comportamento vulnerabile interessa l'endpoint /api/v1/responses, dove un attaccante autenticato può fornire l'UUID del flusso di un altro utente come valore model e indurre Langflow a eseguire quel flusso di proprietà della vittima.
Questo lab confronta due versioni di Langflow:
| Servizio | Versione Langflow | Scopo | URL |
|---|---|---|---|
| vuln | 1.9.0 | Target di confronto vulnerabile | http://localhost:7860 |
| patched | 1.9.1 | Target di confronto corretto | http://localhost:7861 |
Il percorso di validazione HTTP dimostrato in questo lab locale è:```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
Nel target vulnerabile, la chiave API di proprietà dell'attaccante può eseguire il flusso di proprietà della vittima e la risposta contiene il marker esclusivo della vittima:```text
VICTIM_ONLY_CONTEXT_55255_VULN
Nel target patchato, la stessa richiesta cross-user non restituisce il marker della vittima e restituisce un corpo di errore in stile OpenAI:```json {"error":{"message":"Flow with id '' not found","type":"invalid_request_error","code":"flow_not_found"}}
This lab valida il comportamento HTTP vulnerabile rispetto a quello corretto utilizzando Langflow 1.9.0 e Langflow 1.9.1.
Il lab è volutamente limitato ai servizi Docker locali. Non prende di mira sistemi esterni e non include furto di credenziali, dumping di database, payload distruttivi, callback esterni, malware, persistenza o attività di post-exploitation.
## Fatti Verificati
| Affermazione | Evidenza | Come verificare in questo lab |
| ----- | -------- | ------------------------- |
| CVE-2026-55255 interessa l'endpoint `/api/v1/responses` di Langflow. | La GitHub Advisory GHSA-qrpv-q767-xqq2 descrive un IDOR in `/api/v1/responses`. | Esaminare la sezione References ed eseguire il PoC contro entrambi i target locali. |
| La GitHub Advisory elenca le versioni interessate come `< 1.9.1` e la versione corretta come `1.9.1`. | GitHub Advisory GHSA-qrpv-q767-xqq2. | Confrontare le versioni vulnerabile e corretta dei target in `docker-compose.yml`. |
| Alcune fonti di vulnerabilità secondarie non concordano sulla versione esatta della correzione. | GitHub/GitLab elencano `1.9.1` come corretta; alcune pagine di intelligence a valle menzionano `1.9.2` o contengono formulazioni contrastanti. | Esaminare la sezione References e basarsi sulla validazione del lab per il comportamento testato di 1.9.1. |
| Questo lab utilizza Langflow 1.9.0 come target di confronto vulnerabile. | Il servizio `vuln` utilizza `langflowai/langflow:1.9.0`. | Ispezionare `docker-compose.yml` ed eseguire `docker compose ps`. |
| Questo lab utilizza Langflow 1.9.1 come target di confronto corretto. | Il servizio `patched` utilizza `langflowai/langflow:1.9.1`. | Ispezionare `docker-compose.yml` ed eseguire `docker compose ps`. |
| L'API Responses di Langflow utilizza `POST /api/v1/responses`. | La documentazione di Langflow descrive l'endpoint dell'API Responses compatibile con OpenAI. | Eseguire il PoC o una richiesta curl manuale contro `/api/v1/responses`. |
| L'API Responses di Langflow accetta un ID di flow come valore `model`. | La documentazione di Langflow afferma che il valore `model` viene sostituito con un `flow_id`. | Ispezionare il corpo della richiesta del PoC. |
| Le richieste API di Langflow richiedono una chiave API tramite `x-api-key`. | La documentazione API di Langflow descrive l'autenticazione tramite chiave API con l'header `x-api-key`. | Ispezionare gli header della richiesta del PoC. |
| Il PoC è basato su richieste. | `poc/validate_idor.py` invia richieste HTTP e non chiama Docker, Docker Compose, comandi shell o API dei container. | Ispezionare `poc/validate_idor.py`. |
| Il target vulnerabile esegue un flow di proprietà della vittima con una chiave API di proprietà dell'attaccante. | La risposta vulnerabile restituisce `VICTIM_ONLY_CONTEXT_55255_VULN`. | Eseguire il comando del PoC vulnerabile con l'ID del flow della vittima e la chiave API dell'attaccante. |
| Il target corretto blocca lo stesso percorso di esecuzione tra utenti. | La risposta corretta restituisce `error.code = flow_not_found` e non restituisce il marcatore della vittima. | Eseguire il comando del PoC corretto con l'ID del flow della vittima e la chiave API dell'attaccante. |
## Ipotesi e Incognite
Questo lab utilizza Langflow 1.9.0 come target di confronto vulnerabile perché la GitHub Advisory GHSA-qrpv-q767-xqq2 identifica le versioni precedenti alla 1.9.1 come interessate, e i test locali hanno confermato il comportamento vulnerabile in 1.9.0.
Questo lab utilizza Langflow 1.9.1 come target di confronto corretto perché la GitHub Advisory GHSA-qrpv-q767-xqq2 elenca 1.9.1 come versione corretta, e i test locali hanno confermato che 1.9.1 blocca il percorso di esecuzione tra utenti `/api/v1/responses` testato con `flow_not_found`.
Esiste una discrepanza di versioni tra le fonti. Le advisory di GitHub e GitLab elencano le versioni precedenti alla 1.9.1 come interessate e la 1.9.1 come corretta. Alcune pagine di intelligence sulle vulnerabilità a valle menzionano la 1.9.2 o contengono formulazioni contrastanti riguardo alla versione corretta. Questo repository documenta tale discrepanza e valida direttamente il comportamento testato:```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
Questo laboratorio presuppone che l'attaccante conosca già un UUID del flusso vittima. La PoC non esegue brute force sugli ID di flusso, non enumera i flussi e non tenta di scoprire gli ID di flusso della vittima.
Questo laboratorio si concentra sul comportamento HTTP osservabile di:```text POST /api/v1/responses
con questa forma di richiesta:```json
{
"model": "<victim-flow-id>",
"input": "cross-user CVE-2026-55255 validation request",
"stream": false
}
The lab demonstrates unauthorized cross-user flow execution in the vulnerable target and blocked behavior in the patched target.
The lab does not demonstrate:
The root cause of CVE-2026-55255 is an authorization gap in Langflow's flow resolution logic.
The /api/v1/responses endpoint accepts a flow UUID through the model field. In vulnerable versions, the UUID lookup path inside get_flow_by_id_or_endpoint_name() could load a Flow object directly by primary key without enforcing that the resolved Flow.user_id matched the authenticated API-key user.