Skip to content

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

Description

@lx915

描述:

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

密钥位置:

https://github.com/dotnetcore/WTM/blob/dotnet10/src/WalkingTec.Mvvm.Core/ConfigOptions/JwtOptions.cs#L10

漏洞类型:

  • Hardcoded Secret / 硬编码密钥
  • JWT Secret Disclosure / JWT密钥泄露
  • JWT Forgery / JWT伪造
  • Authentication Bypass / 身份认证绕过
  • Authorization Bypass / 授权绕过
  • Privilege Escalation / 权限提升
  • CWE-798: Use of Hard-coded Credentials
  • CWE-321: Use of Hard-coded Cryptographic Key

风险等级:

高危

可利用分析:

该项目在 JwtOptions.cs 第 10 行硬编码了 JWT Secret 默认值 wtmwtmwtmwtmwtmwtm。该密钥通过 Configs.JwtOptions 配置属性流入 JWT Token 的签发与校验逻辑,分别影响:

  • Token 签发逻辑:TokenService.cs:38
  • Token 校验逻辑:FrameworkServiceExtension.cs:763

JWT Token 的 Payload 中主要包含以下字段:

  • Subject:用户登录编码,即 ITCode
  • TenantCode:租户编码
  • RToken:远程 Token
  • exp:Token 过期时间

其中,SubjectTenantCodeRToken 均属于持久化标识信息,攻击者可能通过枚举、注册、社工或其他方式获取或伪造。默认 issueraudience 均为 http://localhost,属于公开可预测值;exp 字段也可由攻击者自行设置为未来时间。

请求 Token 校验链路如下:

  1. 服务端从 Authorization: Bearer 请求头或 SignalR Query String 中的 access_token 获取 JWT Token;
  2. JWT Bearer 中间件使用硬编码 JWT Secret 校验 Token 签名;
  3. 校验 issuer,默认值为 http://localhost
  4. 校验 audience,默认值为 http://localhost
  5. 校验 Token 生命周期,即 exp 是否大于当前时间;
  6. 校验通过后,ASP.NET Core 将解析后的身份信息写入 HttpContext.User
  7. PrivilegeFilter 触发 WTMContext.LoginUserInfo 属性读取 JWT Payload 中的 Subject 作为 ITCode
  8. 服务端根据 ITCode 从缓存或数据库加载用户完整权限信息,包括 RolesGroupsFunctionPrivilegesDataPrivileges
  9. PrivilegeFilter 通过 IsAccessable 基于数据库加载的 FunctionPrivileges 执行页面级授权决策。

该 Token 校验机制属于半状态 Token 校验模式。服务端除验证签名外,还会根据 Subject 中的 ITCode 查询数据库,确认用户是否存在且有效。但由于 ITCode 是攻击者可获得或可伪造的持久化用户标识,并不属于服务端不可伪造的随机高熵字段,因此无法有效防止身份冒充。

攻击者在掌握硬编码 JWT Secret、默认 issuer / audience 值,以及任意有效用户的 ITCode 后,可以构造满足服务端校验条件的 JWT Token。服务端验签通过后,会将攻击者识别为该 ITCode 对应的真实用户,并加载该用户的数据库权限,从而导致身份认证绕过、用户冒充以及越权访问。

攻击影响:

  • 攻击者可伪造任意用户的 JWT
  • 可冒充管理员或高权限账号访问敏感接口
  • 用户身份认证机制失效
  • 可绕过 JWT 签名校验、Issuer 校验、Audience 校验和 Token 生命周期校验
  • 可利用有效 ITCode 加载目标用户的角色、用户组、功能权限和数据权限
  • 可能导致敏感数据泄露、越权操作、租户隔离失效或账户接管

修复建议:

可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions