Skip to main content

OpenReception CVE-2026-48087

| EUVDEUVD-2026-54173 CRITICAL
Improper Authentication (CWE-287)
2026-08-06 security-advisories@github.com
9.8
CVSS 3.1 · Vendor: github
Share

Severity by source

Vendor (github) PRIMARY
9.8 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
8.1 HIGH

Network and unauthenticated with no victim interaction, but the attacker must first obtain the victim's userID whose unauthenticated exposure is unconfirmed, warranting AC:H; success grants full account takeover (C/I/A:H).

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
4.0 AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (github).

CVSS VectorVendor: github

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

4
Patch available
Aug 06, 2026 - 23:03 EUVD
Source Code Evidence Fetched
Aug 06, 2026 - 22:56 vuln.today
Analysis Generated
Aug 06, 2026 - 22:56 vuln.today
CVE Published
Aug 06, 2026 - 22:17 cve.org
CRITICAL 9.8

DescriptionCVE.org

OpenReception's appointment booking software provides an end-to-end encrypted appointment booking platform. Prior to version 1.0.2, the registration handler at POST /api/auth/register/{userId} validates the relationship between the WebAuthn challenge and the registration cookie's email but never validates that the userId in the URL belongs to that email. An unauthenticated attacker requests a challenge for their own email, generates a registration response with their own authenticator, and submits it against any victim user's URL. The challenge-vs-cookie email match passes, the WebAuthn ceremony validates, and addPasskey writes the attacker's credential into the victim's user_passkey rows. The next victim-email login accepts a passkey assertion from the attacker's authenticator and issues a session as the victim. User IDs are not strictly secret on this platform, but the exact set of exposure surfaces should be assessed by the maintainers. Staff-list endpoints return user IDs to authenticated tenant members per the route signature; live verification of all exposure surfaces (whether user IDs leak through any unauthenticated route, through invite-confirmation URLs, or through other administrative views) is part of the pending live PoC. Where the attacker knows the victim's email and userId, the analysis below becomes account takeover. Version 1.0.2 fixes the issue.

AnalysisAI

Account takeover in OpenReception's end-to-end encrypted appointment booking platform prior to 1.0.2 lets an unauthenticated attacker bind their own WebAuthn passkey to a victim's account. The registration handler at POST /api/auth/register/{userId} confirms the WebAuthn challenge matches the registration cookie's email but never checks that the {userId} in the URL belongs to that email, so an attacker registers a passkey for their own email against any victim's userId and is issued a session as the victim on the next login. No public exploit is identified at time of analysis (a live PoC is still pending) and it is not in CISA KEV, but the fix is confirmed in version 1.0.2.

Technical ContextAI

The vulnerability lives in the WebAuthn/FIDO2 passkey registration flow of a SvelteKit application (route src/routes/api/auth/register/[id]/+server.ts, credential persistence via UserService.addPasskey writing user_passkey rows). WebAuthn registration ceremonies bind a generated credential to a challenge; here the server correctly ties the challenge to the registration cookie's email but treats the path {userId} as an independent, unvalidated selector for which account receives the new credential. This is a classic CWE-287 (Improper Authentication) / insecure direct object reference on the registration target: the ceremony proves the attacker controls their own authenticator and email, but nothing proves that email owns the target userId. The patch adds UserService.getUserById and rejects the request with a 'User mismatch' ValidationError when the fetched target user's email does not equal the request body email, closing the gap between the URL identity and the authenticated email.

RemediationAI

Upgrade to OpenReception 1.0.2, which adds a server-side check (UserService.getUserById) that rejects registration when the target user's email does not match the request body email. Vendor-released patch: 1.0.2; see advisory GHSA-j9rw-x2wv-h5rj (https://github.com/open-reception/appointment-booking-software/security/advisories/GHSA-j9rw-x2wv-h5rj) and fix commit 5f61a2116d68378366edd712c343a9de7b205a74. If you cannot upgrade immediately, restrict reachability of POST /api/auth/register/{userId} (for example, place it behind a reverse-proxy allowlist or require an authenticated/invite-scoped context), audit user_passkey rows for passkeys added out of band and revoke unexpected credentials, and minimize exposure of userIDs by ensuring no unauthenticated route, invite-confirmation URL, or administrative view discloses them - reducing an attacker's ability to target a known userID. Note that proxy-level restrictions on the registration endpoint may break legitimate self-service onboarding, so scope them to trusted networks or invite flows only.

Share

CVE-2026-48087 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy