CSIRTS // UNIFIED SECURITY ADVISORY FEEDSYS ● ONLINE · POWERED BY INTELFUSIONS.COM

GHSA-rwrp-9823-p2xq: Flowise: Incomplete Credential Redaction Exposes Secrets via API

mediumCVSS 6.5
Summary The GET /api/v1/credentials/:id endpoint decrypts stored credential data and returns it in the plainDataObj field of the API response. While a redactCredentialWithPasswordType() function masks fields defined with type: 'password' in their component schema, many credential types store highly sensitive data (database connection URLs with embedded passwords, Google service account JSON with RSA private keys, AWS access keys) in fields defined as type: 'string'. These string-type fields are returned in full plaintext without any redaction. Any authenticated user with credentials:view permission can retrieve the raw secrets of any credential in their workspace by calling this endpoint. Vulnerable Code Service Layer packages/server/src/services/credentials/index.ts, getCredentialById() (line 127): At line 138, the credential's encrypted data is decrypted: const decryptedCredentialData = await decryptCredentialData( credential.encryptedData, credential.credentialName, appServer.nodesPool.componentCredentials ) At lines 143-146, the decrypted data is attached to the response as plainDataObj: const returnCredential: ICredentialReturnResponse = { ...credential, plainDataObj: decryptedCredentialData // <-- decrypted secrets in response } At line 147, only encryptedData is stripped, leaving plainDataObj intact: const dbResponse: any = omit(returnCredential, ['encryptedData']) Incomplete Redaction packages/server/src/utils/index.ts, redactCredentialWithPasswordType() (line 1697): export const redactCredentialWithPasswordType = ( componentCredentialName: string, decryptedCredentialObj: ICredentialDataDecrypted, componentCredentials: IComponentCredentials ): ICredentialDataDecrypted => { const plainDataObj = cloneDeep(decryptedCredentialObj) for (const cred in plainDataObj) { const inputParam = componentCredentials[componentCredentialName].inputs?.find( (inp) => inp.type === 'password' && inp.name === cred // <-- only 'password' type ) if (inputParam) { plain

Details

Source
GitHub Security Advisories (INTL · database · site)
Severity
medium — CVSS 6.5
Published
2026-08-04
Last updated
2026-08-04
Exploitation
Not in CISA KEV at last sync

Original advisory: https://github.com/advisories/GHSA-rwrp-9823-p2xq

More from GitHub Security Advisories