
PoC: Shiori JWT CheckToken nunca revalida o estado da conta (CVE-2026-71206, Alta 8.2)
Produto: go-shiori/shiori
Arquivo: internal/domains/auth.go
CWE: CWE-613 — Expiração de sessão insuficiente
CVSS 3.1: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L — 8.2 (Alto)
CNA: Turan Security · registro CVE
A função CheckToken do Shiori (internal/domains/auth.go) valida apenas a assinatura HMAC
do JWT e retorna o objeto claims.Account embutido inalterado — ela nunca busca novamente
a conta no banco de dados a cada requisição. Não existe armazenamento de sessão nem
mecanismo de revogação de token em lugar algum do código.
Uma vez que um JWT é emitido, ele permanece totalmente válido durante toda a sua vida útil, independentemente do que acontecer com a conta depois. Se um administrador excluir um usuário, rebaixá-lo, ou a senha do usuário for alterada após uma suspeita de comprometimento, qualquer JWT emitido para essa conta antes da alteração continua autenticando com sucesso com as claims originais (função, ID da conta etc.) embutidas no token — não há estado no servidor para invalidá-lo.
POST /api/v1/auth/login).GET /api/bookmarks
Authorization: Bearer <original JWT>
CheckToken nunca verifica o estado atual do banco de dados, apenas a assinatura.CheckToken confia no payload do JWT como fonte de verdade para o estado da conta, em vez de
tratá-lo como uma credencial bearer a ser revalidada contra o banco de dados (ou verificada
em uma lista de revogação) a cada uso.
Busque novamente a conta pelo ID em cada requisição autenticada (ou, no mínimo, verifique um
armazenamento de revogação/sessão indexado por um ID de token (jti) que seja invalidado na
exclusão da conta, rebaixamento ou alteração de senha), em vez de confiar literalmente nas
claims embutidas.