Mar 5, 2026·5 min read·24 visits
The Flowise `/api/v1/account/forgot-password` endpoint leaks user details (ID, name, status) in the HTTP response body. This allows unauthenticated attackers to enumerate valid users and harvest PII by submitting email addresses.
A significant information disclosure vulnerability exists in Flowise versions 3.0.5 and earlier, specifically within the unauthenticated password recovery workflow. The application incorrectly returns full user objects in API responses when verifying email addresses, leaking Personally Identifiable Information (PII) such as full names, internal UUIDs, account status, and creation timestamps to remote attackers.
Flowise, an open-source UI for building LLM flows, contains an information disclosure vulnerability in its user account management API. The flaw resides in the /api/v1/account/forgot-password endpoint, which is designed to initiate the password recovery process. This endpoint operates without authentication to allow users who have lost their credentials to regain access.
In affected versions, the application fails to sanitize the response sent to the client after a successful email lookup. Instead of returning a generic success message or an empty response, the server serializes and returns the complete database record of the identified user. This behavior constitutes a violation of CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) and CWE-204 (Observable Response Discrepancy), turning a standard account recovery feature into a high-fidelity user enumeration vector.
The root cause of this vulnerability is the insecure implementation of the controller logic handling password reset requests. In a secure design, a forgot-password endpoint should perform two distinct actions: verify the email exists and trigger an out-of-band notification (email) containing the reset instructions. Critically, the HTTP response to the requester should remain constant regardless of whether the email exists, typically returning a 200 OK with a generic message.
However, the Flowise controller in versions <= 3.0.5 directly returns the result of the database query to the HTTP response stream. When the backend service UserService locates a user by the provided email, it returns the user entity (an object containing schema fields) to the controller. The controller then pipes this object directly into res.json(). This bypasses the necessary view-layer abstraction or data transfer object (DTO) mapping that would normally filter out sensitive internal fields like id, createdAt, updatedAt, and status.
The vulnerability exists in the server-side logic handling the POST request to the forgot-password route. The following comparison illustrates the unsafe direct return of the user object versus the sanitized approach.
Vulnerable Implementation (Conceptual):
The controller receives the email, queries the database, and immediately returns the result. If user is found, the entire object is serialized to JSON and sent to the client.
// Vulnerable Controller Logic
export const forgotPassword = async (req, res) => {
const { email } = req.body;
try {
// The service finds the user and potentially generates a reset token
const user = await usersService.forgotPassword(email);
// CRITICAL FLAW: The raw user object is returned to the public client
return res.json(user);
} catch (error) {
return res.status(500).send(error);
}
}Secure Implementation (Patch Logic): The fix involves decoupling the database result from the API response. The controller should trigger the email logic but return a static message to the client, preventing data leakage.
// Secure Controller Logic
export const forgotPassword = async (req, res) => {
const { email } = req.body;
try {
// The service handles the lookup and email sending internally
await usersService.forgotPassword(email);
// FIX: Return a generic message regardless of the outcome
return res.json({
code: 200,
message: 'If an account with that email exists, we sent you an email.'
});
} catch (error) {
// Log the error internally, but do not expose details to the user
return res.status(500).send('Internal Server Error');
}
}Exploitation of this vulnerability is trivial and requires no authentication or special tooling. An attacker simply sends a standard HTTP POST request to the target Flowise instance. The only prerequisite is network access to the application's API port (typically exposed for UI functionality).
Attack Scenario:
/api/v1/account/forgot-password.Proof of Concept:
curl -X POST "https://flowise.target.local/api/v1/account/forgot-password" \
-H "Content-Type: application/json" \
-d '{"email": "admin@example.com"}'Leaked Response Data: Instead of a generic "Email sent" message, the server responds with:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "System Administrator",
"email": "admin@example.com",
"status": "ACTIVE",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2025-02-10T14:20:00.000Z"
}This confirms the account exists, provides the full name for social engineering, and reveals account age (via createdAt), which helps identify high-value early adopters or administrative accounts.
The direct impact is the unauthenticated disclosure of PII (Personally Identifiable Information). While this does not immediately grant access to the account, it significantly aids attackers in the reconnaissance phase of an attack chain.
Risk Breakdown:
name, email, and account status allows for targeted phishing campaigns. An attacker can impersonate support staff, referencing the victim's exact account creation date to establish credibility.tempToken used for password resets. If that token is present in the leak, the impact escalates immediately from Information Disclosure to Critical Account Takeover, as the attacker can use the token to set a new password.CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Flowise FlowiseAI | <= 3.0.5 | 3.0.6 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-200 |
| Attack Vector | Network (API) |
| CVSS Score | 7.5 (High) |
| Authentication | None Required |
| Impact | PII Disclosure |
| Status | Patched |
Exposure of Sensitive Information to an Unauthorized Actor
A high-severity security vulnerability exists in 9Router, an AI router and token saver dashboard. When dashboard authentication features are disabled or left in default configurations, the application exposes administrative testing routines directly to the public internet. Unauthenticated network adversaries can exploit the OIDC configuration validation endpoint to initiate arbitrary HTTP requests, routing unauthorized traffic to local loops, adjacent container ports, and cloud resource metadata interfaces.
CVE-2026-64849 is a critical Server-Side Request Forgery (SSRF) vulnerability affecting MLflow tracking servers prior to version 3.15.0. It allows unauthenticated remote attackers to bypass outbound request destination filters using DNS rebinding or HTTP redirects. This exposure risks compromising sensitive cloud infrastructure metadata and internal microservices.
This technical report details a missing authorization vulnerability (CVE-2026-69146 / GHSA-3p64-6gvh-82v5) affecting the MLflow platform from version 3.13.0 to 3.15.0. When MLflow is configured with the built-in basic-auth plugin, authenticated users can bypass run-level UPDATE authorization checks, enabling unauthorized dataset and model lineage metadata injection.
MLflow prior to version 3.15.0 fails to perform proper authorization checks when registering model versions, allowing authenticated users with access to a registered model to link and access artifacts from runs and models belonging to other users without authorization.
A high-severity Regular Expression Denial of Service (ReDoS) vulnerability in the sqlparse Python library prior to version 0.6.0 allows unauthenticated remote attackers to trigger CPU exhaustion and application denial of service via crafted SQL inputs containing unmatched dollar-quoted literals or unclosed multiline comments.
A high-severity logic inversion flaw in the uniget CLI completely bypasses Sigstore cryptographic signature verification on metadata files by default. If an attacker can poison the package metadata cache or repository, they can execute arbitrary OS commands under the privileges of the active user.