criticalVulnerability

GHSA-6g38-8j4p-j3pr

## Summary Nhost automatically links an incoming OAuth identity to an existing Nhost account when the email addresses match. This is only safe when the email has been **verified by the OAuth provider**. Nhost's controller trusts a `profile.EmailVerified` boolean that is set by each provider adapter. The vulnerability is that several provider adapters **do not correctly populate this field** they either silently drop a `verified` field the provider API actually returns (Discord), or they fall back to accepting unconfirmed emails and marking them as verified (Bitbucket). Two Microsoft providers (AzureAD, EntraID) derive the email from non-ownership-proving fields like the user principal name, then mark it verified. The result is that an attacker can present an email they don't own to Nhost, have the OAuth identity merged into the victim's account, and receive a full authenticated session. ## Root Cause In `services/auth/go/controller/sign_in_id_token.go`, `providerFlowSignIn()` links a new provider identity to an existing account by email match with no verification guard: ```go // sign_in_id_token.go:267-296 func (ctrl *Controller) providerFlowSignIn( ctx context.Context, user sql.AuthUser, providerFound bool, provider string, providerUserID string, logger *slog.Logger, ) (*api.Session, *APIError) { if !providerFound { // Links attacker's provider identity to the victim's account. // profile.EmailVerified is NEVER checked here. ctrl.wf.InsertUserProvider(ctx, user.ID, provider, providerUserID, logger) } // Issues a full session to the attacker. session, _ := ctrl.wf.NewSession(ctx, user, nil, logger) return session, nil } ``` The controller places full trust in whatever `profile.EmailVerified` the adapter returned. The vulnerabilities below show how that trust is violated. ## Correct Implementation (For Reference) ### GitHub: `providers/github.go` GitHub fetches `/user/emails` and reads the

Properties

ghsa_id
GHSA-6g38-8j4p-j3pr
severity
critical
summary
Nhost Vulnerable to Account Takeover via OAuth Email Verification Bypass
cve_id
GHSA-6g38-8j4p-j3pr
is_ghsa_only
true
ghsa_published
2026-04-18T01:00:06Z
source_url
https://github.com/advisories/GHSA-6g38-8j4p-j3pr
ghsa_updated
2026-04-18T01:00:07Z

Related Entities (4)

VULNERABLE_TO (1)

[Software]go/github.com/nhost/nhost

AFFECTS (1)

[Software]go/github.com/nhost/nhost

HAS_WEAKNESS (1)

[Weakness]Improper Authentication

REPORTED_BY (1)

[Source]GitHub Advisory Database

Explore deeper with Ninja Signal's threat intelligence graph

GHSA-6g38-8j4p-j3pr — Ninja Signal Threat Intelligence | Ninja Signal