9.4
CRITICAL CVSS 3.1
CVE-2026-48088
OpenReception vulnerable to unauthenticated staff crypto poisoning that breaks E2E recipient directory
Description

OpenReception's appointment booking software provides an end-to-end encrypted appointment booking platform. Prior to version 1.0.4, the route `POST /api/tenants/{tenantId}/staff/{staffId}/crypto` accepts and stores attacker-controlled ML-KEM-768 public keys against any tenant on the platform without authentication. The handler logs an "Unauthorized crypto key storage attempt" warning when neither a session nor a registration cookie is present, then proceeds to insert the row regardless. The platform's E2E claim that "even administrators cannot view sensitive information" is broken: any unauthenticated network attacker can register themselves as an additional encryption recipient for any tenant's future patient appointments. A second variant of the bug suppresses the unauthorized-warning log entry. The Zod schema makes the `email` field optional. When the request body omits `email` and the request carries no registration cookie, the comparison `registrationEmail === email` becomes `undefined === undefined`, which evaluates to `true`. The handler treats the request as a legitimate registration flow, skips the warning entirely, and stores the row. Successful storage is still recorded as an `[info]` log line, but the security-relevant warning that operators are most likely to monitor or alert on is gone. The `staff_crypto` table has no unique constraint on `user_id`, so an arbitrary number of attacker rows can coexist for the same staff identifier and all return as `is_active=true`. The supplied `staffId` does not need to match any existing user or pending invite. Schema validation on `passkeyId`, `publicKey`, and `privateKeyShare` is also weak: the literal string `<placeholder-base64>` was accepted, indicating no length, format, or cryptographic-validity check beyond field presence. This weakness is independent of the auth bypass but compounds it: a poisoned directory can also be filled with malformed entries that break legitimate booking flows. The injected key is consumed by the public booking flow. After completing the unauthenticated `bootstrap-challenge` and `bootstrap-verify` ceremony as a "patient", the resulting `bookingAccessToken` is accepted by `GET /api/tenants/{id}/appointments/staff-public-keys`, which returns the attacker-controlled keys alongside any legitimate ones. A new appointment encrypts its tunnel key with ML-KEM to all listed recipients, so the attacker becomes a co-recipient of the encryption and can decapsulate the tunnel key with the matching secret. From there, all appointment payloads for that booking are decryptable. Version 1.0.4 patches the issue.

INFO

Published Date :

Aug. 6, 2026, 10:17 p.m.

Last Modified :

Oct. 23, 2026, 9:10 p.m.

Remotely Exploit :

Yes !
Affected Products

The following products are affected by CVE-2026-48088 vulnerability. Even if cvefeed.io is aware of the exact versions of the products that are affected, the information is not represented in the table below.

No affected product recoded yet

CVSS Scores
The Common Vulnerability Scoring System is a standardized framework for assessing the severity of vulnerabilities in software and systems. We collect and displays CVSS scores from various sources for each CVE.
Score Version Severity Vector Exploitability Score Impact Score Source
CVSS 134c704f-9b21-4f2e-91b3-4a467353bcc0
CVSS 3.1 CRITICAL [email protected]
CVSS 3.1 CRITICAL MITRE-CVE
Solution
Update OpenReception's appointment booking software to version 1.0.4 to fix authentication bypass and key storage flaws.
  • Update software to version 1.0.4.
  • Implement authentication checks for API endpoints.
  • Validate all public key inputs rigorously.
  • Add unique constraints to relevant database tables.
References to Advisories, Solutions, and Tools
CWE - Common Weakness Enumeration

While CVE identifies specific instances of vulnerabilities, CWE categorizes the common flaws or weaknesses that can lead to vulnerabilities. CVE-2026-48088 is associated with the following CWEs:

Common Attack Pattern Enumeration and Classification (CAPEC)

Common Attack Pattern Enumeration and Classification (CAPEC) stores attack patterns, which are descriptions of the common attributes and approaches employed by adversaries to exploit the CVE-2026-48088 weaknesses.

We scan GitHub repositories to detect new proof-of-concept exploits. Following list is a collection of public exploits and proof-of-concepts, which have been published on GitHub (sorted by the most recently updated).

Results are limited to the first 15 repositories due to potential performance issues.

The following list is the news that have been mention CVE-2026-48088 vulnerability anywhere in the article.

The following table lists the changes that have been made to the CVE-2026-48088 vulnerability over time.

