Skip to content

[Vulnerability] 存在可能导致越权风险的硬编码JWT Secret #177

Description

@lx915

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

"密钥位置和值:"
Image
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放入系统环境变量中或者禁止使用默认值启动项目。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions