
PoC: Shiori JWT CheckToken никогда не перепроверяет состояние учётной записи (CVE-2026-71206, Высокий 8.2)
Продукт: go-shiori/shiori
Файл: 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 (Высокий)
CNA: Turan Security · Запись CVE
Функция CheckToken в Shiori (internal/domains/auth.go) проверяет только HMAC-подпись JWT и возвращает встроенный объект claims.Account без изменений — она никогда не запрашивает учётную запись из базы данных повторно при каждом запросе. В кодовой базе не существует ни хранилища сессий, ни механизма отзыва токенов.
После выпуска JWT остаётся полностью действительным в течение всего своего срока жизни независимо от того, что в дальнейшем происходит с учётной записью. Если администратор удаляет пользователя, понижает его роль или пароль пользователя сменяется после предполагаемой компрометации, любой JWT, выданный этой учётной записи до изменения, продолжает успешно проходить аутентификацию с первоначальными claims (роль, ID учётной записи и т.д.), зашитыми в токен, — на стороне сервера нет состояния, которое можно было бы использовать для его аннулирования.
POST /api/v1/auth/login).GET /api/bookmarks
Authorization: Bearer <original JWT>
CheckToken проверяет только подпись и никогда не проверяет текущее состояние БД.CheckToken доверяет полезной нагрузке JWT как источнику истины о состоянии учётной записи, вместо того чтобы рассматривать её как удостоверение предъявителя (bearer credential), которое при каждом использовании следует повторно проверять по базе данных (или сверять со списком отзыва).
Повторно запрашивайте учётную запись по ID при каждом аутентифицированном запросе (или как минимум проверяйте хранилище отозванных токенов/сессий, индексируемое по ID токена (jti), которое аннулируется при удалении учётной записи, понижении роли или смене пароля), а не доверяйте встроенным claims без проверки.