Vulnerability history details can be useful for understanding the evolution of a vulnerability, and for identifying the most recent changes that may impact the vulnerability's severity, exploitability, or other characteristics.

  • CVE Translated by [email protected]

    Oct. 23, 2026

    Action Type Old Value New Value
    Added Translation Title: appointment-booking-software de open-reception, Description: El software de reserva de citas de OpenReception proporciona una plataforma de reserva de citas cifrada de extremo a extremo. Antes de la versión 1.0.4, la ruta “POST /api/tenants/{tenantId}/staff/{staffId}/crypto” acepta y almacena claves públicas ML-KEM-768 controladas por el atacante contra cualquier inquilino en la plataforma sin autenticación. El gestor registra una advertencia “Intento de almacenamiento de clave criptográfica no autorizado” cuando no hay una sesión ni una cookie de registro presentes, luego procede a insertar la fila de todos modos. La afirmación E2E de la plataforma de que “ni siquiera los administradores pueden ver información sensible” está rota: cualquier atacante de red no autenticado puede registrarse como un destinatario de cifrado adicional para las futuras citas de pacientes de cualquier inquilino. Una segunda variante del error suprime la entrada de registro de advertencia de no autorizado. El esquema Zod hace que el campo “email” sea opcional. Cuando el cuerpo de la solicitud omite “email” y la solicitud no lleva ninguna cookie de registro, la comparación “registrationEmail === email” se convierte en “undefined === undefined”, lo que se evalúa como “true”. El gestor trata la solicitud como un flujo de registro legítimo, omite la advertencia por completo y almacena la fila. El almacenamiento exitoso todavía se registra como una línea de registro “[info]”, pero la advertencia relevante para la seguridad que los operadores son más propensos a monitorear o sobre la que alertar ha desaparecido. La tabla “staff_crypto” no tiene una restricción única en “user_id”, por lo que un número arbitrario de filas del atacante pueden coexistir para el mismo identificador de personal y todas devuelven “is_active=true”. El “staffId” proporcionado no necesita coincidir con ningún usuario existente o invitación pendiente. La validación del esquema en “passkeyId”, “publicKey” y “privateKeyShare” también es débil: la cadena literal “[placeholder-base64]” fue aceptada, lo que indica que no hay verificación de longitud, formato o validez criptográfica más allá de la presencia del campo. Esta debilidad es independiente del bypass de autenticación pero lo agrava: un directorio envenenado también puede llenarse con entradas malformadas que rompen los flujos de reserva legítimos. La clave inyectada es consumida por el flujo de reserva público. Después de completar la ceremonia no autenticada de “bootstrap-challenge” y “bootstrap-verify” como “paciente”, el “bookingAccessToken” resultante es aceptado por “GET /api/tenants/{id}/appointments/staff-public-keys”, que devuelve las claves controladas por el atacante junto con cualquier clave legítima. Una nueva cita cifra su clave de túnel con ML-KEM para todos los destinatarios listados, por lo que el atacante se convierte en un co-destinatario del cifrado y puede desencapsular la clave de túnel con el secreto correspondiente. A partir de ahí, todas las cargas útiles de las citas para esa reserva son descifrables. La versión 1.0.4 corrige el problema.
  • CVE Modified by 134c704f-9b21-4f2e-91b3-4a467353bcc0

    Aug. 08, 2026

    Action Type Old Value New Value
    Added Reference https://github.com/open-reception/appointment-booking-software/security/advisories/GHSA-pch3-hcmf-cjw4
    Added SSVC {'id': 'CVE-2026-48088', 'role': 'CISA Coordinator', 'options': [{'exploitation': 'poc'}, {'automatable': 'yes'}, {'technicalImpact': 'total'}], 'version': '2.0.3', 'timestamp': '2026-08-08T02:47:21.298201Z'}
  • New CVE Received by [email protected]

    Aug. 06, 2026

    Action Type Old Value New Value
    Added Affected [{'vendor': 'open-reception', 'product': 'appointment-booking-software', 'versions': [{'status': 'affected', 'version': '< 1.0.4'}]}]
    Added Description OpenReception's appointment booking software provides an end-to-end encrypted appointment booking platform. Prior to version 1.0.4, the route `POST /api/tenants/{tenantId}/staff/{staffId}/crypto` accepts and stores attacker-controlled ML-KEM-768 public keys against any tenant on the platform without authentication. The handler logs an "Unauthorized crypto key storage attempt" warning when neither a session nor a registration cookie is present, then proceeds to insert the row regardless. The platform's E2E claim that "even administrators cannot view sensitive information" is broken: any unauthenticated network attacker can register themselves as an additional encryption recipient for any tenant's future patient appointments. A second variant of the bug suppresses the unauthorized-warning log entry. The Zod schema makes the `email` field optional. When the request body omits `email` and the request carries no registration cookie, the comparison `registrationEmail === email` becomes `undefined === undefined`, which evaluates to `true`. The handler treats the request as a legitimate registration flow, skips the warning entirely, and stores the row. Successful storage is still recorded as an `[info]` log line, but the security-relevant warning that operators are most likely to monitor or alert on is gone. The `staff_crypto` table has no unique constraint on `user_id`, so an arbitrary number of attacker rows can coexist for the same staff identifier and all return as `is_active=true`. The supplied `staffId` does not need to match any existing user or pending invite. Schema validation on `passkeyId`, `publicKey`, and `privateKeyShare` is also weak: the literal string `<placeholder-base64>` was accepted, indicating no length, format, or cryptographic-validity check beyond field presence. This weakness is independent of the auth bypass but compounds it: a poisoned directory can also be filled with malformed entries that break legitimate booking flows. The injected key is consumed by the public booking flow. After completing the unauthenticated `bootstrap-challenge` and `bootstrap-verify` ceremony as a "patient", the resulting `bookingAccessToken` is accepted by `GET /api/tenants/{id}/appointments/staff-public-keys`, which returns the attacker-controlled keys alongside any legitimate ones. A new appointment encrypts its tunnel key with ML-KEM to all listed recipients, so the attacker becomes a co-recipient of the encryption and can decapsulate the tunnel key with the matching secret. From there, all appointment payloads for that booking are decryptable. Version 1.0.4 patches the issue.
    Added CVSS V3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L
    Added CWE CWE-862
    Added Reference https://github.com/open-reception/appointment-booking-software/commit/78dfd9317a0be0897e6e4d73afe670c07a75460f
    Added Reference https://github.com/open-reception/appointment-booking-software/security/advisories/GHSA-pch3-hcmf-cjw4
EPSS is a daily estimate of the probability of exploitation activity being observed over the next 30 days. Following chart shows the EPSS score history of the vulnerability.