Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconObtain TENANT_ADMIN credentials
-
DeliveryCall GET /api/tenants/{id} authenticated
-
ExploitExtract plaintext databaseUrl from response
-
InstallReach postgres:5432 via internal network or SSRF
-
C2Authenticate to PostgreSQL as postgres superuser
-
ExecuteQuery all tenant databases and central user table
-
ImpactEscalate via pg_read_server_files or COPY FROM PROGRAM
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK
2 techniques across 2 tactics: Collection, Discovery The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The attacker must hold a valid TENANT_ADMIN authentication token for any tenant on the target instance - this role is assigned during tenant onboarding and may be self-provisioned depending on operator configuration. After obtaining the PostgreSQL connection string from the API response, the attacker must be able to reach the postgres service on port 5432; in default docker-compose.prod.yml deployments, this port is on an internal Docker network and not directly exposed to the internet, meaning the attacker must leverage a secondary path such as SSRF within the application, an RCE vulnerability, or a file-read primitive to forward the connection. Operators who have configured a non-superuser PostgreSQL role via secrets/postgres_user.txt face reduced privilege escalation risk (no pg_read_server_files or COPY FROM PROGRAM) but still expose cross-tenant data access if that user holds grants to multiple tenant databases. The vulnerability is triggered by a standard authenticated GET request with no special headers or payload crafting required. |
| Impact | The CVSS 8.0 vector (AV:N/AC:H/PR:H/UI:N/S:C/C:H/I:H/A:H) correctly captures the two-stage nature of the attack: PR:H reflects the requirement for a TENANT_ADMIN account, and AC:H reflects the additional prerequisite of reaching postgres:5432 to monetize the disclosed credential. However, the S:C/C:H/I:H/A:H triplet is fully justified because a single TENANT_ADMIN of one tenant can, once holding the connection string, affect every other tenant's data and the central user table - a severe breach of the application's primary isolation guarantee. The gap between credential disclosure (trivially achieved via authenticated API call) and full impact (requires postgres network reachability) is the main real-world friction. In Kubernetes or docker-compose deployments where postgres is on an internal network not directly reachable from the internet, the attacker must chain a secondary primitive (SSRF, RCE, or file-read in the application) to reach the database - this elevates the practical attack complexity beyond what AC:H alone signals. No EPSS score was provided; no KEV entry exists. Despite the absence of confirmed active exploitation, operators should treat this as urgent: any existing TENANT_ADMIN account - including accounts created by tenants themselves - becomes a pivot point for full cross-tenant compromise. |
| Exploit ScenarioDerived | An attacker who controls or compromises a TENANT_ADMIN account - for instance, a malicious tenant or a phished admin - calls GET /api/tenants/{their-tenant-id} and parses the databaseUrl field from the JSON response. They then connect to the PostgreSQL instance (directly if on the internal docker network, or via an SSRF endpoint in the application otherwise) using the extracted credentials and execute SELECT queries against all per-tenant databases and the central appointment_booking database, harvesting appointment ciphertexts, key shares, session tokens, and GLOBAL_ADMIN password hashes for offline cracking. No public POC code has been identified at time of analysis, but the attack requires only standard PostgreSQL client tooling. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 06, 2026
Credential exfiltration via the tenant API in OpenReception appointment-booking-software prior to v1.0.2 allows any authenticated TENANT_ADMIN to retrieve the full PostgreSQL connection string - including plaintext password - for the shared database instance. In default docker-compose.prod.yml deployments, those credentials belong to the postgres superuser (rolsuper=true), granting the attacker read-write access to every tenant's database, all GLOBAL_ADMIN password hashes and session records, and superuser-level PostgreSQL functions (pg_read_server_files, COPY FROM PROGRAM) usable for container-level escalation. No public exploit code or CISA KEV entry exists at time of analysis; EPSS data was not provided, but the CVSS S:C scope change and the cross-tenant blast radius make this a high-priority patch target for any operator running the affected version.
RemediationAI
Upgrade to OpenReception appointment-booking-software version 1.0.2, which resolves the issue by replacing the full tenantData object serialization with an explicit field allowlist that excludes databaseUrl. The upstream fix is confirmed at commit ad9e49e3cf66b0cc9a327f6d8a895b23bbd6fea9 (https://github.com/open-reception/appointment-booking-software/commit/ad9e49e3cf66b0cc9a327f6d8a895b23bbd6fea9). After upgrading, operators should rotate the PostgreSQL password in secrets/postgres_password.txt and cycle any session tokens for all TENANT_ADMIN accounts, as disclosed credentials may already have been captured. As a compensating control prior to patching, operators can restrict the TENANT_ADMIN API token scope or place an API gateway rule that strips the databaseUrl field from GET /api/tenants/{id} responses; however, this approach requires careful testing to avoid breaking tenant setup flows. Operators who have not already done so should also configure a non-superuser PostgreSQL role via secrets/postgres_user.txt to limit the privilege level of any future credential exposure, though this does not prevent cross-tenant data access if the user has per-tenant-database grants.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The application is built on SvelteKit (evidenced by the +server.ts route convention at src/routes/api/tenants/[id]/+server.ts) and uses a multi-tenant PostgreSQL architecture where each tenant receives a dedicated database on a shared PostgreSQL instance. The GET /api/tenants/{id} handler previously returned the raw tenantData object, which includes a databaseUrl field containing the live connection URI. In the official docker-compose.prod.yml deployment, this URI embeds the postgres superuser credential sourced from secrets/postgres_password.txt. CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) is the root cause: the API response serialization did not restrict which database record fields were safe to return to the caller, inadvertently serializing an infrastructure secret alongside application metadata. The fix (commit ad9e49e) replaces the wholesale return of tenantData with an explicit allowlist of eleven safe fields, none of which include databaseUrl.
Know when PostgreSQL gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:H/UI:N/S:C/C:H/I:H/A:H
PR:H reflects mandatory TENANT_ADMIN role; AC:H reflects the need to reach postgres:5432 as a second step; S:C captures cross-tenant database impact beyond the calling tenant's scope.
Primary rating from Vendor (github).
CVSS VectorVendor: github
Lifecycle Timeline
2DescriptionCVE.org
OpenReception's appointment booking software provides an end-to-end encrypted appointment booking platform. Prior to version 1.0.2, the GET /api/tenants/{id} endpoint returns the full tenant record to any authenticated TENANT_ADMIN of that tenant, including the databaseUrl field. This field contains the live PostgreSQL connection string the application uses to connect to that tenant's database. In the tested official docker-compose.prod.yml deployment, the connection string contained the user postgres with rolsuper=true and the plaintext password from secrets/postgres_password.txt. Operators who configure a non-superuser PostgreSQL user via secrets/postgres_user.txt would expose a less privileged credential, but the disclosure of the connection string itself is independent of that choice. The same credential applies to every database managed by that PostgreSQL instance: the central appointment_booking database, every per-tenant database (one per tenant), and the postgres administrative database. A TENANT_ADMIN of one tenant who can reach postgres:5432 (directly via internal network, indirectly via any SSRF, RCE, or file-read in the application) can read every other tenant's appointment ciphertexts, key shares, and metadata; read the central user table, including all GLOBAL_ADMIN accounts, password hashes, and session records; modify or delete any data in any tenant database; and/or i a superuser-scoped deployment: use PostgreSQL's pg_read_server_files, COPY ... FROM PROGRAM, and CREATE EXTENSION for further escalation inside the database container. This breaks the per-tenant database isolation that is otherwise the primary cross-tenant control in the application. The application code carefully scopes most queries to the calling tenant's database, but those scopings are irrelevant once the attacker holds the credentials that bypass the application entirely. Version 1.0.2 fixes the issue.
Executive ViewAI
OpenReception's appointment-booking-software versions prior to v1.0.2 contains a vulnerability enabling any tenant administrator to access the database superuser password, creating an immediate risk of complete data exposure across your entire multi-tenant customer base. This vulnerability converts a low-privilege insider (tenant admin) into a database superuser with read-write access to all customer data, billing systems, and user credentials. Remediation requires urgent action on all deployed instances to prevent potential breach notification obligations and customer churn.
No vendor-released patch identified at time of analysis. Interim mitigations: (1) Implement strict API gateway rules blocking the credential endpoint from TENANT_ADMIN requests; (2) immediately rotate PostgreSQL superuser credentials to a secure value not stored in shared connection strings; (3) enforce principle-of-least-privilege by configuring API service accounts with read-only database roles; (4) enable comprehensive audit logging on all tenant-admin API calls and database authentication attempts; (5) evaluate architectural separation into per-tenant database instances if operationally feasible. These controls reduce exposure but do not eliminate the vulnerability and are temporary until v1.0.2 deployment.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
More in PostgreSQL
View allPostgreSQL libpq functions PQescapeLiteral(), PQescapeIdentifier(), PQescapeString(), and PQescapeStringConn() improperl
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
Argument injection vulnerability in PostgreSQL 9.2.x before 9.2.4, 9.1.x before 9.1.9, and 9.0.x before 9.0.13 allows re
Unauthenticated arbitrary file write in Splunk Enterprise (below 10.2.4 and 10.0.7) and Splunk Cloud Platform (below 10.
Unauthenticated SQL injection in Sangoma Switchvox SMB Edition 8.3 (build 104997) lets remote attackers execute arbitrar
PostgreSQL versions before 9.2.22, 9.3.18, 9.4.13, 9.5.8 and 9.6.4 are vulnerable to incorrect authentication flaw allow
The build_tablename function in pgsql.c in the PostgreSQL (aka pgsql) extension in PHP through 5.6.7 does not validate t
A vulnerability in the h2oai/h2o-3 REST API versions 3.46.0.4 allows unauthenticated remote attackers to execute arbitra
In PostgreSQL 9.3 through 11.2, the "COPY TO/FROM PROGRAM" function allows superusers and users in the 'pg_execute_serve
Unauthenticated SQL injection in Vendure Shop API allows remote attackers to execute arbitrary SQL commands against the
Parse Server is an open source http web server backend. Rated critical severity (CVSS 10.0), this vulnerability is remot
Hard-coded default PostgreSQL credentials shipped in the docker-compose.yaml of langgenius Dify through version 1.5.1 al
EUVD-2026-54217
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB