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-33680

CVE-2026-33680: Permission Escalation via Link Share Hash Disclosure in Vikunja

Amit Schendel
Amit Schendel
Senior Security Researcher

Mar 26, 2026·8 min read·121 visits

Executive Summary (TL;DR)

Improper authorization in Vikunja's link-sharing API exposes admin hashes to read-only users, leading to full project takeover.

Vikunja versions prior to 2.2.2 suffer from an improper authorization vulnerability in the link-sharing mechanism. The ReadAll API endpoint fails to validate permissions correctly, allowing an attacker with a read-only link share to extract authentication hashes for administrative shares. This flaw enables unauthenticated or low-privilege actors to escalate their access to full administrative control over a target project.

Vulnerability Overview

Vikunja is an open-source, self-hosted task management platform that allows users to organize projects, track tasks, and collaborate. A core collaboration feature is the ability to generate link shares, which grant external users varying levels of access to specific projects without requiring a full user account. These link shares range from read-only access to full administrative control.

CVE-2026-33680 identifies an improper authorization vulnerability (CWE-285) within the API endpoints responsible for managing these link shares. The system fails to correctly validate permissions when a user requests a list of all active shares for a given project. Because the authorization logic is inconsistently applied across different handler functions, the system processes requests that should normally be rejected.

The core of the issue lies in the disclosure of sensitive authentication material. In Vikunja, the hash associated with a link share acts as a bearer token; possession of the hash grants the associated permissions. By exploiting this vulnerability, an attacker possessing only a read-only token can retrieve the hashes for all other shares, enabling immediate privilege escalation to project administrator.

Root Cause Analysis

The root cause of this vulnerability involves a structural discrepancy between how Vikunja handles single-resource retrieval versus multiple-resource listing within its API abstraction layer. The ReadOneWeb handler, which processes requests for a specific link share, explicitly invokes the model's CanRead() method. This method acts as a dedicated authorization gate, correctly blocking users authenticated via link shares from viewing detailed share metadata.

Conversely, the ReadAllWeb generic handler, responsible for processing requests to list resources, omits this explicit CanRead() invocation. Instead of enforcing authorization at the handler level, ReadAllWeb delegates the responsibility entirely to the underlying LinkSharing model's ReadAll() implementation. This architectural decision creates a critical gap where generic listing requests bypass the standard permission boundary.

Within the LinkSharing model, the ReadAll() method implements an insufficient authorization check. The original logic merely verified if the current session possessed project-level read access via the Project.CanRead() function. Because link-share users inherently require read access to the project to view tasks, they easily pass this verification step.

Consequently, the API constructs a JSON response containing an array of all LinkSharing objects associated with the project. Crucially, the data serialization includes the Hash field for each share. The exposure of this field transforms a logical access control flaw into a direct credential leak.

Code Analysis and Patch Review

The remediation strategy deployed in version 2.2.2 addresses the vulnerability through a multi-layered approach, directly modifying the authorization requirements within the model. The primary backend fix, implemented in commit 9efe1fadba817923c7c7f5953c3e9e9c5683bbf3, introduces an explicit identity validation mechanism at the beginning of the LinkSharing.ReadAll() method.

// Abstract representation of the patch logic in LinkSharing.ReadAll()
if _, isLinkShare := identity.(*LinkSharing); isLinkShare {
    return nil, 0, ErrUnauthorized{}
}

This modification strictly rejects any session where the authenticated entity is a *LinkSharing type, immediately terminating the listing process for link-share users regardless of their project-level read access. This effectively blocks the primary exploitation vector by preventing link-share tokens from interacting with the share-listing functionality entirely.

A subsequent commit, 5cd5dc409bfc807f79dac5e4ef4aec54b6efd6e2, further tightens the authorization logic by altering the project-level permission check within the same ReadAll() method. The check was upgraded from verifying Project.CanRead to requiring Project.IsAdmin. This change ensures that only users with explicit administrative privileges over the project, rather than mere view access, can enumerate the project's active shares and their corresponding hashes.

Complementing the backend patches, commit 74d1bddb3ab32fc8983d778bb65e89b1d50227d6 introduces a frontend mitigation. The user interface was updated to conditionally hide the link sharing management section from users lacking administrative permissions. While frontend hiding is not a primary security control, it reduces the visibility of the vulnerable functionality and establishes defense-in-depth by preventing legitimate low-privileged users from inadvertently discovering the endpoint.

Exploitation Methodology

Exploitation of CVE-2026-33680 requires an attacker to possess or obtain a valid read-only link share hash for a target project. These hashes are frequently distributed via public channels, embedded in documentation, or shared via email to grant stakeholders limited visibility into task progress. Once a hash is acquired, the attacker initiates the exploitation chain by authenticating against the link-share API endpoint.

The attacker sends a POST request to /api/v1/shares/READ_ONLY_HASH/auth. The Vikunja backend validates the hash and returns a JSON Web Token (JWT) representing the read-only session. This token is subsequently injected into the HTTP Authorization header as a Bearer token for all subsequent API requests.

