
PoC : Shiori JWT CheckToken ne re-valide jamais l'état du compte (CVE-2026-71206, Élevé 8.2)
Produit : go-shiori/shiori
Fichier : 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 (Élevé)
CNA : Turan Security · Fiche CVE
La fonction CheckToken de Shiori (internal/domains/auth.go) ne valide que la signature HMAC du JWT et renvoie l'objet claims.Account embarqué sans modification — elle ne récupère jamais le compte depuis la base de données au moment de traiter une requête. Aucun magasin de sessions ni mécanisme de révocation de jeton n'existe dans la base de code.
Une fois qu'un JWT est émis, il reste pleinement valide pendant toute sa durée de vie, quel que soit le sort du compte par la suite. Si un administrateur supprime un utilisateur, le rétrograde, ou si le mot de passe de l'utilisateur subit une rotation après une compromission suspectée, tout JWT émis pour ce compte avant le changement continue de s'authentifier avec succès avec les claims d'origine (rôle, identifiant de compte, etc.) intégrés dans le jeton — il n'existe aucun état côté serveur pour l'invalider.
POST /api/v1/auth/login).GET /api/bookmarks
Authorization: Bearer <original JWT>
CheckToken ne vérifie jamais l'état actuel de la base de données, uniquement la signature.CheckToken considère la charge utile du JWT comme la source de vérité pour l'état du compte, au lieu de la traiter comme un justificatif de type bearer à revalider contre la base de données (ou à vérifier contre une liste de révocation) à chaque utilisation.
Récupérez à nouveau le compte par son ID à chaque requête authentifiée (ou, au minimum, vérifiez un magasin de révocation/sessions indexé par un identifiant de jeton (jti), invalidé lors de la suppression du compte, de la rétrogradation ou du changement de mot de passe) plutôt que de vous fier aux claims embarqués tels quels.