Skip to content

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

Description

@lx915

描述:

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

密钥位置:

SigningKey = "XnEsT0S@" # Secret key

SigningKey string `default:"XnEsT0S@"` // secret key

漏洞类型:

类型 说明
Hardcoded Secret 硬编码密钥
JWT Secret Disclosure JWT 密钥泄露
JWT Forgery JWT 伪造
Authentication Bypass 身份认证绕过
Authorization Bypass 授权绕过
User Impersonation 用户冒充
Privilege Escalation 权限提升
Broken Access Control 访问控制失效
CWE-798 Use of Hard-coded Credentials
CWE-321 Use of Hard-coded Cryptographic Key

风险等级:

高危

可利用分析:

该项目的 JWT Secret 可从配置文件和代码结构体默认值中静态获取:

来源 位置 说明
配置文件 configs/dev/middleware.toml 定义 JWT Secret 默认配置
代码默认值 internal/config/middleware.go 在中间件配置结构体中定义默认 JWT Secret

该密钥经配置加载流程进入 JWT Token 的签发与校验逻辑:

流程 位置 说明
Token 签发 jwt.go:108 使用 SignedString 生成 JWT
Token 校验 jwt.go:128 使用 ParseWithClaims 解析并验证 JWT

请求 Token 校验链路中,ParseSubject 会对 JWT 进行签名验证,并通过 store.Check 检查 Token 是否位于黑名单中,即是否已登出。该机制属于半状态 Token 校验模型:服务端会检查黑名单状态,但不会校验 Token 是否由服务端真实签发,也不会绑定不可伪造的服务端会话状态。

JWT Payload 仅包含 StandardClaims,其中 Subject 表示 userID。Token 中不包含角色或权限字段。

字段 含义 安全分析
Subject 用户 ID,即 userID 持久化身份标识,攻击者可枚举、猜测或通过注册获取
标准时间字段 如过期时间等 攻击者在伪造 Token 时可自行设置

校验通过后,业务代码会根据 Subject 中的 userID 从数据库查询用户状态和角色,并基于查询结果进行 Casbin 权限校验。也就是说,JWT Payload 中的 userID 会直接影响后续身份识别和访问控制决策。

攻击者一旦获取该硬编码 JWT Secret,即可构造包含任意 userID 的 JWT。由于伪造 Token 不在黑名单中,store.Check 会返回未登出状态,从而通过校验。随后服务端会根据伪造 Token 中的 userID 查询数据库,并将攻击者识别为对应用户。

如果攻击者指定的是已激活用户或高权限用户的 userID,即可获得该用户的角色和权限,进而访问受保护接口,造成身份冒充、认证绕过和越权访问。

影响:

  • 攻击者可伪造任意用户的 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