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)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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