{"id":"CVE-2026-91972","kind":"vulnerability","aliases":["CVE-2026-91972","GHSA-6rvj-qwjf-3m4q","GO-2026-6721"],"related":[],"title":"Vikunja: Every /api/v2 pre-auth endpoint is unthrottled on a stock install while its /api/v1 twin is rate limited in code.vikunja.io/api","description":"Vikunja: Every /api/v2 pre-auth endpoint is unthrottled on a stock install while its /api/v1 twin is rate limited in code.vikunja.io/api.\n\nNOTE: The source advisory for this report contains additional versions that could not be automatically mapped to standard Go module versions.\n\n(If this is causing false-positive reports from vulnerability scanners, please suggest an edit to the report.)\n\nThe additional affected modules and versions are: code.vikunja.io/api before v2.6.0.","summary":"Vikunja <= 2.5.0 does not apply the unconditional pre-auth per-IP rate limit (unauthRateLimit, default 10/60s) to /api/v2 public routes (login, register, password-reset token, oauth token). v1 twins are throttled, but v2 relies on the global limiter, which is off by default. A stock install allows unlimited password guessing, account enumeration and reset flooding. Fixed in 2.6.0.","severity":"high","cvss":8.7,"epss":0.00633,"exploited":false,"exploited_at":null,"products":[{"name":"code.vikunja.io/api","fixed":[],"affected":"all versions","ecosystem":"go"},{"name":"code.vikunja.io/api","fixed":["2.6.0"],"affected":"<= 2.5.0","ecosystem":"go"}],"ecosystems":["go"],"tags":["go","package","rate-limiting","self-hosted","vikunja"],"not_affected_if":["default-config","fixed-2.6.0","managed-hosting"],"how_to_check":"Check the version: GET /api/v1/info, or run vikunja version. Anything <= 2.5.0 is affected. Test: send about 25 POST requests to /api/v2/login. If you never get a 429, the endpoint is unthrottled; v1 returns 429 from about the 5th attempt. govulncheck will not flag this because the Go DB entry uses unmapped custom versions.","fix":"Upgrade Vikunja to 2.6.0 or later. Until then, rate limit /api/v2/login, /api/v2/register, /api/v2/user/password/token and the oauth token route at the reverse proxy, or block /api/v2 pre-auth paths if unused.","status":"open","published_at":"2026-09-15T16:17:54+00:00","first_seen_at":"2026-10-23T19:13:08+00:00","triaged_at":"2026-10-23T21:44:03+00:00","updated_at":"2026-10-23T21:44:34+00:00","category":"package","confidence":0.85,"triage":{"at":"2026-10-23T21:44:03Z","model":"claude-haiku-5-5","output":{"fix":"Upgrade code.vikunja.io/api to v2.6.0 or later, per the affected-versions note in the sources; confirm the exact fixed version against the advisory.\nunknown","reach":"internet","impact":"medium","summary":"Vikunja's /api/v2 endpoints that do not require login have no rate limiting on a stock install, while the matching /api/v1 endpoints do. An attacker can send unlimited requests to these endpoints, such as login or password-guessing paths, without being throttled.","category":"package","who_cares":["vikunja","go","self-hosted"],"confidence":0.6,"needs_auth":"no","worst_case":"unthrottled pre-auth API endpoints allow unlimited automated guessing attempts","analyst_note":"Confirm the fixed version and which /api/v2 endpoints are affected by checking GHSA-6rvj-qwjf-3m4q and GO-2026-6721 at https://pkg.go.dev/vuln/GO-2026-6721; the sources list 'fixed ?' and give no check command.","how_to_check":"unknown","needs_analyst":true,"not_affected_if":["default-config"],"user_interaction":"no","needs_special_setup":"no","severity_if_unknown":"high"},"cost_usd":0.000514,"input_tokens":2997,"output_tokens":429,"severity_before":"high"},"analyst_status":"done","analyst_note":"Confirm the fixed version and which /api/v2 endpoints are affected by checking GHSA-6rvj-qwjf-3m4q and GO-2026-6721 at https://pkg.go.dev/vuln/GO-2026-6721; the sources list 'fixed ?' and give no check command.","search":"'-2026':26A,34A,37A '-6721':35A '-91972':27A,38A '/api':24A,41A,44A,187C '/api.':138C '/api/v1':16A,130C '/api/v2':3A,73B,117C '10/60s':71B '2.5.0':55B '2.6.0':114B '3m4q':32A '6rvj':30A 'account':107B 'addit':147C,179C 'advisori':142C 'affect':180C 'allow':103B 'appli':58B 'auth':6A,63B,120C 'automat':153C 'caus':163C 'code.vikunja.io':23A,40A,43A,137C,186C 'code.vikunja.io/api':22A,39A,42A,185C 'code.vikunja.io/api.':136C 'contain':146C 'could':150C 'cve':25A,36A 'default':70B,99B 'edit':174C 'endpoint':7A,121C 'enumer':108B 'everi':2A,116C 'fals':165C 'false-posit':164C 'fix':112B 'flood':111B 'ghsa':29A 'ghsa-6rvj-qwjf-3m4q':28A 'global':93B 'go':33A,45B,157C 'guess':106B 'host':52B 'instal':13A,102B,127C 'ip':66B 'limit':20A,49B,68B,94B,134C 'login':76B 'map':154C 'modul':158C,181C 'note':139C 'oauth':82B 'packag':46B 'password':79B,105B 'password-reset':78B 'per':65B 'per-ip':64B 'pleas':171C 'posit':166C 'pre':5A,62B,119C 'pre-auth':4A,61B,118C 'public':74B 'qwjf':31A 'rate':19A,48B,67B,133C 'rate-limit':47B 'regist':77B 'reli':90B 'report':145C,167C,177C 'reset':80B,110B 'rout':75B 'scanner':170C 'self':51B 'self-host':50B 'sourc':141C 'standard':156C 'stock':12A,101B,126C 'suggest':172C 'throttl':87B 'token':81B,83B 'twin':17A,85B,131C 'unauthratelimit':69B 'uncondit':60B 'unlimit':104B 'unthrottl':9A,123C 'v1':84B 'v2':89B 'v2.6.0':189C 'version':148C,159C,183C 'vikunja':1A,53B,54B,115C 'vulner':169C","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"first_public_at":"2026-09-15T16:17:54+00:00","kev":null,"cvss_vector":"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/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"disclosure@vulncheck.com","poc_count":0,"sources":[{"source":"govuln","external_id":"GO-2026-6721","url":"https://pkg.go.dev/vuln/GO-2026-6721","severity":null,"published_at":"2026-10-19T21:08:26+00:00","modified_at":"2026-10-19T21:08:26+00:00","first_seen_at":"2026-10-23T19:13:08+00:00","fetched_at":"2026-10-23T19:13:08+00:00","note":null},{"source":"epss","external_id":"CVE-2026-91972","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-91972","severity":null,"published_at":null,"modified_at":null,"first_seen_at":"2026-10-23T19:13:43+00:00","fetched_at":"2026-10-23T19:13:43+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-91972","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-91972","severity":null,"published_at":"2026-09-15T16:17:54+00:00","modified_at":"2026-09-17T16:18:32+00:00","first_seen_at":"2026-10-23T19:35:23+00:00","fetched_at":"2026-10-23T19:35:23+00:00","note":null},{"source":"analyst","external_id":"CVE-2026-91972:141","url":null,"severity":null,"published_at":"2026-10-23T21:44:34+00:00","modified_at":"2026-10-23T21:44:34+00:00","first_seen_at":"2026-10-23T21:44:34+00:00","fetched_at":"2026-10-23T21:44:34+00:00","note":"Read GHSA-6rvj-qwjf-3m4q (vendor, Moderate, CWE-307) and GO-2026-6721: affected <= 2.5.0, fixed 2.6.0. Go DB shows 'no known fixed' only because custom versions are unmapped; govulncheck ignores it. No exploitation evidence; PoC is in the advisory. Did not search social; low-profile. Advisory rates Moderate, signal says high; severity unchanged."}],"documents":[{"id":1229,"url":"https://github.com/go-vikunja/vikunja/security/advisories/GHSA-6rvj-qwjf-3m4q","title":"GHSA-6rvj-qwjf-3m4q Vikunja v2 pre-auth endpoints unthrottled","kind":"advisory","source":"analyst","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":null},{"id":1230,"url":"https://pkg.go.dev/vuln/GO-2026-6721","title":"GO-2026-6721","kind":"other","source":"analyst","text":null,"published_at":null,"relation":"describes","confidence":null,"note":null}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}