Read the docs
TI-2026-70312 Aliases GHSA-8wvg-r2j4-3737

Vikunja assignee email addresses exposed to read-only project members

Priority LOW 38CWE-200Published · Updated

Key facts

Attack vector
—
Privileges required
—
User interaction
—
Attack complexity
—
Impact type
Information disclosure
Confidentiality · integrity · availability
—
Fix status
Fixed

No CVSS vector from any source. Fix status from GitHub. Impact type from CWE-200.

Summary

Vikunja, a Go module code.vikunja.io/api from 0 before 2.6.0, returns assignee user objects from the task assignees endpoint with their email addresses still filled in. Any read-only project member can see the email addresses of assignees, although sibling endpoints blank the field (CWE-200). The endpoint only checks that the requester can read the task, so read-only access is enough to see the emails.

Written with Claude Haiku 5.5 from the sources below · 2026-10-29

Description from the GitHub advisory

### 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":"[email protected]", ...}] ``` 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.

Why it matters now

Fix Fixed code.vikunja.io/api (Go): 2.6.0

SSVC decision points

Not available: CISA has not published SSVC decision points for this record.

Affected products

VendorProductAffected versionsFixed inStatusSource
—code.vikunja.io/api (Go)before 2.6.02.6.0Patch availableGHSA-8wvg-r2j4-3737
  • code.vikunja.io/api (Go) Vendor— Affected before 2.6.0 Fixed in 2.6.0 Patch available GHSA-8wvg-r2j4-3737

Remediation

Upgrade code.vikunja.io/api to version 2.6.0 or later, which blanks the email field on returned assignees.

Written with Claude Haiku 5.5 from the sources below · 2026-10-29

  • Fix · GHSA-8wvg-r2j4-3737 code.vikunja.io/api (Go) Fixed in 2.6.0 Advisory →

Timeline

  1. 2026-10-10 Threatist record created from GHSA-8wvg-r2j4-3737

References

Sources

This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences