Aug 4, 2026·7 min read·2 visits
Flowise versions prior to 3.1.3 contain an incorrect authorization flaw allowing users with limited deletion permissions (e.g., agentflows only) to delete other flow types (e.g., chatflows) due to missing resource-type validation checks in the deletion service layer.
CVE-2026-69262 is a high-severity incorrect authorization vulnerability (CWE-863) within the Flowise drag-and-drop LLM flow platform. Prior to version 3.1.3, Flowise did not enforce resource-type validation on its deletion endpoint. Although routing middleware ensured users held deletion privileges for either chatflows or agentflows, the service level lacked validation checks to verify whether the target resource matched the user's specific permissions. Consequently, an authenticated user with only agentflow deletion permissions could delete arbitrary chatflow configurations, leading to unauthorized state modification and service disruption.
Flowise is an open-source, low-code platform designed for orchestrating and managing large language model (LLM) workflows. The platform exposes administrative and configuration interfaces via HTTP REST APIs, allowing users to build, run, and modify agents, vector stores, and conversational pipelines. The core of this functionality relies on the Express-based backend server component, which exposes various APIs for managing entity data and session state.
This vulnerability, tracked as CVE-2026-69262 (GHSA-p5w8-m249-4r4v), is classified under CWE-863: Incorrect Authorization. In collaborative or multi-tenant deployment scenarios, access to specific entity types like chatflows, agentflows, or assistants is governed by granular permission roles. However, the system's deletion workflow failed to properly enforce these boundaries, exposing the internal state to unauthorized operations.
Because the backend did not cross-reference the entity type of the target database record with the caller's specific permission scope, the deletion endpoint allowed users to modify resources beyond their assigned roles. The attack surface is accessible to any authenticated user with at least some basic deletion permissions, presenting a significant threat to resource integrity and service availability in multi-user environments.
The root cause of this vulnerability lies in a structural mismatch between the route-level middleware definitions and the downstream service-level verification logic. Flowise routes utilize an Express middleware helper called checkAnyPermission to filter requests based on permission groups. For the chatflow deletion endpoint (DELETE /api/v1/chatflows/:id), the middleware was initialized to allow access to users holding either chatflow or agentflow deletion privileges.
This configuration behaves as a logical OR statement. If the requesting user possesses agentflows:delete but lacks chatflows:delete, the middleware successfully validates the request and passes execution to chatflowsController.deleteChatflow. The routing logic assumes that the downstream controller or service will perform more precise validation, but this critical verification was absent.
Once the controller received the request, it forwarded the target identifier (:id) directly to chatflowsService.deleteChatflow. The service queried the database, retrieved the ChatFlow object, and directly invoked the database delete function. Because both chatflows and agentflows reside within the same database table and share identical identifier formats, the application deleted the resource without checking if the user possessed the specific permission corresponding to the resource's type attribute.
To completely remediate this flaw, the Flowise development team modified the routing, controller, and service-level components to enforce type mapping. Instead of relying solely on the routing middleware, the system now maps the user's explicit permissions to a restricted set of allowed database entity types before performing the database operation.
Below is the vulnerable controller logic contrasted with the patched controller implementation in packages/server/src/controllers/chatflows/index.ts:
// VULNERABLE CONTROLLER LOGIC
const deleteChatflow = async (req: Request, res: Response, next: NextFunction) => {
try {
// Directly passes parameters to service without evaluating user permission types
const apiResponse = await chatflowsService.deleteChatflow(req.params.id, orgId, workspaceId)
return res.json(apiResponse)
} catch (error) {
next(error)
}
}// PATCHED CONTROLLER LOGIC
const deleteChatflow = async (req: Request, res: Response, next: NextFunction) => {
try {
const userPermittedTypes: EnumChatflowType[] = []
const permissions = req.user!.permissions
if (req.user?.isOrganizationAdmin) {
// Administrators automatically acquire all permissions
userPermittedTypes.push(EnumChatflowType.CHATFLOW)
userPermittedTypes.push(EnumChatflowType.AGENTFLOW)
userPermittedTypes.push(EnumChatflowType.MULTIAGENT)
userPermittedTypes.push(EnumChatflowType.ASSISTANT)
} else {
// Map explicit permission strings to database enum values
if (permissions.includes(`chatflows:delete`)) userPermittedTypes.push(EnumChatflowType.CHATFLOW)
if (permissions.includes(`agentflows:delete`)) {
userPermittedTypes.push(EnumChatflowType.AGENTFLOW)
userPermittedTypes.push(EnumChatflowType.MULTIAGENT)
}
if (permissions.includes(`assistants:delete`)) userPermittedTypes.push(EnumChatflowType.ASSISTANT)
if (userPermittedTypes.length === 0)
throw new InternalFlowiseError(StatusCodes.FORBIDDEN, `You do not have permission to delete any chatflow types`)
}
// Pass mapped userPermittedTypes downstream
const apiResponse = await chatflowsService.deleteChatflow(req.params.id, orgId, workspaceId, userPermittedTypes)
return res.json(apiResponse)
} catch (error) {
next(error)
}
}Following the controller refactoring, the corresponding service component in packages/server/src/services/chatflows/index.ts was patched to validate the fetched record against the permitted array:
// PATCHED SERVICE LAYER LOGIC
const deleteChatflow = async (
chatflowId: string,
orgId: string,
workspaceId: string,
userPermittedTypes: EnumChatflowType[]
): Promise<any> => {
try {
const appServer = getRunningExpressApp()
const chatflow = await getChatflowById(chatflowId, workspaceId)
// Assert that the fetched flow's type attribute is included in the user's permitted types
if (!userPermittedTypes.includes(chatflow.type as EnumChatflowType))
throw new InternalFlowiseError(StatusCodes.FORBIDDEN, `You do not have permission to delete this chatflow type`)
const dbResponse = await appServer.AppDataSource.getRepository(ChatFlow).delete({ id: chatflowId })Exploitation of CVE-2026-69262 requires authenticated access to a target Flowise workspace, with the attacker possessing a session token assigned with limited deletion capabilities. An attacker lacking any deletion rights is stopped at the routing level, making this vulnerability inaccessible to unauthenticated external threats.
Once authenticated, the attacker identifies the UUID of the target chatflow to be deleted. Because these flow identifiers are represented as UUIDs, they must first be obtained via normal interface usage, application logging, or related endpoint read operations. Once the identifier is obtained, the attacker transmits a direct HTTP DELETE request to the vulnerable endpoint.
The exploit can be reproduced using a standard command-line HTTP utility. The following proof-of-concept curl command executes the deletion of a targeted chatflow using an agentflow editor's authorization header:
curl -X DELETE "http://target-host:3000/api/v1/chatflows/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" \
-H "Authorization: Bearer <agentflow_editor_token>" \
-H "Content-Type: application/json"In vulnerable configurations, this request will result in an HTTP 200 OK response status, and the chatflow database entry is permanently removed. Following the application of the patch, this exact request triggers an HTTP 403 Forbidden response and an error payload stating: You do not have permission to delete this chatflow type.
The primary operational consequence of this vulnerability is localized denial of service and data destruction. Deleting a chatflow permanently removes its design blueprints, conversational nodes, and integration endpoints. Any application, API client, or customer-facing chatbot relying on the deleted flow's unique identifier will immediately cease functioning.
According to the official CVE record, this vulnerability carries a CVSS v4.0 Base Score of 7.1 (High). The high severity classification is driven by the low attack complexity and the lack of specific user interaction required to execute the exploit. While it does not lead to information disclosure or remote system compromise, its impact on the availability of dependent applications is significant.
No active exploitation in the wild or public exploit code has been identified, and the vulnerability is not currently listed in CISA's Known Exploited Vulnerabilities catalog. However, in shared environments where different teams configure distinct business flows on a single host, this vulnerability introduces a lateral security boundary failure.
The definitive resolution for CVE-2026-69262 is upgrading the Flowise instance to version 3.1.3 or higher. Because the patch resolves the vulnerability at the application layer via controller checks, no database modifications or structural changes to existing database records are needed.
To perform the upgrade using npm or pnpm, execute the corresponding command for your deployment model:
# Global deployment upgrade
npm install -g flowise@3.1.3
# Project-level dependency upgrade
npm install flowise@3.1.3If upgrading immediately is not possible, administrators should restrict workspace access to highly trusted users. Additionally, security teams can configure monitoring systems to alert on HTTP DELETE traffic directed at the /api/v1/chatflows/ path. Cross-correlating these events with active user permission logs can help detect unauthorized deletion attempts before they occur in production.
Security teams should also review other CRUD endpoints (such as PUT /api/v1/chatflows/:id) to ensure they do not permit type mutation bypasses. Allowing users to alter the type attribute of a flow during an update could enable them to alter the permission domain of an existing resource.
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Flowise FlowiseAI | < 3.1.3 | 3.1.3 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-863 |
| Attack Vector | Network (AV:N) |
| CVSS v4.0 Score | 7.1 |
| EPSS Score | None recorded |
| Impact | High Availability Loss |
| Exploit Status | No public exploits |
| KEV Status | Not Listed |
The software performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly verify that the actor is authorized to perform that specific action on that specific resource.
An incomplete credential redaction mechanism in Flowise allows authenticated users with standard view permissions to retrieve sensitive decrypted third-party credentials in plaintext.
CVE-2026-69258 is a high-severity property injection and unauthenticated authorization bypass vulnerability in Flowise, a drag-and-drop orchestration interface for building customized LLM workflows. In affected versions prior to 3.1.3, the unauthenticated prediction API endpoint (`POST /api/v1/prediction/:id`) processed client-controlled parameters inside an `overrideConfig` payload without authorization checks. The backend unconditionally spread this object into internal context structures, enabling unauthenticated remote attackers to overwrite critical session values, pollute execution contexts, and bypass flow restrictions.
CVE-2026-69252 represents a missing authorization check (CWE-862) in the files API route (`/api/v1/files`) of Flowise, a drag-and-drop user interface for building LLM flows. Prior to version 3.1.3, an authenticated API key or user could list, access, and delete files across arbitrary workspaces inside an organization, completely bypassing workspace logical boundaries.
A comprehensive technical analysis of CVE-2026-45584, a high-severity heap-based buffer overflow in Microsoft Defender's QEX parsing logic. The vulnerability resides within mpengine.dll and allows unauthenticated remote code execution or denial of service when processing crafted archives designed to trigger threat remediation and QEX history logging.
A medium-severity vulnerability in Undici's retry interceptor causes body-length mismatches with the Content-Length header during HTTP 206 response resumption. Forwarding these inconsistent headers downstream leads to HTTP response desynchronization, connection hangs, or potential protocol smuggling.
CVE-2026-16729 (GHSA-v3r7-h72x-cjcm) is a medium-severity cookie attribute injection vulnerability in Undici's web-compliant cookie utility module. Due to insufficient validation of domain parameters and raw attributes in the unparsed options array, arbitrary attributes like SameSite, HttpOnly, and Secure can be injected. This allows attackers to bypass CSRF protections, strip security flags, or override intended cookie behaviors when applications pass user-controlled values to these properties.