Skip to main content

Vikunja EUVDEUVD-2026-103304

| CVE-2026-111917 HIGH
Insufficient Session Expiration (CWE-613)
2026-10-17 VulnCheck GHSA-355w-rx9g-pww7
7.1
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

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

  1. Access
    Steal valid user access JWT
  2. Delivery
    Connect to /api/v2/ws with token
  3. Exploit
    handleAuth validates signature/type but skips sid check
  4. Execution
    Maintain connection past session revocation
  5. Impact
    Exfiltrate victim notification/task/comment content

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V7 - Session Management Session expiration enforcement
Exploitation Conditions

Exploitation requires the attacker to possess a valid, non-expired Vikunja user access JWT (a stolen token) for the target user - there is no initial-access path here. The specific defect: the /api/v2/ws WebSocket endpoint authenticates the first client message via GetUserIDFromToken, which checks only JWT signature and token type and never resolves the token's 'sid' session-id claim against the sessions table. The condition that makes it impactful is reliance on server-side session revocation (DELETE /api/v2/user/sessions/{id}, introduced with server-side sessions in 2.6.0) or TOTP enrollment (which triggers DeleteAllUserSessions) as a trust boundary - both silently fail over WebSocket, and even a new WebSocket connection opened with a pre-revocation token is accepted. Limiting factors: affects only versions 2.3.0 through 2.6.0; requires prior token theft; and impact is limited to reading pushed notification content for the compromised account, not account takeover or data modification.

Impact

This is a genuine but moderate-priority confidentiality issue, not a critical emergency. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:N) and the 7.1 score reflect network-reachable, low-complexity exploitation, but PR:L is the key limiter: the attacker must already possess a cryptographically valid user access JWT (i.e. a stolen token), so this is a post-compromise session-persistence weakness (CWE-613), not an initial-access vector. Impact is confidentiality-only (VC:H, VI:N, VA:N) - the attacker reads the victim's notification.created pushes (comment, task and project content) but cannot modify data or deny service. No EPSS score, no CISA KEV listing, and no public POC were provided; per precision rules this is 'no public exploit identified at time of analysis.' The advisory originates from VulnCheck as coordinated research rather than observed in-the-wild activity, consistent with the absence of KEV/EPSS signals. The practical risk is real for environments relying on Vikunja's session-revocation or TOTP-enrollment features as a security boundary, because those actions silently fail to cut off live WebSocket access - but it depends entirely on an attacker first stealing a token, which bounds real-world urgency to medium.

Exploit ScenarioDerived

An attacker who has stolen a victim's Vikunja user access token (e.g. via XSS, a leaked token, or a shared/compromised device) opens or keeps open a connection to /api/v2/ws. Even after the victim revokes the session via DELETE /api/v2/user/sessions/{id} or enables TOTP (which calls DeleteAllUserSessions), the WebSocket connection stays authenticated and keeps streaming the victim's notification.created events with full comment, task and project content. No public exploit code is identified, but the GHSA advisory documents the exact vulnerable code path.

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

Revoked Vikunja sessions retain live WebSocket access: in versions 2.3.0 through 2.6.0 the /api/v2/ws endpoint authenticates the first client message by verifying only the JWT signature and token type, never resolving the token's 'sid' claim against the sessions table, so a stolen access token can still open a new connection or keep an existing one alive after DELETE /api/v2/user/sessions/{id} or after TOTP enrollment wipes all sessions. The impact is confidentiality-only: the attacker continues to receive notification.created pushes carrying comment, task and project content belonging to the victim's account, which the vendor scores 7.1 under CVSS 4.0 (PR:L, VC:H) and our assessment scores 6.5 under CVSS 3.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N). Exploitation requires an authenticated attacker who already holds a valid, unexpired user access token - there is no initial-access path in this defect - and no public exploit code or CISA KEV entry was identified at time of analysis.

RemediationAI

