| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| k8m-darwin-amd64.zip | 2026-10-03 | 46.3 MB | |
| k8m-darwin-arm64.zip | 2026-10-03 | 44.9 MB | |
| k8m-linux-amd64.zip | 2026-10-03 | 45.8 MB | |
| k8m-linux-arm64.zip | 2026-10-03 | 43.1 MB | |
| k8m-linux-ppc64le.zip | 2026-10-03 | 43.2 MB | |
| k8m-linux-s390x.zip | 2026-10-03 | 45.1 MB | |
| k8m-windows-amd64.zip | 2026-10-03 | 46.3 MB | |
| k8m-windows-arm64.zip | 2026-10-03 | 43.2 MB | |
| README.md | 2026-10-03 | 2.4 kB | |
| v0.26.21 source code.tar.gz | 2026-10-03 | 12.7 MB | |
| v0.26.21 source code.zip | 2026-10-03 | 13.4 MB | |
| Totals: 11 Items | 383.9 MB | 1 | |
安全修复:移除 JWT 默认密钥,改为服务端会话凭证
修复 [#482]:JWT_TOKEN_SECRET 缺省值为公开的 your-secret-key,攻击者可据此伪造平台管理员 token。
空库首次启动会自动创建 k8m 平台管理员账户,因此仅修改默认密码无法阻止伪造;
一旦 JWT 密钥被知晓,伪造 token 在修改密码后依然有效。
变更内容
改用服务端会话(Opaque Token)凭证
- 新增
user_sessions表与TokenService:签发 256 位随机凭证(库中仅存 SHA-256 哈希); 校验为哈希比对 + 过期检查 + 撤销检查(30 秒结果缓存) - 不再存在可被伪造的签名密钥,
your-secret-key一类公开默认值问题从机制上消失 - 凭证撤销立即生效:禁用用户、删除用户、修改密码(管理员操作与自助修改)会即时注销该用户全部会话
- 删除 API 密钥 / MCP 密钥时同步撤销对应会话,保证「删除即失效」
覆盖范围
- 签发侧:密码登录、LDAP 登录、临时管理员、SSO/OIDC 回调、OpenAPI 密钥、MCP 密钥、MCP host 内部调用
- 校验侧:Auth 中间件、平台管理员中间件、k8m MCP server
- 前端:顶栏用户名与角色改由
/params/user/role获取,移除jwt-decode依赖
存量数据兼容(无需重新生成密钥)
启动时自动执行一次幂等迁移,把升级前已签发的密钥登记为服务端会话:
| 密钥类型 | 来源字段 | 有效期 |
|---|---|---|
| OpenAPI 密钥 | api_keys.key |
取 api_keys.expires_at |
| MCP 密钥 | mcp_keys.jwt |
签发时间 + 10 年(该表未存过期字段) |
迁移仅登记密钥表中确实存在的凭证,因此用公开默认密钥伪造的 JWT 依然无法通过校验。
升级注意
- 浏览器登录态需重新登录一次(登录凭证不做迁移,避免旧签名继续有效)
- 已签发的 API 密钥 / MCP 密钥自动迁移后继续可用,无需重新生成
- 启动参数
--jwt-token-secret/ 环境变量JWT_TOKEN_SECRET保留但不再生效,启动时会打印弃用提示; 存量部署脚本可继续携带该参数,不会导致启动失败
新增测试
pkg/service/token_test.go:覆盖签发与校验、哈希不落明文、单条撤销、按用户全量撤销、非法有效期拒绝、伪造凭证拒绝。