Skip to main content

Vikunja CVE-2026-111922

| EUVDEUVD-2026-103290 HIGH
Permissive Cross-domain Security Policy with Untrusted Domains (CWE-942)
2026-10-17 VulnCheck GHSA-r87c-f263-6pfc
7.2
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Serve malicious page on victim localhost port
  2. Delivery
    Victim with active Vikunja session loads page
  3. Exploit
    Script sends credentialed fetch to token refresh endpoint
  4. Execution
    Permissive CORS returns bearer JWT in response body
  5. Impact
    Read 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

vikunja 2.2.0 <2.7.0

Affected Packages

euvd vikunja fix: 2.7.0

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

Vendor (VulnCheck) PRIMARY 7.2 HIGH
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
vuln.today AI 7.1 HIGH

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.

3.1 AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
4.0 AV:L/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Local
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Oct 17, 2026 - 20:16 EUVD
CVE Published
Oct 17, 2026 - 18:46 cve.org
HIGH 7.2

DescriptionCVE.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

Why It Matters

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.

Business Impact: Medium
Compensating Controls

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

Prevalence
Low
self-hosted open-source task manager, niche community footprint
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact
Medium

Priority Score

36
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

CVE-2026-27575 CRITICAL POC
9.1 Feb 25

Weak password policy in Vikunja task management before 2.0.0 allows users to set trivially guessable passwords. PoC avai

CVE-2026-27616 HIGH POC
7.3 Feb 25

Stored cross-site scripting (XSS) in Vikunja prior to version 2.0.0 allows authenticated attackers to steal authenticati

CVE-2026-27819 HIGH POC
7.2 Feb 25

Vikunja before version 2.0.0 contains a path traversal vulnerability in its backup restoration function that fails to va

CVE-2026-27116 MEDIUM POC
6.1 Feb 25

Vikunja is an open-source self-hosted task management platform. [CVSS 6.1 MEDIUM]

CVE-2026-28268 CRITICAL
9.8 Feb 27

Business logic vulnerability in Vikunja task management platform before 2.1.0 allows incomplete resource cleanup, potent

CVE-2026-68582 CRITICAL POC
9.3 Aug 02

Cross-tenant information disclosure in the self-hosted task manager Vikunja (0.24.0 through 2.3.0) lets a holder of any

CVE-2026-56765 CRITICAL
9.3 Jul 10

Instance-wide data breach in Vikunja before 2.2.1 lets remote attackers exfiltrate and destroy every file attachment acr

CVE-2026-91973 HIGH POC
8.7 Sep 15

Vikunja instances before 2.6.0 expose CalDAV BasicAuth endpoints (/dav, /.well-known, and /feeds) that are not covered b

CVE-2026-91972 HIGH POC
8.7 Sep 15

Vikunja versions before 2.6.0 ship authentication endpoints under /api/v2 (login, register, password-reset, and OAuth to

CVE-2026-91985 HIGH POC
8.7 Sep 15

Vikunja prior to 2.6.0 leaks the secret hash that backs a project's link shares through its single-share read endpoint,

CVE-2026-68581 HIGH POC
8.6 Aug 02

Principal type confusion in Vikunja (versions 0.22.0-2.3.0) allows an authenticated low-privilege attacker to fully cont

CVE-2026-57458 HIGH
8.1 Oct 09

Privilege escalation in Vikunja 2.3.0 allows a user who holds a narrowly scoped API token (permissions {"oauth":["author

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy