Skip to content

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

Description

@lx915

描述:

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

密钥位置:

SECRET_KEY = '$@naaul9f4zi*3s%bze)5cq)q5ufwi!gj5do=area84pimi9p*'

严重程度:

Critical

漏洞类型:

  • CWE-798:Use of Hard-coded Credentials
  • CWE-321:Use of Hard-coded Cryptographic Key

可利用分析:

1. 硬编码密钥

该项目在 settings.py:25 中硬编码了 SECRET_KEY,该值非空且可静态确定,攻击者可通过公开源码直接获取。

同时,SECRET_KEY 被配置为 SIMPLE_JWT['SIGNING_KEY'],位于 settings.py:197,因此该硬编码密钥会被用于 JWT 的签名校验流程。

项目 说明
密钥来源 settings.py:25 中的 SECRET_KEY
JWT 签名配置 settings.py:197 中的 SIMPLE_JWT['SIGNING_KEY']
密钥属性 非空、固定、可静态确定
安全风险 攻击者可获取密钥并伪造可通过验签的 JWT

2. JWT Payload 分析

生产 Token 的 payload 包含多个用户身份和权限相关字段:

字段类型 字段 安全属性
用户身份字段 usernamefirst_namelast_nameemailiduser_id 持久化身份标识,攻击者可伪造
状态字段 is_active 账号状态字段,攻击者可伪造
权限字段 is_staffis_superuser 权限相关字段,攻击者可伪造为高权限状态

其中,is_superuseris_staffis_activeiduser_id 等字段会影响后续身份识别和权限判断。由于这些字段均位于 JWT payload 中,攻击者在持有硬编码密钥后可自行构造对应字段值。

3. Token 校验链路

请求 Token 进入 JWTAuthentication.authenticate 后,服务端主要执行以下校验:

  1. 使用 SIMPLE_JWT['SIGNING_KEY'] 对 JWT 进行签名校验;
  2. 校验 Token 是否过期;
  3. 校验通过后,将 Token payload 中的字段映射到 request.user

该校验链路未对 Access Token 执行额外的服务端状态校验:

  • 未校验 Access Token 黑名单;
  • 未校验 Access Token 白名单;
  • 未校验服务端 Session 状态;
  • 未校验 jtinonce 或其他随机高熵字段;
  • 未校验 Token 是否与真实登录状态绑定。

因此,Access Token 属于无状态 Token。服务端只依赖签名和过期时间进行校验,一旦攻击者掌握硬编码 SECRET_KEY,即可伪造能够通过校验的 Token。

4. 身份认证与授权影响

校验通过后,服务端会将 JWT payload 中的字段映射到 request.user。业务权限类 IsAuthenticatedCustomModelPerm 会依赖 request.user 上的属性进行鉴权决策,包括:

属性 影响
is_superuser 影响管理员权限判断
is_active 影响用户是否为有效账号
user.id / id / user_id 影响用户身份识别和数据归属判断

由于这些属性均可由攻击者在伪造 JWT payload 时控制,攻击者可构造包含 is_superuser=trueis_active=true 以及任意用户 ID 的 Token。服务端验签通过后,会将其映射为具有相应权限的 request.user,从而绕过认证与授权机制。

5. 攻击路径

攻击者可按以下路径利用该漏洞:

  1. 从公开源码中获取硬编码 SECRET_KEY
  2. 使用相同密钥和算法构造 JWT;
  3. 在 payload 中设置 is_superuser=trueis_active=true、任意 user_id 以及其他自定义 claims;
  4. 设置有效的过期时间;
  5. 携带伪造 Token 请求受保护接口;
  6. 服务端完成签名校验和过期时间检查;
  7. Token payload 被映射为 request.user
  8. 权限类基于伪造的 request.user 属性进行鉴权,导致权限绕过。

影响:

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