CVE-2026-62367: Vikunja OIDC Email-fallback Account Linking Ignores Vulnerability
HIGHCVE-2026-62367 is a HIGH oidc email-fallback account linking ignores vulnerability (CWE-287: Improper Authentication) affecting Vikunja libraries in the Go ecosystem. The issue involves oidc email-fallback account linking ignores email_verified, enabling local-account takeover. Remediation is available by upgrading affected packages to version 2.4.0.
CVE-2026-62367 at a Glance
How to Fix CVE-2026-62367
To remediate this vulnerability, upgrade all affected Vikunja dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade code.vikunja.io/api to 2.4.0
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for code.vikunja.io/api
How to Check if You Are Affected
To determine whether your application is affected by CVE-2026-62367, inspect your project dependencies for Vikunja:
inspect dependencies for code.vikunja.io/api
Analyze the terminal output to locate any version of Vikunja in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 2.4.0), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-287: Improper Authentication, where when an actor claims to have a given identity, the product does not prove or insufficiently proves that the claim is correct. In Vikunja, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-62367 Affected Vikunja Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
code.vikunja.io/api
|
Go |
≥ 1.0.0
< 2.4.0
|
2.4.0
|
References
Frequently Asked Questions
What is CVE-2026-62367?
Which Vikunja versions are affected?
What version fixes CVE-2026-62367?
Is code.vikunja.io/api affected?
What CWE is associated with CVE-2026-62367?
How can I check Go dependencies for CVE-2026-62367?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-xv7q-fvmc-jx96",
"modified" : "2026-10-09T20:49:06Z",
"published" : "2026-10-09T20:49:06Z",
"aliases" : [ "CVE-2026-62367" ],
"summary" : "Vikunja: OIDC email-fallback account linking ignores email_verified, enabling local-account takeover",
"details" : "## Summary\n\nWith the per-provider OIDC `emailfallback` option enabled, Vikunja links an SSO login to a pre-existing **local** (username+password) account using only the `email` claim — no `email_verified` (or Microsoft `xms_edov`) check and no password check, on the unauthenticated callback. An attacker who can make the configured issuer emit a token bearing a victim's email logs in as that victim with a full session and no victim interaction (the nOAuth / Grafana CVE-2023-3128 class). The 2.3.0 fix for GHSA-8jvc-mcx6-r4cg added a TOTP gate, not an `email_verified` gate, so users without TOTP remain exposed.\n\n## Details\n\nReferences are `pkg/modules/auth/openid/openid.go` at HEAD. Identity is first resolved on the immutable `(issuer, subject)` pair (`openid.go:428`). On a subject miss with `emailfallback` on, `fallbackSearchUsers` adds an email-only lookup against local accounts:\n\n```go\n// openid.go:413\nsearches = append(searches, &user.User{Issuer: user.IssuerLocal, Email: cl.Email})\n```\n\n`getUser` resolves this via `s.Get()`, which ANDs non-zero fields -> `WHERE issuer='local' AND email=?`. Local users always have `Issuer=\"local\"` (`user_create.go:38`), so the lookup matches any local account by email alone; `getOrCreateUser` returns it and the caller mints a session — the password is never read. The `claims` struct has no `email_verified` field (`openid.go:80`) and `getClaims` never consults one; a repo-wide grep for `email_verified`/`xms_edov` returns nothing. The code already warns about this at `openid.go:388` (\"Discouraged for untrusted providers where someone can set email without verification\") — but enforces nothing.\n\n## Impact\n\nUnauthenticated takeover of any existing **local** account (read/write/delete its projects, tasks, attachments, shares), bypassing the password. Scope notes: only `issuer='local'` accounts are matched (not pure-SSO users); the attacker's `sub` is not bound to the victim record, but the attack is repeatable; TOTP users are protected by the 2.3.0 `enforceTOTPIfRequired` gate (`openid.go:250`), non-TOTP users are not.\n\n## Preconditions\n\n1. Admin enabled `emailfallback: true` (defaults false — a default install is unaffected).\n2. The configured issuer lets the attacker assert the victim's unverified email: a self-service IdP (Keycloak/Authentik/Auth0/Dex with editable email), a mixed federation, or a multi-tenant Entra `/common` app. `iss`/`aud` are pinned, but the attacker controls `email`, not the issuer.\n3. The victim has a local account.\n\nNot reachable against a single-tenant IdP that verifies email and disallows self-set addresses.\n\n## Recommended Fix\n\nAdd `email_verified` to the `claims` struct and require it `true` on the email-fallback branch before linking to a local account; reject when absent/false. For Entra also require `xms_edov` and pin multi-tenant configs to an allowed-tenant list. Fail closed on an email collision not backed by a verified email from a trusted single-tenant issuer rather than silently logging the caller in.",
"severity" : [ {
"type" : "CVSS_V4",
"score" : "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "Go",
"name" : "code.vikunja.io/api"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "1.0.0"
}, {
"fixed" : "2.4.0"
} ]
} ],
"database_specific" : {
"last_known_affected_version_range" : "<= 2.3.0"
}
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/go-vikunja/vikunja/security/advisories/GHSA-xv7q-fvmc-jx96"
}, {
"type" : "WEB",
"url" : "https://github.com/go-vikunja/vikunja/commit/7854f2729ab72000210b61c25929678fd6901630"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/go-vikunja/vikunja"
}, {
"type" : "WEB",
"url" : "https://github.com/go-vikunja/vikunja/releases/tag/v2.4.0"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-287", "CWE-290", "CWE-345" ],
"severity" : "HIGH",
"github_reviewed" : true,
"github_reviewed_at" : "2026-10-09T20:49:06Z",
"nvd_published_at" : null
}
}