Skip to content

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

Description

@lx915

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

mediaJwtSecret = beego.AppConfig.DefaultString("jwt_secret", "bookstack.cn")

可利用分析:
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放入系统环境变量中或者禁止使用默认值启动项目。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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