curl -s -X POST http://<vikunja-instance>/api/v1/shares/<READ_ONLY_HASH>/auth | jq '.token'

With a valid read-only JWT, the attacker targets the ReadAll endpoint for the project's shares. By executing a GET request to /api/v1/projects/<project_id>/shares, the attacker leverages the missing authorization check. The backend processes the request and returns an array of JSON objects representing every active share for the project.

curl -s -H "Authorization: Bearer <read-only-jwt>" \
  http://<vikunja-instance>/api/v1/projects/<project_id>/shares | jq '.[].hash, .[].permission'

The attacker parses the JSON response to identify shares with a permission level of 2, indicating administrative access. By extracting the corresponding Hash value from these objects, the attacker obtains an administrative token. The final step involves authenticating against the /auth endpoint using the newly acquired admin hash, resulting in the issuance of a JWT that grants complete administrative control over the project and its associated resources.

Impact Assessment

The impact of CVE-2026-33680 is categorized as high, primarily due to the severe confidentiality breach that leads directly to complete privilege escalation. The vulnerability is assigned a CVSS v3.1 base score of 7.5, reflecting a network-exploitable flaw that requires no special privileges or user interaction. The attack vector is strictly remote, and the complexity of exploitation is low.

The fundamental issue is the exposure of secret bearer tokens. In Vikunja's architecture, the link share hash functions as both an identifier and a password. Disclosing these hashes to unauthorized parties constitutes a total compromise of the link-sharing security model. An attacker gaining access to an administrative hash bypasses all intended access controls for the affected project.

Upon successfully escalating privileges using a leaked administrative hash, the attacker achieves comprehensive control over the project environment. While the CVSS vector strictly lists the impact as High for Confidentiality and None for Integrity and Availability, the indirect consequences of this disclosure are significant. An attacker operating with a compromised administrative token possesses the capability to arbitrarily modify project tasks, alter configurations, revoke access for legitimate users, or entirely delete the project and its associated data.

Despite the severity of the vulnerability, the Exploit Prediction Scoring System (EPSS) assigns it a score of 0.0003 (0.03%), placing it in the 8.51st percentile. This indicates a very low historical probability of imminent, widespread exploitation in the wild. The low probability is likely due to the prerequisite requirement of obtaining an initial read-only link share and the specific, targeted nature of self-hosted Vikunja deployments.

Remediation and Mitigation

The vendor addressed the vulnerability in Vikunja version 2.2.2. Organizations operating self-hosted instances of Vikunja must prioritize updating to this version or a later release. The update replaces the vulnerable authorization logic and implements strict type checking to prevent link-share authenticated sessions from accessing the share listing endpoint.

Administrators should execute a comprehensive review of all active link shares across their projects. Because exploitation leaves minimal traces beyond standard API access logs, determining if a specific instance has been compromised requires careful log analysis. Security personnel should examine access logs for requests to the /api/v1/projects/*/shares endpoint originating from IP addresses associated with known link-share tokens, particularly if those requests are immediately followed by administrative authentication attempts.

If patching cannot be performed immediately, mitigation strategies are limited due to the structural nature of the vulnerability. Organizations can implement Web Application Firewall (WAF) rules to detect and block access to the /api/v1/projects/*/shares endpoint if the request includes a JWT associated with a link-share identity, although this requires advanced WAF configuration and deep packet inspection of the JWT payload.

As a precautionary measure, organizations that suspect unauthorized access or have operated vulnerable instances in untrusted environments should strongly consider revoking all existing link shares. Regenerating the shares and distributing new hashes will invalidate any tokens potentially acquired by attackers during the vulnerability window, ensuring that previously exposed administrative hashes are rendered useless.

Official Patches

VikunjaVikunja v2.2.2 Changelog
GitHubGitHub Advisory (GHSA-8hp8-9fhr-pfm9)

Fix Analysis (3)

Technical Appendix

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

Affected Systems

Vikunja open-source task management platform

Affected Versions Detail

Product
Affected Versions
Fixed Version
Vikunja
Vikunja
< 2.2.2-
AttributeDetail
CWE IDCWE-285
CVSS v3.17.5 (High)
Attack VectorNetwork
ImpactHigh (Confidentiality, Integrity, Availability via Admin Escalation)
Exploit StatusProof-of-Concept (PoC) available
EPSS Score0.03% (Percentile: 8.51%)

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1068Exploitation for Privilege Escalation
Privilege Escalation
T1552.004Unsecured Credentials: Private Keys
Credential Access
CWE-285
Improper Authorization

Improper Authorization occurs when an application does not appropriately verify whether the user is authorized to access the requested resource.

Vulnerability Timeline

Patch developed and released in version 2.2.2
2026-03-23
CVE-2026-33680 published to NVD and CVE.org
2026-03-24
EPSS score generated
2026-03-25

References & Sources

  • [1]https://github.com/go-vikunja/vikunja/security/advisories/GHSA-8hp8-9fhr-pfm9
  • [2]https://vikunja.io/changelog/vikunja-v2.2.2-was-released
  • [3]https://nvd.nist.gov/vuln/detail/CVE-2026-33680
  • [4]https://github.com/go-vikunja/vikunja/commit/9efe1fadba817923c7c7f5953c3e9e9c5683bbf3
  • [5]https://github.com/go-vikunja/vikunja/commit/5cd5dc409bfc807f79dac5e4ef4aec54b6efd6e2

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.

