描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的JWT Secret。同时,使用JWT Secret默认值启动项目时并没有任何警告提示,所以大多数用户可能不会修改此JWT Secret默认值,这可能导致攻击者伪造任意用户的权限令牌,从而绕过认证与授权机制,访问受保护接口。
"密钥位置和值:"

https://github.com/TruthHun/BookStack/blob/master/utils/jwt.go#L21
可利用分析:
1.该密钥从 beego.AppConfig.DefaultString("jwt_secret", "bookstack.cn") 加载(utils/jwt.go:21),默认值为硬编码字面量 "bookstack.cn"。app.conf.example 中未定义 jwt_secret 配置项,部署时若未主动配置,系统将使用该硬编码默认值。
2.该密钥通过 GenerateMediaSign (SINK-001, 行76) 生成 token 和 ParseMediaSign (SINK-002, 行82) 校验 token,流入生产环境的媒体文件访问控制系统。生成 token 时 payload 存储 Path 文件路径和 ExpiresAt 过期时间。请求 token 从 URL 的 ?sign= 参数传入,经校验 sink 验证 HMAC 签名、过期时间和 Path 字段(StaticController.isValidSign 比较 claims.Path 与请求路径)。
3.校验逻辑仅依赖签名验证和过期检查,IsSignUsed 签名防重用检查在 ProjectsFile 中被注释且在 Uploads 中未调用,实际未生效;payload 中 UnixNano 字段在验证时被忽略。因此 token 为无状态(仅验签和过期的无状态校验)。
4.攻击者持有该硬编码密钥后,可以构造任意 Path 和未来过期时间的 HS256 JWT token。
影响:
- 攻击者可伪造任意用户的 JWT
- 可冒充管理员或高权限账号访问敏感接口
- 用户身份认证机制失效
- 可能导致数据泄露、越权操作或账户接管
修复建议:
可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。
描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的JWT Secret。同时,使用JWT Secret默认值启动项目时并没有任何警告提示,所以大多数用户可能不会修改此JWT Secret默认值,这可能导致攻击者伪造任意用户的权限令牌,从而绕过认证与授权机制,访问受保护接口。
"密钥位置和值:"

https://github.com/TruthHun/BookStack/blob/master/utils/jwt.go#L21
可利用分析:
1.该密钥从 beego.AppConfig.DefaultString("jwt_secret", "bookstack.cn") 加载(utils/jwt.go:21),默认值为硬编码字面量 "bookstack.cn"。app.conf.example 中未定义 jwt_secret 配置项,部署时若未主动配置,系统将使用该硬编码默认值。
2.该密钥通过 GenerateMediaSign (SINK-001, 行76) 生成 token 和 ParseMediaSign (SINK-002, 行82) 校验 token,流入生产环境的媒体文件访问控制系统。生成 token 时 payload 存储 Path 文件路径和 ExpiresAt 过期时间。请求 token 从 URL 的 ?sign= 参数传入,经校验 sink 验证 HMAC 签名、过期时间和 Path 字段(StaticController.isValidSign 比较 claims.Path 与请求路径)。
3.校验逻辑仅依赖签名验证和过期检查,IsSignUsed 签名防重用检查在 ProjectsFile 中被注释且在 Uploads 中未调用,实际未生效;payload 中 UnixNano 字段在验证时被忽略。因此 token 为无状态(仅验签和过期的无状态校验)。
4.攻击者持有该硬编码密钥后,可以构造任意 Path 和未来过期时间的 HS256 JWT token。
影响:
修复建议:
可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。