概述
Smart-Admin 存在一个设计缺陷:系统内置的"万能密码"功能在验证通过时会完全跳过双因子邮箱验证码校验。即使管理员启用了双因子认证(2FA),攻击者只要获取万能密码值,就可以绕过 2FA 以任意用户身份登录。
影响
| # |
问题 |
CVSS |
说明 |
| 1 |
万能密码绕过双因子 |
7.5 High |
默认密码 1024ok + 绕过 2FA |
| 2 |
API 密钥硬编码 |
5.3 Medium |
AES/SM4 密钥 1024lab__1024lab |
| 3 |
生产环境 Swagger 未关闭 |
5.3 Medium |
API 文档无认证可访问 |
详细分析
1. 万能密码绕过双因子
LoginService.java:
String superPassword = configService.getConfigValue(ConfigKeyEnum.SUPER_PASSWORD);
boolean superPasswordFlag = superPassword.equals(requestPassword);
// 万能密码则不校验 — 传入 superPasswordFlag
ResponseDTO<String> validateEmailCode = validateEmailCode(loginForm, employeeEntity, superPasswordFlag);
validateEmailCode 方法:
if (superPasswordFlag) {
return ResponseDTO.ok(); // 跳过双因子验证!
}
关键安全价值: 即使管理员将万能密码改为强密码,绕过双因子的设计缺陷依然存在。双因子认证的核心价值被万能密码完全架空。
默认值 (smart_admin_v3.sql):
INSERT INTO `t_config` VALUES (1, '万能密码', 'super_password', '1024ok', ...);
2. API 密钥硬编码
// ApiEncryptServiceAesImpl.java
private static final String AES_KEY = "1024lab__1024lab";
// ApiEncryptServiceSm4Impl.java
private static final String SM4_KEY = "1024lab__1024lab";
所有部署实例共享相同密钥,可解密所有加密通信。
3. 生产环境 Swagger 未关闭
# prod/sa-base.yaml
springdoc:
swagger-ui:
enabled: true # 生产环境开启
knife4j:
enable: true
basic:
enable: false # 无认证
修复建议
- 万能密码不应绕过双因子: 万能密码可以作为应急恢复手段,但必须仍然要求双因子验证
- 移除万能密码功能或重新设计: 改用其他应急恢复方式
- API 加密密钥改为环境变量配置: 每个实例使用独立密钥
- 生产环境关闭 Swagger: 设置
enabled: false 或启用 knife4j 认证
发现者
IcySun (icysun@qq.com)
概述
Smart-Admin 存在一个设计缺陷:系统内置的"万能密码"功能在验证通过时会完全跳过双因子邮箱验证码校验。即使管理员启用了双因子认证(2FA),攻击者只要获取万能密码值,就可以绕过 2FA 以任意用户身份登录。
影响
1024ok+ 绕过 2FA1024lab__1024lab详细分析
1. 万能密码绕过双因子
LoginService.java:
validateEmailCode 方法:
关键安全价值: 即使管理员将万能密码改为强密码,绕过双因子的设计缺陷依然存在。双因子认证的核心价值被万能密码完全架空。
默认值 (smart_admin_v3.sql):
2. API 密钥硬编码
所有部署实例共享相同密钥,可解密所有加密通信。
3. 生产环境 Swagger 未关闭
修复建议
enabled: false或启用 knife4j 认证发现者
IcySun (icysun@qq.com)