More Reports

•41 minutes ago•CVE-2026-88968
7.7

CVE-2026-88968: TOCTOU Race Condition in Claude Code Edit Tool Allows Arbitrary File Overwrite

Claude Code prior to version 2.1.251 contains a Time-of-Check to Time-of-Use (TOCTOU) race condition in its internal file manipulation tools (Edit, Write, Read). Because path validation was performed using string-based pathname and symbolic link resolution without binding to the underlying directory inodes or open file descriptors, a process running concurrently inside the macOS Bash sandbox can atomically replace an in-workspace directory with a symbolic link after validation passes. This causes the unsandboxed main process to follow the symlink and overwrite user-writable files outside the permitted workspace boundary.

Alon Barad
Alon Barad
3 views•9 min read
•about 2 hours ago•CVE-2026-88982
5.4

CVE-2026-88982: Cross-Tenant Execution Cache Poisoning and Output Substitution in Kubeflow Pipelines

CVE-2026-88982 (GHSA-2xwh-426q-42c5) is an authorization bypass and data integrity vulnerability affecting Kubeflow Pipelines versions prior to 2.18.0. The flaw resides in the legacy V1 and raw-Argo execution caching mutating admission webhook and the associated cache-server storage backend. In multi-tenant deployments where namespaces share a centralized cache service, execution cache keys were derived solely from container specification fields without incorporating the workload's Kubernetes namespace. Additionally, the cache watcher trusted mutable pod annotations when persisting execution outputs. Consequently, an authenticated user with workload submission privileges in one tenant namespace can poison cached step outputs consumed by other tenants or read cached outputs generated by workloads in separate namespaces.

Amit Schendel
Amit Schendel
7 views•12 min read
•about 3 hours ago•CVE-2026-88983
5.0

CVE-2026-88983: Authenticated Server-Side Request Forgery in Kubeflow Pipelines API Server

CVE-2026-88983 is an authenticated Server-Side Request Forgery (SSRF) vulnerability affecting the Kubeflow Pipelines API server in versions prior to 2.17.0. When an authenticated user creates a pipeline or pipeline version using a remote specification URI, the backend server retrieves the document via Go's default HTTP client without validating the target scheme, hostname, port, or IP address. Because the API server reflects remote connection errors and HTTP status codes in its response, an attacker with pipeline creation permissions can exploit the server as a status-code and port-scanning oracle against Kubernetes cluster-internal services, private networks, and cloud metadata endpoints.

Amit Schendel
Amit Schendel
4 views•11 min read
•about 4 hours ago•CVE-2026-88985
6.5

CVE-2026-88985: SQL Injection via Pagination Token Deserialization and Metric Sorting in Kubeflow Pipelines API Server

CVE-2026-88985 is a SQL injection vulnerability (CWE-89) in the Kubeflow Pipelines (KFP) API server prior to version 2.17.0. The flaw stems from the untrusted deserialization of base64-encoded JSON pagination tokens (page_token) and the direct concatenation of metric names during run list sorting. Authenticated users with permissions to invoke REST or gRPC list endpoints can inject arbitrary SQL syntax into structural query identifiers and JOIN predicates, enabling unauthorized cross-tenant read access to all database records accessible by the API server.

Alon Barad
Alon Barad
3 views•10 min read
•about 5 hours ago•CVE-2026-88986
6.1

CVE-2026-88986: Reflected Cross-Site Scripting in Kubeflow Pipelines Frontend Error Responses

A reflected Cross-Site Scripting (XSS) vulnerability exists in the Kubeflow Pipelines frontend server prior to version 2.15.0. Specifically, the Express route handlers for '/pipeline/k8s/pod' and '/pipeline/k8s/pod/events' reflect unvalidated 'podname' and 'podnamespace' query parameters, along with backend Kubernetes API error messages, directly into HTML-capable HTTP error responses. An unauthenticated attacker can exploit this flaw by convincing an authenticated user to visit a crafted URL, resulting in arbitrary JavaScript execution within the context of the Kubeflow Pipelines frontend origin.

Alon Barad
Alon Barad
6 views•10 min read
•about 6 hours ago•CVE-2026-88984
7.2

CVE-2026-88984: RBAC Authorization Bypass in Kubeflow Pipelines Multi-User API Server

CVE-2026-88984 (GHSA-ghgh-57qv-h687) is an incorrect authorization vulnerability affecting Kubeflow Pipelines (KFP) prior to version 2.16.1 in multi-user deployments. The multi-user API server treats the empty Kubernetes namespace associated with shared or global pipelines as an unconditional authorization exception across all API verbs. Consequently, any authenticated user can modify, overwrite, or delete shared pipeline definitions and pipeline versions without possessing the required Kubernetes RBAC permissions, compromising the integrity and availability of global machine learning workflows.

Amit Schendel
Amit Schendel
5 views•10 min read