🛡️ CVE-2026-56268 — flowise

🟠 CVSS 7.7 — High ⚠️ Exploit Public CWE-863 OSV
7.7
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Flowise: Cross-Workspace Chatflow Disclosure via chatflows/apikey Endpoint Returns All Unprotected Chatflows

Summary

The /api/v1/chatflows/apikey/:apikey endpoint (whitelisted, accessible with API key auth only) returns all chatflows bound to the provided API key AND all chatflows across the entire system that have no API key assigned. This crosses workspace boundaries, allowing a user in Workspace A who has a valid API key to read the full configuration (including flowData, chatbotConfig, system prompts, and node configurations) of chatflows from Workspace B, Workspace C, and all other workspaces, as long as those chatflows have no API key assigned.

Details

The controller at packages/server/src/controllers/chatflows/index.ts:90-107 validates the API key and calls the service:

```typescript

const getChatflowByApiKey = async (req: Request, res: Response, next: NextFunction) => {

try {

const apikey = await apiKeyService.getApiKey(req.params.apikey)

if (\!apikey) {

return res.status(401).send("Unauthorized")

}

const apiResponse = await chatflowsService.getChatflowByApiKey(apikey.id, req.query.keyonly)

return res.json(apiResponse) // Returns full chatflow objects with flowData

} catch (error) {

next(error)

}

}

```

The service at packages/server/src/services/chatflows/index.ts:223-245 builds the database query:

```typescript

const getChatflowByApiKey = async (apiKeyId: string, keyonly?: unknown): Promise<any> => {

const appServer = getRunningExpressApp()

let query = appServer.AppDataSource.getRepository(ChatFlow)

.createQueryBuilder("cf")

.where("cf.apikeyid = :apikeyid", { apikeyid: apiKeyId })

if (keyonly === undefined) {

// When keyonly is not set (default), also return ALL chatflows with no API key

query = query.orWhere("cf.apikeyid IS NULL").orWhere("cf.apikeyid = ''")

}

const dbResponse = await query.orderBy("cf.name", "ASC").getMany()

return dbResponse // Returns full ChatFlow entities including flowData

}

```

When keyonly is not provided as a query parameter (which is the default case), the query expands to include:

  • All chatflows bound to the provided API key (same workspace, expected behavior)
  • ALL chatflows with apikeyid IS NULL (any workspace, no workspace filter)
  • ALL chatflows with empty apikeyid (any workspace, no workspace filter)

There is NO workspaceId filter in this query. The response includes the full ChatFlow entity, which contains:

  • flowData - the complete workflow graph including system prompts, model names, internal URLs, custom code
  • chatbotConfig - chatbot configuration including allowed origins
  • apiConfig - API configuration and override settings
  • textToSpeech / speechToText - TTS/STT configuration including credential IDs
  • analytic - analytics configuration

PoC

```bash

# Step 1: Attacker has a valid API key for Workspace A

API_KEY="<attacker-workspace-a-api-key>"

# Step 2: Query the chatflows/apikey endpoint WITHOUT keyonly parameter

# Returns the attacker chatflows PLUS all chatflows without API keys from ALL workspaces

curl -s "http://localhost:3000/api/v1/chatflows/apikey/" | jq ".[].workspaceId"

# Step 3: With keyonly parameter, only chatflows bound to the API key are returned

curl -s "http://localhost:3000/api/v1/chatflows/apikey/?keyonly=true" | jq ".[].workspaceId"

```

Impact

  • Cross-Workspace Information Disclosure: A user in any workspace can read the full configuration of chatflows from all other workspaces that do not have an API key assigned. This breaks workspace isolation.
  • Intellectual Property Exposure: System prompts, custom function code, and workflow architecture of chatflows from other workspaces/organizations are exposed.
  • Credential Reference Leakage: The textToSpeech and speechToText fields include credential IDs, which can be abused via the TTS generate endpoint.
  • Amplified by Default: Most chatflows are created without an API key assigned (API keys are opt-in), so the majority of chatflows in a multi-workspace deployment are affected.

Recommended Fix

Add workspace scoping to the getChatflowByApiKey query by passing the API key workspace ID and filtering the OR clause:

```typescript

// packages/server/src/services/chatflows/index.ts

const getChatflowByApiKey = async (apiKeyId: string, keyonly?: unknown, workspaceId?: string): Promise<any> => {

const appServer = getRunningExpressApp()

let query = appServer.AppDataSource.getRepository(ChatFlow)

.createQueryBuilder("cf")

.where("cf.apikeyid = :apikeyid", { apikeyid: apiKeyId })

if (keyonly === undefined && workspaceId) {

// Only include unprotected chatflows from the SAME workspace

query = query.orWhere(

"(cf.apikeyid IS NULL OR cf.apikeyid = :empty) AND cf.workspaceId = :workspaceId",

{ empty: "", workspaceId }

)

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs low-level privileges on the target. No user interaction is required. Rated impact: confidentiality low, integrity none, availability none.

Weakness class

CVE-2026-56268 is classified as CWE-863: Incorrect Authorization. An authorisation check runs but reaches the wrong conclusion, permitting actions it should refuse.

Affected software

CVE-2026-56268 is recorded against 1 package.

  • flowise

Timeline and source

Published on 20 May 2026 and last revised on 20 July 2026. A public exploit is known to exist, which raises the urgency of patching considerably. Record sourced from OSV.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Package)
www.vulncheck.com (Web)

Details

Severity HIGH
CVSS Score 7.7
CVSS Vector CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N
CWE CWE-863
Public Exploit ⚠️ Yes
Source OSV
Published 2026-05-20
Updated 2026-08-12
Modified 2026-07-20
Fix URL N/A

Affected Packages

Software From version Fixed in
flowise

Similar Threats

Exploit Protection

Are you running flowise?

CVE-2026-56268 carries CVSS 7.7 High rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-56268 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.