{"items":[{"id":"NVI-00008982","kind":"vulnerability","title":"Vikunja: WebSocket authentication ignores server-side session state, so revoked sessions keep receiving live pushes","revision":1,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-4hv6-xc92-j86g"],"plain_summary":"GitHub lists this reviewed advisory for code.vikunja.io/api. Published version ranges and source prerequisites are shown below; this is not an inspection of a visitor’s application.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"Identify the exact component and deployed version, examine the linked publisher’s conditions, and retain evidence of any mitigation.","source_ids":["sr-59561119f6a5560d5b4772c89248eb30"],"action_type":"investigate","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[{"kind":"CVSS","as_of":"2026-10-27T15:19:31.000Z","value":"6.5 medium","meaning":"GitHub source severity; exploitability and local consequence require separate evidence.","source_id":"sr-59561119f6a5560d5b4772c89248eb30"}],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-59561119f6a5560d5b4772c89248eb30","url":"https://github.com/advisories/GHSA-4hv6-xc92-j86g","basis":"vendor_advisory","notes":"GitHub Advisory Database; CC-BY-4.0. Each advisory links its original attribution. Null normalizes fields.","title":"GHSA-4hv6-xc92-j86g","publisher":"GitHub Advisory Database","observed_at":"2026-10-31T21:56:51.534Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-59561119f6a5560d5b4772c89248eb30"],"technology":"code.vikunja.io/api","known_exclusions":[],"conditions_summary":"### Summary\n\nVikunja v2.6.0 introduced server-side sessions with revocation semantics: `DELETE /api/v2/user/sessions/{id}` documents \"Revokes a specific session by its UUID\", and enabling TOTP calls `DeleteAllUserSessions` to invalidate all sessions. The WebSocket endpoint accepts any cryptographically valid user JWT without ever resolving its `sid` (session id) claim against the sessions table. A connection authenticated before revocation stays authenticated and continues to receive live pushes indefinitely, and even brand-new WebSocket connections are accepted with a token whose session was deleted. The revocation feature therefore does not cover the WebSocket boundary at all.\n\n### Details\n\nUser access JWTs carry a session reference: `NewUserJWTAuthtoken` (`pkg/modules/auth/auth.go:188`) sets `claims[\"sid\"] = sessionID`, and the API login-session documentation describes the claim as tying the JWT to a server-side session. On the HTTP side nothing consumes the claim per request either (REST access tokens simply expire after their short TTL, a design the maintainers documented when fixing GHSA-96q5, and refresh tokens are correctly invalidated when the session row is deleted).\n\nThe","public_affected_ranges":[">= 2.3.0, <= 2.6.0"]}],"null_published_at":"2026-10-31T22:13:27.125Z","source_updated_at":"2026-10-27T15:19:31.000Z","source_disclosed_at":"2026-10-09T20:57:34.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"First indexed by Null; source disclosure date is shown separately.","null_first_observed_at":"2026-10-31T21:56:51.534Z"}],"next_cursor":null,"snapshot_revision":"42594"}