[H-06][low] 改管理员密码时旧密码校验不计入锁定;过期管理员会话不清理,作废其他会话失败被忽略 #49

Closed
opened 2026-09-30 13:57:03 +08:00 by nixevol · 1 comment
Owner

编号:H-06 严重级:low 工作线:管理后端(internal/admin) 来源:审查 A-16、A-27
依赖:无 被依赖:无

结论与统一方案

采用审查 A-16、A-27 的方案:

  1. 校验旧密码前检查 LockAdminIP,失败时计数,锁定时返回 429,成功后清零。
  2. 登录时在同一个写操作里删除过期的 admin_sessions 行。
  3. 改密后作废其他会话失败时返回 500 并写审计。

改动文件

internal/admin/login.go、store.go。

与其他问题的交互 / 冲突说明

与 W-01 的 401 自动登出互相排除:改密接口旧密码错误返回 401 时不触发自动登出。命令行 set-password 作废会话在 D-05 处理。

验收与测试

  • 连续 10 次旧密码错误后返回 429。
  • 插入过期会话后登录,过期行被删除。

问题明细(各区审查原文,证据含文件与行号)

以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。解决方案以本 issue 上方的"结论与统一方案"为准;原文里的方案与之不一致时,按上方执行。

[A-16] 改管理员密码时对旧密码的校验不计入锁定

  • 严重级:low
  • 分类:安全
  • 现象与影响:拿到会话 Cookie 的人可以在这里无限次猜测管理员密码,每次还消耗一次 argon2。猜中后可以取得令牌管理权,而且会话过期后仍能继续登录。
  • 证据:login.go:110-140 没有使用 locks;登录接口在 26-31 有锁定。
  • 文档依据:PRD §8"管理员登录和令牌都防暴力尝试"。
  • 为何不是故意设计:DEVIATIONS 没有相关条目。
  • 解决方案:校验旧密码前检查 LockAdminIP,失败时计数,锁定时返回 429,成功后清零。
  • 改动文件:internal/admin/login.go。
  • 交互/冲突风险:与 A-08 的 401 自动登出要互相排除。
  • 需补测试:连续 10 次旧密码错误后返回 429。
  • 置信度:代码阅读确定

[A-27] 管理员会话清理不完整

  • 严重级:low
  • 分类:数据 / 安全
  • 现象与影响:过期的 admin_sessions 行从不删除。改密码后作废其它会话的操作如果失败,错误被忽略,接口仍返回成功,其它会话继续有效。
  • 证据:store.go:42-65,74-79;login.go:152-155。
  • 文档依据:DEVELOPMENT §8"会话服务端只存令牌哈希,默认 12 小时";admin-api 2.4"其它会话作废"。
  • 为何不是故意设计:DEVIATIONS 没有相关条目。
  • 解决方案:登录时在同一个写操作里删除过期行;作废其它会话失败时返回 500 并写审计。
  • 改动文件:internal/admin/store.go、login.go。
  • 交互/冲突风险:无。
  • 需补测试:插入过期会话后登录,过期行被删除。
  • 置信度:代码阅读确定

复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。

**编号**:H-06 **严重级**:low **工作线**:管理后端(internal/admin) **来源**:审查 A-16、A-27 **依赖**:无 **被依赖**:无 ### 结论与统一方案 采用审查 A-16、A-27 的方案: 1. 校验旧密码前检查 `LockAdminIP`,失败时计数,锁定时返回 429,成功后清零。 2. 登录时在同一个写操作里删除过期的 `admin_sessions` 行。 3. 改密后作废其他会话失败时返回 500 并写审计。 ### 改动文件 `internal/admin/login.go`、`store.go`。 ### 与其他问题的交互 / 冲突说明 与 W-01 的 401 自动登出互相排除:改密接口旧密码错误返回 401 时不触发自动登出。命令行 `set-password` 作废会话在 D-05 处理。 ### 验收与测试 - 连续 10 次旧密码错误后返回 429。 - 插入过期会话后登录,过期行被删除。 --- ### 问题明细(各区审查原文,证据含文件与行号) > 以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。**解决方案以本 issue 上方的"结论与统一方案"为准**;原文里的方案与之不一致时,按上方执行。 #### [A-16] 改管理员密码时对旧密码的校验不计入锁定 - 严重级:low - 分类:安全 - 现象与影响:拿到会话 Cookie 的人可以在这里无限次猜测管理员密码,每次还消耗一次 argon2。猜中后可以取得令牌管理权,而且会话过期后仍能继续登录。 - 证据:`login.go:110-140` 没有使用 `locks`;登录接口在 `26-31` 有锁定。 - 文档依据:PRD §8"管理员登录和令牌都防暴力尝试"。 - 为何不是故意设计:DEVIATIONS 没有相关条目。 - 解决方案:校验旧密码前检查 `LockAdminIP`,失败时计数,锁定时返回 429,成功后清零。 - 改动文件:`internal/admin/login.go`。 - 交互/冲突风险:与 A-08 的 401 自动登出要互相排除。 - 需补测试:连续 10 次旧密码错误后返回 429。 - 置信度:代码阅读确定 #### [A-27] 管理员会话清理不完整 - 严重级:low - 分类:数据 / 安全 - 现象与影响:过期的 `admin_sessions` 行从不删除。改密码后作废其它会话的操作如果失败,错误被忽略,接口仍返回成功,其它会话继续有效。 - 证据:`store.go:42-65,74-79`;`login.go:152-155`。 - 文档依据:DEVELOPMENT §8"会话服务端只存令牌哈希,默认 12 小时";admin-api 2.4"其它会话作废"。 - 为何不是故意设计:DEVIATIONS 没有相关条目。 - 解决方案:登录时在同一个写操作里删除过期行;作废其它会话失败时返回 500 并写审计。 - 改动文件:`internal/admin/store.go`、`login.go`。 - 交互/冲突风险:无。 - 需补测试:插入过期会话后登录,过期行被删除。 - 置信度:代码阅读确定 --- <sub>复审基线:main `4059a15`(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。</sub>
nixevol added the P3-lowlane/adminreview-2026-09-30 labels 2026-09-30 13:57:03 +08:00
Author
Owner

已合入 origin/main 0c9b459。落地提交 1cb562f fix: 改密计入锁定并清理过期管理员会话 (#49)。

已合入 origin/main `0c9b459`。落地提交 `1cb562f` fix: 改密计入锁定并清理过期管理员会话 (#49)。
Sign in to join this conversation.