Skip to content

安全建议:万能密码绕过双因子认证 + API加密密钥硬编码 #122

Description

@icysun

概述

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    # 无认证

修复建议

  1. 万能密码不应绕过双因子: 万能密码可以作为应急恢复手段,但必须仍然要求双因子验证
  2. 移除万能密码功能或重新设计: 改用其他应急恢复方式
  3. API 加密密钥改为环境变量配置: 每个实例使用独立密钥
  4. 生产环境关闭 Swagger: 设置 enabled: false 或启用 knife4j 认证

发现者

IcySun (icysun@qq.com)

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