Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAuthenticate as Write-level collaborator
-
DeliveryIdentify target child project with non-zero parent_project_id
-
ExploitSend POST /api/v1/projects/{id} with parent_project_id:0
-
InstallZero-value bypasses Admin gate in CanUpdate and UpdateProject
-
C2xorm writes parent_project_id=0 to database
-
ExecuteProject detached from hierarchy
-
ImpactInherited 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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 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
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
Network-accessible API requires Write-level authentication (PR:L); low complexity; integrity-only impact confined to hierarchy modification with no confidentiality or availability loss.
Primary rating from Vendor (https://github.com/go-vikunja/vikunja).
CVSS VectorVendor: https://github.com/go-vikunja/vikunja
Lifecycle Timeline
1DescriptionCVE.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)
// 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)
if p.ParentProjectID != 0 && p.ParentProjectID != ol.ParentProjectID {
// reparent permission check -- SKIPPED when ParentProjectID == 0
}File: pkg/models/project.go (line 1065)
colsToUpdate := []string{
"title", "is_archived", "identifier", "hex_color",
"parent_project_id", // <-- ALWAYS included, writes 0 to DB
"position",
}Why it's exploitable
- The generic web handler (
pkg/web/handler/update.go:37) creates a fresh emptyProject{}struct --ParentProjectIDdefaults to Go's zero value (0). - When JSON body contains
"parent_project_id": 0, the struct hasParentProjectID == 0. CanUpdateat line 145:ParentProjectID != 0is false -- reparent check skipped -- falls through toCanWritewhich succeeds (attacker has Write).UpdateProjectat line 1018:ParentProjectID > 0is false -- Admin gate skipped entirely.- xorm writes
parent_project_id = 0because"parent_project_id"is always incolsToUpdatewithCols(). - 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.
- Authenticate as attacker:
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')- Verify attacker does NOT have Admin (delete should return 403):
curl -s -o /dev/null -w '%{http_code}' -X DELETE http://localhost:3456/api/v1/projects/4 \
-H "Authorization: Bearer $TOKEN"
# Expected: 403- Exploit -- detach project from parent:
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}'- Verify detachment:
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)
| Run | parent_project_id BEFORE | DELETE attempt (proves no Admin) | parent_project_id AFTER | Result |
|---|---|---|---|---|
| 1 | 3 (child of project 3) | HTTP 403 Forbidden | null (detached to root) | CONFIRMED |
| 2 | 3 (child of project 3) | HTTP 403 Forbidden | null (detached to root) | CONFIRMED |
| 3 | 3 (child of project 3) | HTTP 403 Forbidden | null (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_idupward. 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
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.
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac
Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post
Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten
Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build
Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config
Unauthenticated remote command injection in SGWBOX N3 firmware 2.0.25 lets attackers execute arbitrary operating-system
Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per
Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l
Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c
EUVD-2026-67831
GHSA-44v6-7fxq-vgf4
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB