| Title | arc53 DocsGPT Development branch before PR #2331; verified against local main commit 06e827573cac6ad3b445ffea0fb08169071c1b50. Fixed for newly CWE-345: Insufficient Verification of Data Authenticity |
|---|
| Description | A vulnerability was found in DocsGPT before PR #2331 and classified as a cryptographic integrity issue. Affected is the backend credential encryption helper in application/security/encryption.py. The implementation encrypted stored credential dictionaries with AES-CBC and custom padding but did not authenticate the ciphertext, IV, salt, or user context with an integrity tag.
An attacker who can modify a stored encrypted credential blob can perform controlled ciphertext or IV manipulation. In a local controlled proof of concept, changing one IV byte changed the decrypted JSON object from {"a": "AAAA", "b": 1} to {"a": "ZAAA", "b": 1} without any authentication failure in the pre-PR implementation. This demonstrates that key-backed encrypted credential data was treated as valid based only on successful decryption and JSON parsing, not on cryptographic authenticity.
Authentication required: yes, if the attack path requires write access to the application's credential storage or database. User interaction required: no.
Technical Details
- Affected file/function: application/security/encryption.py / encrypt_credentials and decrypt_credentials
- Vulnerable parameter: encrypted_data stored credential blob
- Attack vector: Network or local, depending on database/storage access path
- Privileges required: Low to High, depending on deployment storage access controls
- Trigger condition: A legacy AES-CBC credential blob is modified and then decrypted by decrypt_credentials
- Security model issue: AES-CBC provides confidentiality only and does not provide ciphertext integrity or authenticity
- Patch behavior: PR #2331 changes new encryption to AES-GCM with user_id bound as additional authenticated data and returns an empty object for tampered GCM data or cross-user replay
- Residual migration note: PR #2331 keeps a legacy CBC fallback for backward compatibility, so existing CBC records should be rotated or re-encrypted to receive integrity protection
Impact
- Confidentiality: Low
- Integrity: High
- Availability: None
CVSS v3.1
Score: 6.5 (Medium)
Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N
Timeline
- Vulnerable baseline verified: 2026-05-26
- Patch proposed in PR #2331: 2026-03-26
- PR review update committed: 2026-03-30
- Public disclosure: https://github.com/arc53/DocsGPT/pull/2331
Countermeasure
Use authenticated encryption for stored credentials. PR #2331 migrates new encryption to AES-GCM, uses a versioned format, and binds user_id as additional authenticated data. Deploy the patch and rotate or re-encrypt existing legacy AES-CBC credential blobs so old unauthenticated ciphertext is no longer accepted indefinitely. |
|---|
| Source | ⚠️ https://github.com/arc53/DocsGPT/issues/2503 |
|---|
| User | Dem00 (UID 84913) |
|---|
| Submission | 05/26/2026 18:29 (1 month ago) |
|---|
| Moderation | 06/27/2026 17:02 (1 month later) |
|---|
| Status | Accepted |
|---|
| VulDB entry | 374480 [arc53 DocsGPT up to 0.18.0 Credential Storage encryption.py encrypt_credentials data authenticity] |
|---|
| Points | 20 |
|---|