CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-33678
8.10.03%

CVE-2026-33678: Insecure Direct Object Reference in Vikunja Task Attachments

Alon Barad
Alon Barad
Software Engineer

Mar 26, 2026·6 min read·2 visits

No Known Exploit

Executive Summary (TL;DR)

An IDOR in Vikunja's attachment endpoint allows low-privileged attackers to read or delete any file on the instance by enumerating sequential attachment IDs.

Vikunja versions prior to 2.2.1 suffer from a critical Insecure Direct Object Reference (IDOR) vulnerability in the task attachment API. The flaw allows authenticated attackers to bypass authorization controls and systematically read or delete arbitrary file attachments across the entire application instance.

Vulnerability Overview

Vikunja is an open-source self-hosted task management platform that provides REST API endpoints for managing tasks and associated attachments. CVE-2026-33678 identifies an Insecure Direct Object Reference (IDOR) vulnerability within the attachment handling logic of this API. The vulnerability allows authenticated users to bypass authorization checks and interact with file attachments belonging to tasks outside their authorized scope.

The core issue resides in the API endpoint responsible for retrieving and managing task attachments. The system relies on predictable, sequential integer identifiers for file attachments. When a user requests a specific attachment, the application fails to adequately verify the relationship between the authenticated user, the specified task, and the requested file.

This failure results in an authorization bypass classified under CWE-639. An attacker with standard user privileges can enumerate these sequential identifiers to systematically exfiltrate or delete files across the entire application instance. The vulnerability affects Vikunja installations running versions prior to 2.2.1.

Root Cause Analysis

The vulnerability originates in the data retrieval logic of the TaskAttachment.ReadOne() function. When a client requests an attachment via the /api/v1/tasks/{taskID}/attachments/{attachmentID} endpoint, the application performs a preliminary access control check. This CanRead() check strictly validates whether the authenticated user holds sufficient permissions to view the taskID specified in the URL path.

However, the application architecture fails to carry this authorization context forward into the data retrieval phase. The ReadOne() function constructs a database query using exclusively the attachmentID provided in the request payload. The underlying SQL query translates to an equivalent of SELECT * FROM attachments WHERE id = ?, explicitly omitting any condition that binds the attachment to the authorized taskID.

Consequently, the preliminary authorization check only serves as a gateway requirement. Once the application confirms the user can access the provided taskID, it blindly fetches the requested attachmentID from the database. The system then returns the resulting file or executes the requested deletion, creating a classical Insecure Direct Object Reference condition.

Code Analysis

The vulnerability manifests in the separation between the HTTP handler's authorization middleware and the data layer's fetching logic. The vulnerable implementation retrieves records based solely on the primary key, disregarding the foreign key relationship that enforces data boundaries.

// Vulnerable implementation concept
func (ta *TaskAttachment) ReadOne() error {
    // The query only filters by the attachment ID
    return db.Where("id = ?", ta.ID).First(ta).Error
}

The mitigation implemented in Vikunja version 2.2.1 corrects this behavior by binding the requested object to its parent container during the database query. The patch modifies the ReadOne() function to require both the primary key and the associated foreign key.

// Patched implementation concept
func (ta *TaskAttachment) ReadOne() error {
    // The query now enforces the relationship between attachment and task
    return db.Where("id = ? AND task_id = ?", ta.ID, ta.TaskID).First(ta).Error
}

This explicit binding ensures that even if an attacker supplies an arbitrary attachment ID, the database engine will yield an empty result set unless the attachment genuinely belongs to the authorized task. This effectively neutralizes the IDOR attack vector at the data layer.

Exploitation and Attack Methodology

Exploitation of this vulnerability requires the attacker to possess a valid authentication token and access to at least one task within the target Vikunja instance. The attacker identifies their valid task ID, for example, Task ID 100. They then construct an HTTP request targeting the attachment endpoint, placing their valid task ID in the path and an arbitrary target attachment ID at the end.

