[Vulnerability] 存在可能导致越权风险的硬编码JWT Secret
- Dominant language
- C#
- Stars
- 4.3k
- Forks
- 896
- PR merge metrics
- No merged PRs in 30d
Description
## 描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的JWT Secret。同时,使用JWT Secret默认值启动项目时并没有任何警告提示,所以大多数用户可能不会修改此JWT Secret默认值,这可能导致攻击者伪造任意用户的权限令牌,从而绕过认证与授权机制,访问受保护接口。
## 密钥位置:
https://github.com/dotnetcore/WTM/blob/1943477d073a45971336052e265a5944d95a6783/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 过期时间
其中,`Subject`、`TenantCode`、`RToken` 均属于持久化标识信息,攻击者可能通过枚举、注册、社工或其他方式获取或伪造。默认 `issuer` 和 `audience` 均为 `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` 从缓存或数据库加载用户完整权限信息,包括 `Roles`、`Groups`、`FunctionPrivileges`、`DataPrivileges`;
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放入系统环境变量中或者禁止使用默认值启动项目。
Contributor guide
Research direction
Start with src/WalkingTec.Mvvm.Core/ConfigOptions/JwtOptions.cs at line 10, then trace the secret through TokenService.cs:38 and FrameworkServiceExtension.cs:763. Review how startup handles the default secret and how JWT signing and validation are configured. Done means the hard-coded default cannot leave deployments using a predictable secret, with relevant authentication behavior verified.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- csharp
- Domain
- authentication, authorization, security
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 55/100