Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
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).
Primary rating from Vendor (github).
CVSS VectorVendor: github
Lifecycle Timeline
4DescriptionCVE.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.
Same weakness CWE-287 – Improper Authentication
View allSame technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-54173