CVE-2026-91972

CVE-2026-91972 is a high-severity security vulnerability in code.vikunja.io/api (go), affecting versions <= 2.5.0. It is fixed in 2.6.0.

Does this CVE actually affect you?

Kodem shows which CVEs are reachable and running in your applications, so you fix what's exploitable, not just what's listed.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Runtime intelligence, not another scanner.

Summary

Vikunja: Every /api/v2 pre-auth endpoint is unthrottled on a stock install while its /api/v1 twin is rate limited

registerAPIRoutesV2 never applies the unconditional pre-auth rate-limit floor (unauthRateLimit()) to the v2 public routes, it passes that limiter only to /api/v2/ws, and otherwise relies on setupRateLimit, which registers nothing when ratelimit.enabled is false (the default). So on a stock install every v2 pre-auth endpoint (login, register, password-reset token, oauth token) is unthrottled, while its v1 twin is throttled.

Details

unauthRateLimit() -> perMinuteIPRateLimit("noauth", RateLimitNoAuthRoutesLimit) (pkg/routes/rate_limit.go, ~lines 100-118) is an unconditional per-IP floor (default 10/60s) that deliberately ignores RateLimitEnabled, which is why v1's pre-auth routes are throttled even with the global limiter off. v1 applies it: ur := a.Group(""); ur.Use(unauthRateLimit()) (pkg/routes/routes.go ~line 459). registerAPIRoutesV2 (~lines 405-431) passes the unauthRateLimit() instance only to /api/v2/ws; its auth routes get only setupRateLimit(a, ...), which is config-gated and registers nothing by default.

PoC (verified at runtime against v2.5.0)

POST /api/v1/login              x25 -> 429 from attempt 5
POST /api/v2/login              x25 -> 403 x25, 429 x0
POST /api/v1/user/password/token     -> 429 (throttled)
POST /api/v2/user/password/token x20 -> 404 x20, 429 x0

Request bodies are byte-identical across versions (shared user.Login / user.PasswordTokenRequest). Both v2 endpoints reach their handlers (403/404, not route-404), so the comparison is valid.

Impact

The pre-auth rate-limit floor, the instance's only default anti-brute-force / anti-abuse control, is absent on all v2 public endpoints. Enables unbounded credential guessing, account-enumeration probing, and password-reset flooding on a default install. Reported as an authentication-control bypass, not a DoS.

Affected versions

code.vikunja.io/api (<= 2.5.0)

Security releases

code.vikunja.io/api → 2.6.0 (go)

Kodem intelligence

Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.

Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.

Already deployed Kodem?

See it in your environmentNew to Kodem? Get a demo →

Remediation advice

Apply unauthRateLimit() to the v2 public route group, matching v1.

Frequently Asked Questions

  1. What is CVE-2026-91972? CVE-2026-91972 is a high-severity security vulnerability in code.vikunja.io/api (go), affecting versions <= 2.5.0. It is fixed in 2.6.0.
  2. Which versions of code.vikunja.io/api are affected by CVE-2026-91972? code.vikunja.io/api (go) versions <= 2.5.0 is affected.
  3. Is there a fix for CVE-2026-91972? Yes. CVE-2026-91972 is fixed in 2.6.0. Upgrade to this version or later.
  4. Is CVE-2026-91972 exploitable, and should I be worried? Whether CVE-2026-91972 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
  5. What actually determines whether CVE-2026-91972 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
  6. How do I fix CVE-2026-91972? Upgrade code.vikunja.io/api to 2.6.0 or later.

Other vulnerabilities in code.vikunja.io/api

Stop the waste.
Protect your environment with Kodem.