Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:L/VA:N/SC:H/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Unauthenticated single network request (AV:N/AC:L/PR:N/UI:N) steals tokens for a separate service, so S:C with C:H; only minor token-state change written, so I:L and A:N.
Primary rating from Vendor (https://github.com/FlowiseAI/Flowise).
CVSS VectorVendor: https://github.com/FlowiseAI/Flowise
Lifecycle Timeline
7DescriptionCVE.org
Summary
The OAuth2 token refresh endpoint (POST /api/v1/oauth2-credential/refresh/:credentialId) is in WHITELIST_URLS, meaning it requires no authentication. It decrypts the stored credential (containing clientId, clientSecret, refresh_token), sends a refresh request to the configured OAuth provider, and returns the new access_token directly in the response body.
Root Cause
// packages/server/src/routes/oauth2/index.ts:393-402
res.json({
success: true,
message: 'OAuth2 token refreshed successfully',
credentialId: credential.id,
tokenInfo: {
...tokenData, // ← includes access_token!
has_new_refresh_token: !!tokenData.refresh_token,
expires_at: updatedCredentialData.expires_at
}
})Whitelist entry at packages/server/src/utils/constants.ts:40.
Attack Chain
- Attacker obtains a credential ID (via Finding 2 / public chatflow leak, or enumeration)
- Attacker calls
POST /api/v1/oauth2-credential/refresh/:credentialId(no auth required) - Server decrypts credential, sends refresh request to OAuth provider with user's
client_secret - Server returns the new
access_tokenin the response to the attacker - Attacker uses the token to access the victim's connected service (Google, Microsoft, etc.)
Docker Validation
POST /api/v1/oauth2-credential/refresh/fake-uuid returns {"message":"Credential not found"} (not 401 Unauthorized), proving the endpoint processes the request without authentication.
Impact
- OAuth2 access token theft for any connected service
- Full access to the victim's third-party accounts (Google, Microsoft, GitHub, etc.)
- Client secret transmitted to OAuth provider during refresh
- Can also be used for DoS by exhausting refresh token quota
Suggested Fix
Remove the refresh endpoint from WHITELIST_URLS and require authentication:
// Remove from WHITELIST_URLS in constants.ts
// Add authentication check in the route handler---
Credits
- Shinobi Security - https://github.com/shinobisecurity
Articles & Coverage 1
AnalysisAI
Unauthenticated OAuth2 access-token theft in Flowise (npm/flowise <= 3.1.2) stems from the token-refresh endpoint POST /api/v1/oauth2-credential/refresh/:credentialId being listed in WHITELIST_URLS, so it bypasses authentication entirely. Any remote party who knows or guesses a credential ID can force the server to decrypt the stored OAuth2 credential, refresh it against the provider using the victim's client secret, and receive the fresh access_token directly in the response body. No public exploit code has been identified, but the researcher (Shinobi Security) validated the missing-auth behavior in Docker, and a vendor-released patch is available in 3.1.3.
Technical ContextAI
Flowise is a Node.js/TypeScript low-code platform for building LLM agents and chatflows; it stores third-party OAuth2 credentials (clientId, clientSecret, refresh_token) encrypted at rest so connected nodes can call services like Google, Microsoft, and GitHub. The refresh route in packages/server/src/routes/oauth2/index.ts is meant to renew expired tokens, but its path is registered in the WHITELIST_URLS array (packages/server/src/utils/constants.ts:40) that the authentication middleware skips. The root cause maps to CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor): the handler decrypts the credential and spreads the full tokenData - including access_token - into the JSON response (index.ts:393-402) with no caller authorization or ownership check, so secrets meant to stay server-side are handed to the requester.
RemediationAI
Vendor-released patch: 3.1.3 - upgrade Flowise to 3.1.3 or later, which removes the refresh endpoint from the unauthenticated whitelist per GHSA-qgvm-j2hm-6m38 (https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-qgvm-j2hm-6m38). If you cannot upgrade immediately, apply the researcher's fix directly by removing the /api/v1/oauth2-credential/refresh/:credentialId entry from WHITELIST_URLS in packages/server/src/utils/constants.ts and adding an authentication/ownership check in the route handler, or block the /api/v1/oauth2-credential/refresh/ path at a reverse proxy or WAF so it is unreachable without a session - note this breaks legitimate token refresh for clients that rely on the endpoint and may force nodes to re-authenticate their OAuth2 connections. As additional interim controls, take the Flowise instance off the public internet (bind to localhost or restrict by IP/VPN), and rotate any OAuth2 credentials that may already have been exposed, since token theft leaves no obvious trace.
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac
Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post
Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten
Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build
Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config
Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per
Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l
Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c
Vasion Print (formerly PrinterLogic) Virtual Appliance Host prior to version 25.2.169 and Application prior to version 2
Same weakness CWE-200 – Information Exposure
View allSame technique Information Disclosure
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-52912
GHSA-qgvm-j2hm-6m38