GHSA-w2ch-4xgr-22ww: Vikunja Task Relation Deletion Does Not Vulnerability
LOWGHSA-w2ch-4xgr-22ww is a LOW task relation deletion does not vulnerability (CWE-862: Missing Authorization) affecting Vikunja libraries in the Go ecosystem. The issue involves task relation deletion does not check read access to the other task, allowing cross-project relation removal. Remediation is available by upgrading affected packages to version 2.6.0.
GHSA-w2ch-4xgr-22ww at a Glance
How to Fix GHSA-w2ch-4xgr-22ww
To remediate this vulnerability, upgrade all affected Vikunja dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade code.vikunja.io/api to 2.6.0
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for code.vikunja.io/api
How to Check if You Are Affected
To determine whether your application is affected by GHSA-w2ch-4xgr-22ww, inspect your project dependencies for Vikunja:
inspect dependencies for code.vikunja.io/api
Analyze the terminal output to locate any version of Vikunja in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 2.6.0), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-862: Missing Authorization, where the product does not perform an authorization check when an actor attempts to access a resource or perform an action. In Vikunja, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
GHSA-w2ch-4xgr-22ww Affected Vikunja Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
code.vikunja.io/api
|
Go |
≥ 0.9
< 2.6.0
|
2.6.0
|
References
Frequently Asked Questions
What is GHSA-w2ch-4xgr-22ww?
Which Vikunja versions are affected?
What version fixes GHSA-w2ch-4xgr-22ww?
Is code.vikunja.io/api affected?
What CWE is associated with GHSA-w2ch-4xgr-22ww?
How can I check Go dependencies for GHSA-w2ch-4xgr-22ww?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-w2ch-4xgr-22ww",
"modified" : "2026-10-09T20:54:52Z",
"published" : "2026-10-09T20:54:52Z",
"aliases" : [ ],
"summary" : "Vikunja: Task relation deletion does not check read access to the other task, allowing cross-project relation removal",
"details" : "## Summary\n\nDeleting a task relation only requires write access on the base task. Unlike relation creation, it does not verify that the caller can read the other task. A user with write access to one project can therefore delete relations whose other end lives in a project they have no access to. Since the delete removes both the forward and inverse rows, the relation also disappears for the other project's members.\n\n## Details\n\n`TaskRelation.CanCreate` (`pkg/models/task_relation_permissions.go:32-52`) requires write access on `TaskID` **and** read access on `OtherTaskID`.\n\n`TaskRelation.CanDelete` (`pkg/models/task_relation_permissions.go:25-29`) only checks `Task{ID: rel.TaskID}.CanUpdate(s, a)`; `OtherTaskID` is never authorized.\n\n`TaskRelation.Delete` (`pkg/models/task_relation.go:314-354`) then deletes both the `(task_id, other_task_id, kind)` row and its inverse, so the relation is removed from the far task as well.\n\nAffects `DELETE /api/v1/tasks/{id}/relations/{kind}/{otherTaskId}` and the equivalent v2 endpoint.\n\n## Impact\n\nLow, integrity only. An authenticated user holding write permission on a shared project can remove task relations that link into projects they cannot read. No data is disclosed and no privilege is gained; the attacker cannot recreate the relation. The far project's owner sees the relation vanish without indication of who removed it.\n\nPreconditions: the attacker has write access to a project containing a task that is already related to a task in a project they cannot access.\n\n## Proof of Concept\n\n1. As `owner`, create project `P_near` with task `near` and project `P_far` with task `far`.\n2. Share `P_near` with `attacker` at write permission (`permission: 1`). Do not share `P_far`.\n3. As `owner`: `PUT /api/v1/tasks/{near}/relations` with `{\"other_task_id\": far, \"relation_kind\": \"related\"}` -> 200.\n4. As `attacker`: `GET /api/v1/tasks/{far}` -> 403 (confirms no access).\n5. As `attacker`: `PUT /api/v1/tasks/{near}/relations` with the same body -> 403 (create path is enforced).\n6. As `attacker`: `DELETE /api/v1/tasks/{near}/relations/related/{far}` -> 200 `\"Successfully deleted.\"`\n7. As `owner`: `GET /api/v1/tasks/{far}` -> `related_tasks` is now empty.\n\nReproduced against `vikunja/vikunja:2.5.0`.\n\n## Recommended Fix\n\nMake `CanDelete` mirror `CanCreate`: after checking `CanUpdate` on the base task, also require `CanRead` on `OtherTaskID`.",
"severity" : [ {
"type" : "CVSS_V4",
"score" : "CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "Go",
"name" : "code.vikunja.io/api"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0.9"
}, {
"fixed" : "2.6.0"
} ]
} ],
"database_specific" : {
"last_known_affected_version_range" : "<= 2.5.0"
}
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/go-vikunja/vikunja/security/advisories/GHSA-w2ch-4xgr-22ww"
}, {
"type" : "WEB",
"url" : "https://github.com/go-vikunja/vikunja/pull/3688"
}, {
"type" : "WEB",
"url" : "https://github.com/go-vikunja/vikunja/commit/077dc4de79ce6f1ab59215a2c7bf9b30423685f2"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/go-vikunja/vikunja"
}, {
"type" : "WEB",
"url" : "https://github.com/go-vikunja/vikunja/releases/tag/v2.6.0"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-285", "CWE-862" ],
"severity" : "LOW",
"github_reviewed" : true,
"github_reviewed_at" : "2026-10-09T20:54:52Z",
"nvd_published_at" : null
}
}