描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的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 过期时间
其中,Subject、TenantCode、RToken 均属于持久化标识信息,攻击者可能通过枚举、注册、社工或其他方式获取或伪造。默认 issuer 和 audience 均为 http://localhost,属于公开可预测值;exp 字段也可由攻击者自行设置为未来时间。
请求 Token 校验链路如下:
- 服务端从
Authorization: Bearer 请求头或 SignalR Query String 中的 access_token 获取 JWT Token;
- JWT Bearer 中间件使用硬编码 JWT Secret 校验 Token 签名;
- 校验
issuer,默认值为 http://localhost;
- 校验
audience,默认值为 http://localhost;
- 校验 Token 生命周期,即
exp 是否大于当前时间;
- 校验通过后,ASP.NET Core 将解析后的身份信息写入
HttpContext.User;
PrivilegeFilter 触发 WTMContext.LoginUserInfo 属性读取 JWT Payload 中的 Subject 作为 ITCode;
- 服务端根据
ITCode 从缓存或数据库加载用户完整权限信息,包括 Roles、Groups、FunctionPrivileges、DataPrivileges;
PrivilegeFilter 通过 IsAccessable 基于数据库加载的 FunctionPrivileges 执行页面级授权决策。
该 Token 校验机制属于半状态 Token 校验模式。服务端除验证签名外,还会根据 Subject 中的 ITCode 查询数据库,确认用户是否存在且有效。但由于 ITCode 是攻击者可获得或可伪造的持久化用户标识,并不属于服务端不可伪造的随机高熵字段,因此无法有效防止身份冒充。
攻击者在掌握硬编码 JWT Secret、默认 issuer / audience 值,以及任意有效用户的 ITCode 后,可以构造满足服务端校验条件的 JWT Token。服务端验签通过后,会将攻击者识别为该 ITCode 对应的真实用户,并加载该用户的数据库权限,从而导致身份认证绕过、用户冒充以及越权访问。
攻击影响:
- 攻击者可伪造任意用户的 JWT
- 可冒充管理员或高权限账号访问敏感接口
- 用户身份认证机制失效
- 可绕过 JWT 签名校验、Issuer 校验、Audience 校验和 Token 生命周期校验
- 可利用有效
ITCode 加载目标用户的角色、用户组、功能权限和数据权限
- 可能导致敏感数据泄露、越权操作、租户隔离失效或账户接管
修复建议:
可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。
描述:
本项目是一个开源项目,任何用户都能获取到该项目中的硬编码的JWT Secret。同时,使用JWT Secret默认值启动项目时并没有任何警告提示,所以大多数用户可能不会修改此JWT Secret默认值,这可能导致攻击者伪造任意用户的权限令牌,从而绕过认证与授权机制,访问受保护接口。
密钥位置:
https://github.com/dotnetcore/WTM/blob/dotnet10/src/WalkingTec.Mvvm.Core/ConfigOptions/JwtOptions.cs#L10
漏洞类型:
风险等级:
高危
可利用分析:
该项目在
JwtOptions.cs第 10 行硬编码了 JWT Secret 默认值wtmwtmwtmwtmwtmwtm。该密钥通过Configs.JwtOptions配置属性流入 JWT Token 的签发与校验逻辑,分别影响:TokenService.cs:38FrameworkServiceExtension.cs:763JWT Token 的 Payload 中主要包含以下字段:
Subject:用户登录编码,即ITCodeTenantCode:租户编码RToken:远程 Tokenexp:Token 过期时间其中,
Subject、TenantCode、RToken均属于持久化标识信息,攻击者可能通过枚举、注册、社工或其他方式获取或伪造。默认issuer和audience均为http://localhost,属于公开可预测值;exp字段也可由攻击者自行设置为未来时间。请求 Token 校验链路如下:
Authorization: Bearer请求头或 SignalR Query String 中的access_token获取 JWT Token;issuer,默认值为http://localhost;audience,默认值为http://localhost;exp是否大于当前时间;HttpContext.User;PrivilegeFilter触发WTMContext.LoginUserInfo属性读取 JWT Payload 中的Subject作为ITCode;ITCode从缓存或数据库加载用户完整权限信息,包括Roles、Groups、FunctionPrivileges、DataPrivileges;PrivilegeFilter通过IsAccessable基于数据库加载的FunctionPrivileges执行页面级授权决策。该 Token 校验机制属于半状态 Token 校验模式。服务端除验证签名外,还会根据
Subject中的ITCode查询数据库,确认用户是否存在且有效。但由于ITCode是攻击者可获得或可伪造的持久化用户标识,并不属于服务端不可伪造的随机高熵字段,因此无法有效防止身份冒充。攻击者在掌握硬编码 JWT Secret、默认
issuer/audience值,以及任意有效用户的ITCode后,可以构造满足服务端校验条件的 JWT Token。服务端验签通过后,会将攻击者识别为该ITCode对应的真实用户,并加载该用户的数据库权限,从而导致身份认证绕过、用户冒充以及越权访问。攻击影响:
ITCode加载目标用户的角色、用户组、功能权限和数据权限修复建议:
可以将JWT Secret放入系统环境变量中或者禁止使用默认值启动项目。