Upgrade to Vikunja 2.7.0 or later, the first release outside the affected 2.3.0-2.6.0 range per the advisory, and verify the fixed version against GHSA-4hv6-xc92-j86g (https://github.com/go-vikunja/vikunja/security/advisories/GHSA-4hv6-xc92-j86g) and the VulnCheck advisory before closing the finding, since the Go module metadata listed no fixed version at publication. No configuration toggle makes the /api/v2/ws path honor the 'sid' claim without the code fix, so until patching is possible use compensating controls with explicit trade-offs: rotate the instance's ServiceSecret, which invalidates every outstanding JWT at once and forcibly logs out all users and integrations; shorten the access-token TTL and require clients to reconnect and re-authenticate frequently, accepting more churn on the WebSocket path; block or restrict /api/v2/ws at the reverse proxy to trusted networks or authenticated tiers, which breaks legitimate browser clients relying on live notifications; and treat any suspected token theft as requiring secret rotation or a password change plus full re-issuance rather than session deletion or TOTP enrollment alone, because neither of those actions terminates an existing WebSocket registration. Log and monitor WebSocket connection lifetimes relative to session-revocation events so that connections surviving a revocation are detected while the fix is pending.

Affected VersionsENISA

vikunja 2.3.0 <2.7.0

Affected Packages

go code.vikunja.io/api no fix
euvd vikunja fix: 2.7.0

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 task/project management application whose API module (go/code.vikunja.io/api) issues user JWTs signed with the shared config.ServiceSecret, with NewUserJWTAuthtoken (pkg/modules/auth/auth.go:188) embedding a 'sid' claim that ties the token to a server-side session row. Server-side sessions with revocation semantics arrived in 2.6.0: DELETE /api/v2/user/sessions/{id} revokes a session by UUID and TOTP enrollment calls models.DeleteAllUserSessions (pkg/routes/api/v2/user_totp.go:208). The WebSocket endpoint GET /api/v2/ws authenticates out-of-band via Connection.handleAuth (pkg/websocket/connection.go:168), which delegates to auth.GetUserIDFromToken (pkg/modules/auth/auth.go:292); that function parses the token with jwt.Parse, checks only the 'type' claim equals AuthTypeUser, and returns a user ID - it performs no sessions-table lookup and no re-validation occurs after the initial handshake, so the connection stays registered in the hub and keeps receiving subscribed events indefinitely. The REST surface is knowingly different: access tokens simply age out after a short TTL (the documented design choice from the GHSA-96q5 fix) while refresh tokens are correctly invalidated on session deletion, which means the short-TTL compensating assumption is defeated by long-lived WebSocket connections. This is CWE-613 (Insufficient Session Expiration) manifesting as an authentication/authorization state mismatch between the HTTP session store and the WebSocket trust boundary.

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.1 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
vuln.today AI 6.5 MEDIUM

Network-reachable with low complexity, but requires a valid stolen user token (PR:L); confidentiality-only impact (C:H) exposing notification/task content, with no integrity or availability effect.

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

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
None
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.1

DescriptionCVE.org

Vikunja 2.3.0 before 2.7.0 contains an improper session validation vulnerability that allows attackers to keep WebSocket access after revocation because handleAuth never checks the JWT sid claim against the sessions table. Attackers holding a stolen access token can open or maintain connections to /api/v2/ws after session deletion or TOTP enrollment, continuing to receive the victim's notification.created pushes, including comment, task and project content.

Technical POC Analysis

CWE-613 (Insufficient Session Expiration), specifically improper server-side session validation on the WebSocket authentication path.

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.3.0 through 2.6.0 fail to invalidate WebSocket access when a user session is revoked, so anyone holding a stolen-but-still-valid access token keeps receiving live task, project, and comment notifications even after the victim logs out, deletes the session, or resets sessions via TOTP enrollment. This directly undermines the containment steps security teams rely on after credential theft or during employee offboarding, meaning incident responders cannot currently assume that a terminated session has actually stopped data flow. Leadership should care because the exposure is silent and ongoing - no new compromise is needed once a token has leaked - and it affects confidentiality of business content for every self-hosted Vikunja deployment in the stated version range.

Business Impact: Medium
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: block or restrict the /api/v2/ws endpoint at the reverse proxy/WAF; rotate the JWT signing secret to invalidate all outstanding access tokens; reduce access-token lifetime to the minimum viable value; monitor WebSocket connections for anomalous source IPs or user agents; and treat session revocation and TOTP-driven session wipes as unreliable for containment until a fixed Vikunja release is deployed.

Threat Intelligence Overview

Prevalence
Low
niche self-hosted open-source to-do app, limited enterprise 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
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
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