Summary
CVE-2026-91972 is an improper restriction of excessive authentication attempts (CWE-307) affecting Vikunja, the open-source to-do/project management application, in all versions before 2.6.0. The public, pre-authentication API v2 endpoints (login, registration, password-reset token issuance, and OAuth token) are not subject to the application’s default anti-brute-force rate limit, unlike their functionally identical v1 counterparts. The issue is rated HIGH severity and allows unauthenticated attackers to conduct unbounded credential-guessing, account-enumeration, and password-reset-flooding attacks against a default (stock) installation.
Technical details
- Root cause: Vikunja’s route registration for the v2 API (
registerAPIRoutesV2) never applies the unconditional, always-on per-IP rate limiter (unauthRateLimit()) to its public routes — that limiter is wired only to the/api/v2/wswebsocket route. The v2 public auth routes instead rely solely onsetupRateLimit, a configurable limiter that registers no throttling whenratelimit.enabledis left at its default value offalse. - Trigger conditions: A stock/default Vikunja install (rate limiting not explicitly enabled) exposing the v2 API. No authentication or special privileges are required to exploit the issue.
- Attack vector: Network — an attacker sends repeated unauthenticated HTTP requests directly to
/api/v2/login,/api/v2/register,/api/v2/user/password/token, and the OAuth token route. Requests reach the application handlers (returning 403/404 for invalid attempts) rather than being blocked, and no 429 (rate-limited) responses are ever issued, in contrast to the equivalent v1 routes. - Impact: Attackers can perform unthrottled password-guessing (brute force) against user accounts, enumerate valid usernames/accounts, and flood the password-reset flow — undermining the instance’s only default anti-abuse control. The vendor classifies this as an authentication-control bypass rather than a denial-of-service issue.
Affected software
- Vikunja (
code.vikunja.io/api, go-vikunja) — all versions prior to 2.6.0 (confirmed present through 2.5.0) - Fixed in version 2.6.0 and later
Severity
- CVSS v3.1: 7.5 (HIGH) —
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - CVSS v4.0: 8.7 (HIGH) —
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Mitigation and recommended actions
- Immediate: Upgrade Vikunja to version 2.6.0 or later, which applies the unconditional pre-auth rate limiter to the v2 public routes to match v1 behavior.
- If patching is not immediately possible:
- Explicitly enable and configure Vikunja’s rate-limiting feature (
ratelimit.enabled) rather than relying on defaults, and verify it applies to v2 routes. - Place a reverse proxy or web application firewall in front of the instance to enforce IP-based rate limiting on
/api/v2/login,/api/v2/register,/api/v2/user/password/token, and OAuth token endpoints. - Monitor authentication and password-reset endpoints for high-volume or repeated failed requests indicative of credential-guessing or enumeration activity.
- Restrict direct internet exposure of the API where feasible until patched.
- Explicitly enable and configure Vikunja’s rate-limiting feature (

