
PoC: Shiori JWT CheckToken never re-validates account state (CVE-2026-71206, High 8.2)
Product: go-shiori/shiori
File: internal/domains/auth.go
CWE: CWE-613 — Insufficient Session Expiration
CVSS 3.1: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L — 8.2 (High)
CNA: Turan Security · CVE record
Shiori's CheckToken function (internal/domains/auth.go) validates only the JWT's HMAC
signature and returns the embedded claims.Account object unmodified — it never re-fetches
the account from the database on each request. No session store or token-revocation
mechanism exists anywhere in the codebase.
Once a JWT is issued, it remains fully valid for its entire lifetime regardless of what happens to the account afterward. If an admin deletes a user, demotes them, or the user's password is rotated after a suspected compromise, any JWT issued to that account before the change continues to authenticate successfully with the original claims (role, account ID, etc.) baked into the token — there is no server-side state to invalidate it.
POST /api/v1/auth/login).GET /api/bookmarks
Authorization: Bearer <original JWT>
CheckToken never checks current DB state, only the signature.CheckToken trusts the JWT payload as the source of truth for account state instead of
treating it as a bearer credential to be re-validated against the database (or checked
against a revocation list) on each use.
Re-fetch the account by ID on every authenticated request (or at minimum check against a
revocation/session store keyed by a token ID (jti) that's invalidated on account deletion,
demotion, or password change) rather than trusting the embedded claims verbatim.