
Локальная Docker-лаборатория для воспроизведения CVE-2026-55255 — уязвимости IDOR в API Responses платформы Langflow. Проверяет выполнение потоков между пользователями в уязвимой и исправленной версиях с помощью PoC на основе HTTP-запросов.
/api/v1/responsesЭтот репозиторий содержит локальную Docker-лабораторию для воспроизведения и проверки CVE-2026-55255 — уязвимости типа Insecure Direct Object Reference (IDOR), затрагивающей OpenAI-совместимый Responses API в Langflow.
Langflow — это платформа с открытым исходным кодом для создания и развёртывания агентов и рабочих процессов на основе ИИ. Уязвимое поведение затрагивает конечную точку /api/v1/responses, где аутентифицированный злоумышленник может указать UUID чужого потока в качестве значения model и заставить Langflow выполнить этот поток, принадлежащий жертве.
Эта лаборатория сравнивает две версии Langflow:
| Сервис | Версия Langflow | Назначение | URL |
|---|---|---|---|
| vuln | 1.9.0 | Уязвимая цель для сравнения | http://localhost:7860 |
| patched | 1.9.1 | Исправленная цель для сравнения | http://localhost:7861 |
Продемонстрированный путь проверки HTTP в этой локальной лабораторной среде:```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
В уязвимой цели ключ API, принадлежащий атакующему, может выполнять поток, принадлежащий жертве, и ответ содержит маркер, доступный только жертве:```text
VICTIM_ONLY_CONTEXT_55255_VULN
В пропатченной цели тот же межпользовательский запрос не возвращает маркер жертвы и возвращает тело ошибки в стиле OpenAI:```json {"error":{"message":"Flow with id '' not found","type":"invalid_request_error","code":"flow_not_found"}}
Эта лабораторная работа проверяет поведение HTTP уязвимой версии по сравнению с исправленной, используя Langflow 1.9.0 и Langflow 1.9.1.
Лабораторная работа намеренно ограничена локальными Docker-сервисами. Она не нацелена на внешние системы и не включает кражу учётных данных, дамп баз данных, разрушительные полезные нагрузки, внешние обратные вызовы, вредоносное ПО, закрепление в системе или действия после эксплуатации.
## Проверенные факты
| Утверждение | Доказательство | Как проверить в этой лабораторной работе |
| ----- | -------- | ------------------------- |
| CVE-2026-55255 затрагивает конечную точку `/api/v1/responses` Langflow. | В уведомлении GitHub GHSA-qrpv-q767-xqq2 описан IDOR в `/api/v1/responses`. | Изучите раздел References и запустите PoC против обеих локальных целей. |
| В уведомлении GitHub указаны затронутые версии `< 1.9.1` и исправленная версия `1.9.1`. | Уведомление GitHub GHSA-qrpv-q767-xqq2. | Сравните уязвимую и исправленную версии целевых сервисов в `docker-compose.yml`. |
| Некоторые вторичные источники об уязвимостях расходятся во мнениях относительно точной исправленной версии. | GitHub/GitLab указывают `1.9.1` как исправленную; некоторые вторичные страницы упоминают `1.9.2` или содержат неоднозначные формулировки. | Изучите раздел References и полагайтесь на результаты лабораторной проверки поведения версии 1.9.1. |
| Эта лабораторная работа использует Langflow 1.9.0 в качестве уязвимой цели для сравнения. | Сервис `vuln` использует `langflowai/langflow:1.9.0`. | Проверьте `docker-compose.yml` и выполните `docker compose ps`. |
| Эта лабораторная работа использует Langflow 1.9.1 в качестве исправленной цели для сравнения. | Сервис `patched` использует `langflowai/langflow:1.9.1`. | Проверьте `docker-compose.yml` и выполните `docker compose ps`. |
| API Responses Langflow использует `POST /api/v1/responses`. | В документации Langflow описан совместимый с OpenAI endpoint Responses API. | Запустите PoC или выполните ручной curl-запрос к `/api/v1/responses`. |
| API Responses Langflow принимает ID потока (flow ID) в качестве значения `model`. | В документации Langflow указано, что значение `model` заменяется на `flow_id`. | Изучите тело запроса в PoC. |
| Запросы к API Langflow требуют API-ключ через `x-api-key`. | В документации API Langflow описана аутентификация по API-ключу с помощью заголовка `x-api-key`. | Изучите заголовки запроса в PoC. |
| PoC основан на HTTP-запросах. | `poc/validate_idor.py` отправляет HTTP-запросы и не вызывает Docker, Docker Compose, shell-команды или контейнерные API. | Изучите `poc/validate_idor.py`. |
| Уязвимая цель выполняет flow, принадлежащий жертве, с использованием API-ключа атакующего. | Уязвимый ответ возвращает `VICTIM_ONLY_CONTEXT_55255_VULN`. | Запустите команду PoC для уязвимой версии с ID flow жертвы и API-ключом атакующего. |
| Исправленная цель блокирует тот же путь выполнения между пользователями. | Исправленный ответ возвращает `error.code = flow_not_found` и не возвращает маркер жертвы. | Запустите команду PoC для исправленной версии с ID flow жертвы и API-ключом атакующего. |
## Допущения и неизвестные
Эта лабораторная работа использует Langflow 1.9.0 в качестве уязвимой цели для сравнения, поскольку уведомление GitHub GHSA-qrpv-q767-xqq2 указывает версии до 1.9.1 как затронутые, а локальное тестирование подтвердило уязвимое поведение в 1.9.0.
Эта лабораторная работа использует Langflow 1.9.1 в качестве исправленной цели для сравнения, поскольку уведомление GitHub GHSA-qrpv-q767-xqq2 указывает 1.9.1 как исправленную версию, а локальное тестирование подтвердило, что 1.9.1 блокирует проверяемый путь выполнения `/api/v1/responses` между пользователями с ошибкой `flow_not_found`.
Между источниками существует расхождение в версиях. В уведомлениях GitHub и GitLab перечислены версии до 1.9.1 как затронутые, а 1.9.1 — как исправленная. Некоторые вторичные страницы с данными об уязвимостях упоминают 1.9.2 или содержат неоднозначные формулировки относительно исправленной версии. Этот репозиторий документирует данное расхождение и напрямую проверяет протестированное поведение:```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
В этой лабораторной работе предполагается, что атакующий уже знает UUID потока жертвы. PoC не перебирает идентификаторы потоков, не перечисляет потоки и не пытается обнаружить идентификаторы потоков жертвы.
Эта лабораторная работа сосредоточена на наблюдаемом HTTP-поведении:```text POST /api/v1/responses
с такой формой запроса:```json
{
"model": "<victim-flow-id>",
"input": "cross-user CVE-2026-55255 validation request",
"stream": false
}
Лабораторная работа демонстрирует несанкционированное выполнение потока между пользователями в уязвимой цели и блокируемое поведение в исправленной цели.
Лабораторная работа не демонстрирует:
Первопричина CVE-2026-55255 — недостаток авторизации в логике разрешения потоков Langflow.
Конечная точка /api/v1/responses принимает UUID потока через поле model. В уязвимых версиях путь поиска UUID внутри get_flow_by_id_or_endpoint_name() мог загружать объект Flow напрямую по первичному ключу, не проверяя, что разрешённый Flow.user_id соответствует пользователю, аутентифицированному по API-ключу.