Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain database read access (backup/misconfig/SQLi)
-
ExploitDump plaintext tokens from user_tokens
-
ExecutionSubmit stolen reset token to API
-
ImpactSet new password, take over account
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V14 - Data Protection Encrypted storage of sensitive data
|
| Exploitation Conditions | Exploitation requires two preconditions. First, the attacker must already have read access to the Vikunja backend database - via a leaked/unsecured backup, misconfigured or publicly exposed storage, or a secondary SQL-level exposure such as SQL injection - because the vulnerability is plaintext storage of tokens in the user_tokens table, not a directly reachable network flaw. Second, a target account must have a pending password-reset, email-confirmation, or account-deletion token (kind IN (1,2,3)) that is still within its 24-hour validity window; accounts with no outstanding token cannot be taken over this way. Limiting factors: the whole attack is gated on an out-of-band database compromise, the 24-hour token lifetime bounds the usable token set, and CalDAV tokens are unaffected because they are already bcrypt-hashed. No Vikunja application authentication or user interaction is needed for the token-redemption step itself. |
| Impact | This is a genuine high-impact flaw but a conditional one, and the signals should be read together rather than at face value. The CVSS base score of 8.1 is driven by full C:H/I:H/A:H account takeover (including admin accounts) over a network vector, but it correctly carries AC:H because exploitation is not self-contained: the attacker must FIRST obtain read access to the database out-of-band (leaked backup, misconfigured/exposed storage, or a secondary SQL injection). The AV:N/PR:N/UI:N metrics describe only the second stage - redeeming a stolen plaintext token against the public reset API with no Vikunja authentication or user interaction - so the network-unauthenticated framing is accurate for that stage but presupposes a prior database compromise. A PoC (SQL dump query plus a curl reset request) is published in the GHSA advisory, so working exploit steps are public. There is no CISA KEV listing and no EPSS score was supplied in the input; absent those, there is no evidence of active or widespread exploitation, and the dependency on an existing DB breach makes mass automated exploitation unlikely. Net: treat as a real but second-order priority - the severity materializes only for operators who have also suffered a database exposure, with a 24-hour token-lifetime window limiting the set of usable tokens. |
| Exploit ScenarioDerived | An attacker who obtains a leaked Vikunja database backup or exploits a separate SQL injection reads the user_tokens table, where password-reset tokens are stored in plaintext. Because the advisory publishes a working PoC (a SELECT to dump tokens followed by a curl POST to /api/v1/user/password/reset), the attacker can immediately submit any pending reset token to set a new password and seize the account - including admin accounts - without knowing the original password. The high attack complexity reflects the prerequisite database read access rather than any difficulty in the token redemption itself. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 09, 2026
Plaintext storage of password-reset, email-confirmation and account-deletion tokens in Vikunja prior to 2.4.0 allows anyone who already holds read access to the backend database to redeem a pending token and take over the associated account, including administrator accounts, without knowing any password. The vulnerability is a CWE-312 cleartext-storage flaw rated CVSS 8.1 (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H), where the high attack complexity reflects two preconditions rather than any weakness in the exploit itself: the attacker must independently obtain database read access (leaked or misconfigured backups, exposed storage, or a secondary SQL-level exposure), and the victim account must have an unexpired token within its 24-hour lifetime. The vendor advisory publishes proof-of-concept code illustrating the attack (a SQL query harvesting tokens plus a password-reset redemption request); no KEV listing was provided in the available intelligence, so there is no confirmation of active exploitation, and the CVSS vector's PR:N confirms the token-redemption step itself requires no Vikunja application credentials or user interaction.
RemediationAI
Vendor-released patch: upgrade to Vikunja 2.4.0 (release tag v2.4.0), which switches token creation to bcrypt hashing via generateHashedToken, replaces the plaintext SQL lookup with bcrypt.CompareHashAndPassword, and ships migration 20260719145922 that deletes all existing rows in user_tokens where kind IN (1, 2, 3) - so upgrade both fixes the code path and purges the stale plaintext secrets; expect the side effect that any in-flight password-reset, email-confirmation or account-deletion links stop working and users must request new ones. Until the upgrade can be staged, the effective compensating controls all target the precondition of database read access rather than the token storage itself: move backups off any publicly reachable or weakly permissioned storage (S3 buckets, unauthenticated snapshot shares) and encrypt them at rest, since a leaked backup is the most direct path to exploitation and the trade-off is purely operational cost; restrict database network exposure to the application host and rotate database credentials and any storage access keys that may have been broadly distributed, accepting the brief service interruption; and, if you suspect exposure, manually issue the equivalent of the migration (DELETE FROM user_tokens WHERE kind IN (1, 2, 3)) to invalidate any tokens an intruder may already hold, with the same user-visible consequence that pending reset and confirmation links must be re-issued. Enable and retain database audit/query logging so that bulk SELECTs against user_tokens joined to users can be detected, and treat the appearance of such a query as an account-takeover indicator requiring forced credential resets. Note that the three upstream fix commits are referenced at https://github.com/go-vikunja/vikunja/commit/00fd2c6155c01faae99be4226b931d8091fd6323, https://github.com/go-vikunja/vikunja/commit/3a0ea15d8c18ff960bc98ae39950fa7a14b0af7d and https://github.com/go-vikunja/vikunja/commit/e31ea2de5040fa63bc97cf4df63bafed3bd9ad85, with the advisory at https://github.com/go-vikunja/vikunja/security/advisories/GHSA-r6w9-259g-gwrv.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Vikunja is a Go-based, self-hosted task management platform that persists users, tasks and auxiliary state through the xorm ORM. Authentication-adjacent secrets are held in a user_tokens table keyed by a kind discriminator, where kind values 1, 2 and 3 correspond to password-reset, email-confirmation and account-deletion tokens respectively. In affected versions, the token generator in pkg/user/token.go produced a random string via utils.CryptoRandomString and then wrote that raw string directly into the table with no transformation, and the corresponding lookup in getToken performed a direct SQL equality match (kind = ? AND token = ?). This is the classic CWE-312 cleartext-storage pattern: a bearer credential that functions exactly like a password is stored in a recoverable form, so the database itself becomes a credential store for any reader. Notably, the same source file already implemented correct handling for CalDAV tokens via generateHashedToken using bcrypt, meaning the project had the right primitive available and simply failed to apply it to the three vulnerable token kinds - a consistency gap rather than a missing capability. The fix replaces genToken with the hashed generator for all three kinds, changes lookup to bcrypt.CompareHashAndPassword, and adds migration 20260719145922 which issues DELETE FROM user_tokens WHERE kind IN (1, 2, 3), deliberately invalidating every outstanding plaintext token because those rows must be assumed exposed. CPE data identifies the affected product line as cpe:2.3:a:go-vikunja:vikunja:*:*:*:*:*:*:*:* and the Go module as go/code.vikunja.io/api, vulnerable through 2.3.0.
Know when Vikunja gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
AC:H because exploitation depends on prior out-of-band database read access and a pending token; PR:N/UI:N since token redemption needs no Vikunja auth; C/I/A:H from full account (incl. admin) takeover and account-deletion capability.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Vikunja is an open-source self-hosted task management platform. Versions prior to 2.4.0 store password-reset, email-confirmation, and account-deletion tokens in the user_tokens table in plaintext. If an attacker gains read access to the database through a backup leak, misconfigured storage, or SQL-level exposure, they can immediately use pending tokens to take over user accounts without knowing passwords. Version 2.4.0 fixes the issue.
Technical POC Analysis
CWE-312 (Cleartext Storage of Sensitive Information), with a secondary CWE-916 tag on the advisory.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Vikunja versions before 2.4.0 expose a high-severity account-takeover path in which a database read-only exposure can be converted into control of user and administrator accounts without any password. The business risk is the confidentiality and integrity of project, task, and administrative data, plus the operational disruption that follows an administrator compromise. Publicly available exploit code exists, but there is no CISA KEV listing confirming active exploitation, so priority should be driven by the presence of Vikunja and the security of its database and backups.
No vendor-released patch identified at time of analysis; restrict database read access to least privilege, encrypt database and backups at rest, secure exposed backups/storage, invalidate outstanding tokens, monitor for anomalous token redemption and password-reset activity, and enforce MFA and least privilege for Vikunja administrators.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Weak password policy in Vikunja task management before 2.0.0 allows users to set trivially guessable passwords. PoC avai
Stored cross-site scripting (XSS) in Vikunja prior to version 2.0.0 allows authenticated attackers to steal authenticati
Vikunja before version 2.0.0 contains a path traversal vulnerability in its backup restoration function that fails to va
Vikunja is an open-source self-hosted task management platform. [CVSS 6.1 MEDIUM]
Business logic vulnerability in Vikunja task management platform before 2.1.0 allows incomplete resource cleanup, potent
Cross-tenant information disclosure in the self-hosted task manager Vikunja (0.24.0 through 2.3.0) lets a holder of any
Instance-wide data breach in Vikunja before 2.2.1 lets remote attackers exfiltrate and destroy every file attachment acr
Vikunja instances before 2.6.0 expose CalDAV BasicAuth endpoints (/dav, /.well-known, and /feeds) that are not covered b
Vikunja versions before 2.6.0 ship authentication endpoints under /api/v2 (login, register, password-reset, and OAuth to
Vikunja prior to 2.6.0 leaks the secret hash that backs a project's link shares through its single-share read endpoint,
Principal type confusion in Vikunja (versions 0.22.0-2.3.0) allows an authenticated low-privilege attacker to fully cont
Privilege escalation in Vikunja 2.3.0 allows a user who holds a narrowly scoped API token (permissions {"oauth":["author
EUVD-2026-95994
GHSA-r6w9-259g-gwrv
NVD
CVE.org
EPSS
Exploit-DB