Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessServe malicious page on victim localhost port
-
DeliveryVictim with active Vikunja session loads page
-
ExploitScript sends credentialed fetch to token refresh endpoint
-
ExecutionPermissive CORS returns bearer JWT in response body
-
ImpactRead JWT and hijack authenticated session
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A02:2025 - Security Misconfiguration
ASVS 5.0
V13 - Configuration CORS policy restriction
|
| Exploitation Conditions | Requires that cors.enable remains true (the default) and that cors.origins retains its default localhost/127.0.0.1 port wildcards - per the advisory these are APPENDED to, not replaced by, the mandatory service.publicurl, so even a fully configured production deployment keeps trusting them and there is no supported configuration that drops them. The victim must be authenticated to Vikunja (holding a valid vikunja_refresh_token cookie) and must load attacker-controlled content served from some port on their own localhost or 127.0.0.1. Limiting factors that reduce real-world risk: the attacker must be able to serve a page on the victim's local machine (a local foothold, rogue/compromised local app, or malicious local dev server), the victim must have a live session, and the attack depends on the browser honoring the credentialed cross-origin response - it is not exploitable directly from an arbitrary external internet origin. |
| Impact | This is a genuine but conditional account-takeover flaw, not a mass-exploitable internet-facing RCE. The input provides a CVSS 4.0 vector (AV:L/AC:L/AT:P/PR:N/UI:P, VC:H/VI:H) scoring 7.2 (HIGH), and CWE-942 (permissive cross-domain policy) matches the described CORS misconfiguration precisely. Key risk-moderating signals: AV:L and AT:P indicate the attack is NOT straightforward remote exploitation - the malicious origin must itself be a localhost/127.0.0.1 port on the victim's own machine, and UI:P requires the logged-in victim to load that attacker-controlled page. No EPSS score was provided, and there is no CISA KEV listing and no public exploit code referenced, so exploitation status is: no public exploit identified at time of analysis. The flaw was reported by VulnCheck (a credible vulnerability-intelligence source) and is documented in a detailed vendor GHSA advisory with source-code line references, so the technical mechanism is well-corroborated even though real-world exploitation is unproven. Net: credible, well-documented, and high-impact if triggered (full JWT/account takeover), but the localhost-origin prerequisite makes it targeted rather than wormable - prioritize patching for multi-user/shared or hostile-local-process environments over treating it as an emergency internet-exposure bug. |
| Exploit ScenarioDerived | A user is logged into their self-hosted Vikunja instance (holding a valid vikunja_refresh_token cookie) and is lured to, or already runs, a malicious page served from any port on their own localhost/127.0.0.1 - for example a rogue local dev server or a compromised local application. That page issues a single credentialed fetch() to Vikunja's token refresh endpoint; because the default CORS policy trusts every localhost origin with Access-Control-Allow-Credentials: true, the browser returns the fresh bearer JWT in the response body, which the attacker's script reads and uses to take over the account. No public proof-of-concept was referenced in the provided data, but the vendor advisory describes the full working chain. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 17, 2026
Account takeover in Vikunja 2.2.0 through 2.6.0 stems from a default CORS policy that trusts every localhost and 127.0.0.1 port with credentials, even when service.publicurl is set, so a page served from any local port can call the token refresh endpoint and read the returned bearer JWT. The attack is conditional rather than mass-exploitable: the attacker must be able to host malicious content on the victim's own machine, and the victim must have an active authenticated session; it is not directly exploitable from an arbitrary external internet origin. No public exploit identified at time of analysis.
RemediationAI
Upgrade to Vikunja 2.7.0 or later as the CVE's 'before 2.7.0' range implies; because the Go package metadata lists fixed in: None, verify the patched release in GHSA-m687-p538-r5hp before rollout. Until upgrading, explicitly override cors.origins to only the exact production origin and confirm that localhost/127.0.0.1 are no longer reflected in Access-Control-Allow-Origin, since service.publicurl alone is appended to the defaults and does not remove them. If no browser-based cross-origin API clients are needed, set cors.enable=false, accepting that legitimate cross-origin web clients will break. Consider shortening refresh-token lifetime, requiring re-authentication for refresh, or rejecting refresh-endpoint requests whose Origin header is a localhost/127.0.0.1 origin at a reverse proxy; these compensating controls can break local development or legitimate clients and should be tested. Advisory: https://github.com/go-vikunja/vikunja/security/advisories/GHSA-m687-p538-r5hp.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in 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 task and project management API (Go package go/code.vikunja.io/api). The flaw is CWE-942, a permissive cross-domain security policy: cors.enable defaults to true and cors.origins defaults to http://127.0.0.1:* and http://localhost:*, while the Echo v5 middleware is registered with AllowCredentials: true and a custom UnsafeAllowOriginFunc/matchCORSOrigin to support port wildcards. The mandatory service.publicurl value is appended to that origin list instead of replacing it, so a production deployment that sets only its public URL still reflects credential-bearing requests from any port on localhost or 127.0.0.1. The refresh endpoint authenticates with the HttpOnly vikunja_refresh_token cookie and returns a new bearer JWT in the JSON body; the attacking page never needs to read the HttpOnly cookie because the browser attaches it to the credentialed cross-origin request, and the permissive CORS response lets the page read the JWT. The CVSS 4.0 vector is AV:L/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N; the independent CVSS 3.1 assessment is AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N, reflecting that exploitation requires a local page-hosting foothold and victim interaction rather than an external-origin attack. No public exploit identified at time of analysis.
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
CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
AV:L because the malicious origin must be a localhost port on the victim's machine; UI:R as the logged-in victim must load the page; PR:N since the attacker needs no account; C:H/I:H for full JWT account takeover, A:N.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
Vikunja from 2.2.0 before 2.7.0 contains a permissive CORS configuration that trusts every localhost and 127.0.0.1 port with credentials, even when service.publicurl is set. Attackers controlling a page on any localhost port can send a credentialed request to the token refresh endpoint and read the returned bearer JWT to take over the logged-in user's account.
Technical POC Analysis
CWE-942 (Permissive Cross-domain Security Policy with Untrusted Domains).
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 2.2.0 through 2.6.0 ship with a default CORS configuration that trusts credentialed requests from any localhost or 127.0.0.1 port, creating a path to account takeover for users with active sessions. Leadership should care because a compromised account can expose project data and task content, though the attack requires an attacker to already place malicious content on the user's own machine, so it is not broadly exploitable from the open internet. The absence of a vendor patch means exposure persists until configuration changes or an update is released.
No vendor-released patch identified at time of analysis. Interim mitigations: replace the default localhost-trusting CORS policy with an explicit origin allowlist; block or validate Origin headers at the reverse proxy in front of the token refresh endpoint; restrict the ability to host or execute untrusted web content on user endpoints through application allowlisting and browser policy; shorten bearer token lifetimes and require re-authentication for sensitive actions; monitor and alert on token refresh requests from unexpected local ports or origins.
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-103290
GHSA-r87c-f263-6pfc
NVD
CVE.org
VulDB
Exploit-DB