Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain scoped oauth.authorize API token
-
DeliveryPOST /api/v1/oauth/authorize for auth code
-
ExploitExchange code at /api/v1/oauth/token
-
ExecutionMint unrestricted JWT + refresh token
-
ImpactAccess user routes outside token scope
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V8 - Authorization Least privilege enforcement
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 | Exploitation requires the attacker to already hold a valid Vikunja API token for a target user that includes the oauth.authorize permission (the legacy {"oauth":["authorize"]} scope), and the server must be running the OAuth authorization flow reachable at POST /api/v1/oauth/authorize and POST /api/v1/oauth/token on version 2.3.0. No user interaction, no admin rights, and no non-default configuration are needed beyond possessing such a scoped token. Limiting factors: the attacker must obtain or be delegated that token (PR:L), the privilege gain is confined to the SAME user (no cross-user or admin escalation was validated), and upgrading to 2.4.0 - which removes oauth from the grantable scope catalogue and rejects API-token principals at the authorize/token endpoints - fully closes it. |
| Impact | This is a genuine but moderate-priority issue rather than a drop-everything emergency. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N) correctly reflects a network-reachable, low-complexity flaw that nonetheless REQUIRES an attacker to already possess a valid scoped API token (PR:L) - so it is a privilege/scope-boundary bypass (CWE-269), not an unauthenticated RCE. No EPSS score was supplied, the CVE is NOT in CISA KEV, and no public exploit code is referenced; the only exploitation evidence is the vendor's own runtime validation in the GHSA advisory, which is a proof-of-concept description, not released weaponized code. The C:H/I:H/A:N impact is credible for the affected user's own data but is bounded: the advisory explicitly states no cross-user access, no admin privilege escalation, and no access to other accounts was observed, so 'High' confidentiality/integrity applies only within the single compromised user's scope. Net: real and worth patching (the fix is a small, clear commit), but absent KEV/EPSS/public-POC signals and given the token-possession precondition, this is a targeted-abuse / insider-or-leaked-token risk rather than a mass-exploitation threat. |
| Exploit ScenarioDerived | An attacker who is delegated or steals a deliberately narrow Vikunja API token scoped only to {"oauth":["authorize"]} calls POST /api/v1/oauth/authorize to obtain an authorization code, then exchanges it at POST /api/v1/oauth/token for a full bearer JWT and refresh token. Those minted credentials ignore the original token's permission boundary, letting the attacker reach routes the scoped token could not (e.g. GET /api/v1/user and GET /api/v1/projects) for that same user. The vendor advisory documents this as reproduced in runtime testing, but no public exploit tool is referenced. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 09, 2026
Privilege escalation in Vikunja 2.3.0 allows a user who holds a narrowly scoped API token (permissions {"oauth":["authorize"]}) to exchange that token for unrestricted session credentials, defeating the API-token permission boundary. The token holder calls POST /api/v1/oauth/authorize to obtain an OAuth authorization code and then POST /api/v1/oauth/token to trade it for a normal bearer JWT and refresh token that are not bound to the original token's scope - runtime validation showed the scoped token could not read GET /api/v1/user, while the minted token could reach both /api/v1/user and /api/v1/projects. The vulnerability requires an already-issued scoped token from the same user (CVSS 3.1 base 8.1, AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N, CWE-269), no public exploit code has been identified at time of analysis, and there is no confirmed active exploitation (CISA KEV). Version 2.4.0 fixes the issue.
RemediationAI
Upgrade to Vikunja 2.4.0, which is the vendor-released fix (https://github.com/go-vikunja/vikunja/releases/tag/v2.4.0, commit 4ae2e093014881052ed8f8ecd8bcb9adf83dd276); this release rejects API-token principals at both the authorize and token endpoints with HTTP 403 and removes oauth from the grantable API-token scope catalogue so the scope can no longer be issued. Notes and advisory: https://github.com/go-vikunja/vikunja/security/advisories/GHSA-v3p6-34mc-hj7v. If immediate upgrading is not possible, the highest-value compensating control is to enumerate and revoke every existing API token whose permissions include the oauth scope (especially pre-2.4.0 tokens, which the fix's own tests model by inserting a legacy {"oauth":["authorize"]} token directly into the database), and rotate any tokens that cannot be confidently verified - the trade-off is that revoking a token breaks whatever integration was using it, so inventory consumers first. As a stop-gap you can block or strip API-token authentication on the OAuth endpoints at a reverse proxy by rejecting requests to POST /api/v1/oauth/authorize and POST /api/v1/oauth/token that carry an Authorization header with a Vikunja API token (tk_ prefix); the side effect is that any legitimate automation relying on token-based OAuth initiation will stop working, while browser-session OAuth logins remain unaffected. After applying either mitigation, hunt for evidence of abuse by reviewing issued JWTs and refresh tokens for the affected user and auditing access to GET /api/v1/user and GET /api/v1/projects from sessions that originate from token-based authorization; note that the privilege gain is confined to the same user account, with no cross-user or administrative escalation validated, so this is a genuine but moderate-priority issue rather than a drop-everything emergency. No public exploit code has been identified and there is no confirmed active exploitation (CISA KEV), so remediation can proceed on a normal patch cadence.
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
The root cause is an authentication-context mismatch in Vikunja's permission model (CWE-269, Improper Privilege Management) rather than a memory-safety or injection flaw. Vikunja issues scoped API tokens whose allowed routes are derived from a route catalogue in pkg/models/api_routes.go, populated by CollectRoutesForAPITokenUsage; during API-token authentication, pkg/routes/api_tokens.go stores both api_token and api_user in the Echo request context, and pkg/user/user.go treats api_user as a fully authenticated current user. Because /api/v1/oauth/authorize was registered in the same authenticated route group that accepts scoped API tokens, the OAuth 2.0 authorization-code endpoint accepted an API-token principal as a legitimate resource owner and issued an authorization code via pkg/modules/auth/oauth2server/authorize.go. The code could then be redeemed at the token endpoint for a standard bearer JWT plus refresh token, and those credentials carry the user's full session rights instead of the narrow {"oauth":["authorize"]} scope - so the scoped-token boundary is silently escalated to a full session. The 2.4.0 fix (commit 4ae2e093014881052ed8f8ecd8bcb9adf83dd276) addresses this in three places: it adds an explicit rejection of API-token principals in HandleAuthorize (HTTP 403 "API tokens cannot be used to authorize OAuth clients"), applies the same check in the OAuth token handler, and excludes the oauth_authorize route group from the API-token route catalogue so the scope is no longer grantable. Regression tests confirm a legacy oauth-scoped token receives HTTP 401 at the authorize endpoint and that {"oauth":["authorize"]} fails PermissionsAreValid and no longer appears in GetAPITokenRoutes().
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:L/PR:L/UI:N/S:U/C:H/I:H/A:N
Network endpoint, low complexity, but requires an existing scoped API token so PR:L; scope unchanged as access stays within the same user; high C/I over that user's data, no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
DescriptionCVE.org
Vikunja is an open-source self-hosted task management platform. In version 2.3.0, a scoped API token limited to the oauth.authorize permission can call POST /api/v1/oauth/authorize, obtain an OAuth authorization code, and exchange the code at POST /api/v1/oauth/token for a normal bearer JSON Web Token (JWT) and refresh token. The resulting credentials are not restricted by the original API token's permissions, allowing access to routes outside its declared scope for the same user. Version 2.4.0 fixes the vulnerability.
Technical POC Analysis
CWE-269 (Improper Privilege Management), specifically an authentication-context mismatch: the OAuth authorization-code issuance path treats an API-token-authenticated request as a full resource-owner…
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Vikunja 2.3.0, the open-source project and task management platform, contains a privilege-escalation flaw that lets any authenticated holder of a narrowly scoped API token convert that limited credential into an unrestricted session for the same user account. Because the resulting token is not bound to the original scope, integrations, automation scripts, and third-party apps that were deliberately granted minimal permissions become a pathway to full account access, exposing every project, task, and user record the account can reach. Leadership should care because the control organizations rely on to limit third-party and machine-account access - API token scoping - is defeated, and remediation requires an upgrade to Vikunja 2.4.0 across all deployments.
Apply vendor patch (Vikunja 2.4.0); if immediate upgrade is not feasible, revoke or rotate all narrowly scoped API tokens, block external access to the /api/v1/oauth/authorize and /api/v1/oauth/token endpoints, and monitor logs for scoped tokens being exchanged for broader bearer JWTs or refresh tokens.
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
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
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
Plaintext storage of password-reset, email-confirmation and account-deletion tokens in Vikunja prior to 2.4.0 allows any
EUVD-2026-95991
GHSA-v3p6-34mc-hj7v
NVD
CVE.org
EPSS
Exploit-DB