产品:go-shiori/shiori
文件:internal/domains/auth.go
**CWE:**CWE-613 — 会话过期不充分
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 记录
Shiori 的 CheckToken 函数(internal/domains/auth.go)仅验证 JWT 的 HMAC 签名,并原样返回嵌入的 claims.Account 对象——它不会在每次请求时从数据库重新获取账户。整个代码库中不存在任何会话存储或令牌撤销机制。
一旦 JWT 被签发,无论此后账户发生什么变化,它在其整个生命周期内都保持完全有效。如果管理员删除了用户、对其进行了降级,或者用户在疑似遭到入侵后轮换了密码,那么在变更之前签发给该账户的任何 JWT 仍会继续使用令牌中内置的原始声明(角色、账户 ID 等)成功完成身份验证——服务端没有任何状态可使其失效。
POST /api/v1/auth/login)。GET /api/bookmarks
Authorization: Bearer <original JWT>
CheckToken 从不检查当前数据库状态,只检查签名。CheckToken 将 JWT 负载视为账户状态的权威来源,而不是将其视为一种需要在每次使用时对照数据库重新验证(或对照撤销列表检查)的持有者凭证。
在每次经过身份验证的请求中按 ID 重新获取账户(或至少对照以令牌 ID(jti)为键的撤销/会话存储进行检查,该存储在账户删除、降级或密码变更时失效),而不是原样信任嵌入的声明。