GHSA-8wvg-r2j4-3737 json
Vikunja: Assignee email addresses disclosed to read-only project members via the task assignees endpoint
published 2026-10-09 30 d ago modified 2026-10-19 20 d ago also GO-2026-6723
- cvss
- —
- not scored
- cisa kev
- Not listed
- not in CISA's catalog
- epss
- —
- no score, EPSS covers CVEs only
- public exploits
- 0
- none known
Summary
### Summary `TaskAssginee.ReadAll` returns assignee user objects without blanking the `Email` field, disclosing assignee email addresses to any read-only project member. Every sibling path that returns user objects obfuscates the email; this one does not.
### Details `pkg/models/task_assignees.go` (~lines 306-344) does `Select("users.*")` and returns the result directly. `User.Email` is `json:"email,omitempty"`, so a non-empty value always serializes. The endpoint gates on `task.CanRead`, so a read-only member passes. Sibling paths blank the field: `pkg/models/tasks.go:530`, `pkg/models/project_users.go:216`, `pkg/models/teams.go:177`, `pkg/models/label_task.go:312`, `pkg/models/task_attachment.go:511`. The omission here reads as an oversight, not a decision.
The same file's `getRawTaskAssigneesForTasks` (~line 56) also selects `users.*` but is safe because its only caller (`addAssigneesToTasks`) blanks the email afterwards.
### PoC (verified at runtime against v2.5.0, v1 and v2) ``` GET /api/v1/tasks/{id}/assignees (reader with permission:0) -> [{"id":37,"username":"...","email":"assignee+SECRET@example.test", ...}] ``` Same leak on `GET /api/v2/tasks/{id}/assignees` (routes through the identical model method). Contrast: `GET /api/v1/projects/{id}/projectusers` and the project task-embed both return the same users with no email.
### Impact Disclosure of assignees' email addresses to users who should only see usernames. Read-only.
### Fix Blank `Email` on each returned user in `TaskAssginee.ReadAll` before returning, matching the sibling paths. Covers v1 and v2 at once.
Patch / fix
- go code.vikunja.io/api 2.6.0
- github.com/go-vikunja/vikunja#3688 pull request
- github.com/go-vikunja/vikunja/releases/tag/v2.6.0 release
Affected packages
| ecosystem | package | affected | fixed in |
|---|---|---|---|
| go | code.vikunja.io/api | <2.6.0 all versions |
2.6.0 |
Classification
- Weakness
-
- CWE-200 Exposure of Sensitive Information to an Unauthorized Actor
References
Sources
- GitHub Advisory GHSA-8wvg-r2j4-3737
- OSV GO-2026-6723
Fencer Vulns keeps one entry per vulnerability: the CVE id wins, then GHSA, and records that alias each other are merged, except that two CVEs always keep separate entries. The same data is available as JSON.