Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privilege tenant user
-
DeliveryRepoint default_project_id and delete Inbox to reach zero accessible projects
-
ExploitCreate saved filter with empty filter string
-
ExecutionFail-open search returns all instance tasks
-
ImpactBulk-write cross-tenant task_positions rows for DoS/integrity violation
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization logic validation
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires a valid authenticated account on the Vikunja instance (PR:L) AND a specific account state - zero accessible projects - which the attacker can engineer by repointing default_project_id and deleting their Inbox. The trigger is the normal SavedFilter.Create flow using a saved filter with an EMPTY filter string and no search string, which causes RecalculateTaskPositions (with addExistingTasksToView=true) to run a search whose project scope collapses to nothing and whose WHERE clause is dropped by go-xorm, returning every task instance-wide. Limiting factors that reduce real-world risk: exploitation is impossible for anonymous/unauthenticated attackers, the impact is meaningful mainly in multi-tenant deployments (single-tenant instances see no cross-tenant exposure), the attacker gains no read access to other tenants' task contents, and the user must deliberately reach the unusual zero-accessible-projects state rather than it being a default configuration. |
| Impact | This is a moderate-severity, authenticated authorization flaw (CWE-863), not a critical issue despite the network attack vector. The provided CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:L) scoring 5.3 is internally consistent with the description: exploitation requires an authenticated low-privilege account (PR:L), is network-reachable and low-complexity, yields no confidentiality impact (the attacker still cannot read other tenants' task contents) but low integrity and low availability impact via cross-tenant writes and write amplification. No EPSS score, CISA KEV listing, SSVC decision, or public POC was supplied, so there is no signal of active or probable exploitation - exploitation status is therefore 'no public exploit identified at time of analysis.' The realistic risk is a logged-in, same-instance abuser degrading integrity/availability in multi-tenant deployments, rather than an externally weaponizable mass-exploitation threat; the low VC and the requirement for a non-default account state (zero accessible projects) further cap real-world urgency. Note a data conflict to verify with the vendor: the description states the fix is 2.7.0 and the flawed behavior is described as present 'in v2.6.0,' while the GitHub package metadata lists 'fixed in: None' for the range >= 1.0.0-rc0, <= 2.6.0 - treat 2.7.0 as the likely fixed version but confirm against the GHSA advisory. |
| Exploit ScenarioDerived | An authenticated low-privilege user on a shared multi-tenant Vikunja instance manipulates their account into having zero accessible projects (deleting their Inbox after repointing default_project_id), then creates a saved filter with an empty filter string. Because the position-recalculation search fails open and loses its project scope, the server writes task_positions rows for every task in the entire instance - including other tenants' tasks - into views owned by the attacker, producing a single-request write-amplification primitive that scales with instance size for denial of service. No public exploit code is identified at time of analysis, and the attack is low-complexity but requires a valid account. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 17, 2026
An improper authorization flaw in Vikunja's saved-filter creation flow lets any authenticated user who has engineered a zero-accessible-projects account state cause RecalculateTaskPositions to write task_positions rows for every task on the instance, including tasks belonging to other tenants. Triggering it requires a saved filter created with an empty filter string and no search string, which collapses the project scope and drops the WHERE clause entirely, producing a single-request write-amplification primitive that scales with instance size and enables denial of service plus cross-tenant integrity violations. Vikunja versions from 1.0.0-rc0 through 2.6.0 are affected and 2.7.0 contains the fix; the flaw is authenticated-only (PR:L per the assessed vector), yields no read access to other tenants' task contents, and is only materially impactful in multi-tenant deployments - no public exploit code was identified at time of analysis and there is no confirmed active exploitation (CISA KEV).
RemediationAI
Upgrade to Vikunja 2.7.0 or later, which is the vendor-released patch for this issue; verify the upgrade against the GitHub advisory at https://github.com/go-vikunja/vikunja/security/advisories/GHSA-fprf-r6rv-xg99. Because the fix is version-based and no backport is documented in the available data, pin the Go module go/code.vikunja.io/api to a build derived from 2.7.0+ and rebuild any self-compiled instances. If immediate upgrade is not possible, compensating controls include restricting saved-filter creation to trusted roles or administrators (trade-off: loses a commonly used end-user feature), auditing and removing saved filters that have an empty filter string and no search string (trade-off: point-in-time only, new ones can be created), and denying or tightly monitoring changes to a user's default_project_id or deletion of the Inbox project, since reaching the zero-accessible-projects precondition is what arms the bug (trade-off: default_project_id changes and inbox deletion are legitimate user actions and blocking them degrades usability). Operators of multi-tenant instances should also scan task_positions for rows whose task_id belongs to a project the owning view's user cannot access and purge them, and should treat instances where users share a database across tenants as the priority upgrade population; single-tenant deployments face only a self-inflicted denial-of-service risk via write amplification. Monitoring for bursts of position-row inserts following saved-filter creation provides a detection signal but is not a preventive control.
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 maintains task ordering for kanban and list views in a shared task_positions table keyed by (task_id, project_view_id). When a saved filter is created, SavedFilter.Create (pkg/models/saved_filters.go) calls CreateDefaultViewsForProject (pkg/models/project_view.go), which for each default view - four per filter - invokes RecalculateTaskPositions (pkg/models/task_position.go) with addExistingTasksToView set to true. For filter views (view.ProjectID < -1) the project scope is reset to zero and the saved filter string injected; scope is then derived in getRelevantProjectsFromCollection (pkg/models/task_collection.go), which for ProjectID == 0 returns only the projects the requesting user can access. In dbTaskSearcher.Search (pkg/models/task_search.go) the WHERE clause is assembled as builder.And(builder.Or(projectIDCond, favoritesCond), where, filterCond); projectIDCond is populated only when the resolved project ID list is non-empty, favoritesCond is never requested by this path, an empty filter string yields no filter condition, and no search string yields no where clause. go-xorm's condition builders silently discard invalid children, so the query degrades to an unqualified SELECT over the tasks table, and the results are written back unconditionally after deleting the view's existing position rows and bulk-inserting new ones. This violates the invariant established in the fix for GHSA-w39f-h553-h2mx that position writes must be scoped by project read access - a classic CWE-863 incorrect authorization failure in which an access-control predicate is omitted rather than explicitly denied (failing open instead of closed).
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:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N
Authenticated low-priv user over network with low complexity (PR:L/AC:L); no read of other tenants' data (C:N); cross-tenant row writes and write-amplification give I:L and A:L.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
1DescriptionCVE.org
Vikunja from 1.0.0-rc0 before 2.7.0 contains an improper authorization vulnerability in RecalculateTaskPositions that allows authenticated users with zero accessible projects to write task_positions rows for all tasks instance-wide. Attackers can delete their Inbox after repointing default_project_id, then create empty-filter saved filters to persist cross-tenant references and amplify writes for denial of service.
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
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
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-103303
GHSA-mjqg-gwhm-xr66
NVD
CVE.org
VulDB
Exploit-DB