GET /api/v1/tasks/100/attachments/5 HTTP/1.1
Host: target-vikunja-instance.local
Authorization: Bearer <attacker_token>

Because the attachment identifiers are generated as sequential integers, the attacker can automate this process. Using a script, the attacker increments the target attachment ID, sequentially downloading or deleting files stored on the server. The application consistently validates access against Task 100, subsequently serving the file associated with the incremented ID.

Furthermore, this vulnerability supports chaining with CVE-2026-33680, a link share hash disclosure flaw. CVE-2026-33680 permits an unauthenticated attacker to obtain valid task context from a read-only share link. An attacker can leverage this disclosed task hash to satisfy the initial CanRead() requirement, subsequently exploiting CVE-2026-33678 without any authenticated account on the system.

Impact Assessment

The primary impact of this vulnerability is a total compromise of confidentiality and integrity for all file attachments stored within the Vikunja instance. The CVSS v3.1 base score of 8.1 reflects the severity of this exposure, specifically highlighting the high impacts on both confidentiality and integrity metrics.

An attacker successfully exploiting this flaw gains unauthorized read access to sensitive documents, images, and data files uploaded by any user across the platform. This data exfiltration occurs without generating immediate alerts, as the requests rely on standard application API patterns and legitimate user sessions.

Additionally, the attacker can issue HTTP DELETE requests to the same endpoint. This allows for the systematic destruction of all attachments across the system. The lack of complex prerequisites and the predictable nature of sequential IDs result in an exceptionally low barrier to entry for weaponization.

Remediation and Mitigation

The immediate and primary remediation strategy is upgrading the Vikunja installation to version 2.2.1 or later. This version contains the necessary logic changes to enforce authorization boundaries during data retrieval operations. Administrators should apply this patch systematically according to their deployment method.

If immediate patching is technically unfeasible, administrators can deploy detection mechanisms to identify ongoing exploitation attempts. Security Information and Event Management (SIEM) systems or Web Application Firewalls (WAF) should monitor for high-frequency requests targeting the /api/v1/tasks/*/attachments/* endpoint.

Specifically, detection logic should flag sessions or IP addresses that request multiple distinct attachment IDs within a short timeframe while reusing the same task ID in the URL path. This access pattern is highly anomalous for legitimate user behavior and serves as a strong indicator of sequential ID enumeration.

Official Patches

go-vikunjaOfficial Security Advisory

Technical Appendix

CVSS Score
8.1/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
EPSS Probability
0.03%
Top 92% most exploited

Affected Systems

Vikunja API Server < 2.2.1

Affected Versions Detail

Product
Affected Versions
Fixed Version
Vikunja
go-vikunja
< 2.2.12.2.1
AttributeDetail
CWE IDCWE-639
Attack VectorNetwork
CVSS Score8.1
EPSS Score0.00028
Exploit StatusNone
KEV StatusNot Listed
ImpactConfidentiality, Integrity

MITRE ATT&CK Mapping

T1083File and Directory Discovery
Discovery
T1213Data from Information Repositories
Collection
T1071.001Application Layer Protocol: Web Protocols
Command and Control
CWE-639
Authorization Bypass Through User-Controlled Key

The system's authorization mechanism does not properly enforce access controls based on the relationship between the requested object and the provided identifier.

Vulnerability Timeline

Vikunja version 2.2.0 released
2026-03-20
Vulnerability reported and fixed in version 2.2.1
2026-03-23
CVE-2026-33678 officially published
2026-03-24
Research analysis completed
2026-03-25

References & Sources

  • [1]GitHub Security Advisory GHSA-jfmm-mjcp-8wq2
  • [2]Vikunja Changelog
  • [3]CVE.org Record for CVE-2026-33678
  • [4]NVD Entry for CVE-2026-33678
  • [5]Combined Chain Advisory
Related Vulnerabilities
CVE-2026-33680

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.