Skip to content

[tech-debt][core_rpc_base] 管理员引导恢复固定初始口令,合法未注入 Secret 的新安装再次暴露可预测管理员凭据 #5190

Description

@zhouzhuangjie

现象

没有提供管理员初始化 Secret 的全新安装会恢复使用产品固定初始口令创建管理员。该账户在默认 OTP 关闭、尚未轮换口令时,可由知道默认口令的一方登录。该路径是当前代码和测试明确保留的产品行为。

触发场景

release startup.sh 执行 batch_init 并包含 system_mgmt;数据库尚无 admin 用户,BK_INIT_ADMIN_PASSWORD 与 BK_INIT_ADMIN_PASSWORD_FILE 均未配置。初始化先设置 enable_otp=0,再使用固定口令创建默认域 admin;已注册 login RPC 校验该口令并签发 JWT。风险窗口从首次安装完成持续到管理员轮换口令或部署额外访问控制生效;不假设所有部署都对公网开放。

业务影响

影响上述合法安装形态的新管理员账户;create_user 分配 app 为空的 admin 角色,攻击者若可到达产品登录链路且知道默认口令,将获得对应管理员会话。已有 admin 时默认 no-op,因此不宣称所有升级都会重置密码。

根因(设计层)

Command._get_admin_password 在两个受控输入均缺失时返回全安装共享的固定值,打破“引导凭据应由部署显式提供或经受控流程交付”的安全契约。历史修复曾在该分支抛 CommandError,后续提交明确恢复默认,因此这是可证的产品回退导致的安全回归,并非忽略旧 Issue 关闭状态重新猜测。

涉及文件

server/apps/core/management/commands/batch_init.py:110–167;server/support-files/release/startup.sh:19–23;server/apps/system_mgmt/management/commands/create_user.py:51–71;server/apps/system_mgmt/management/commands/init_login_settings.py:87–95;server/apps/system_mgmt/models/user.py:14–25;server/apps/system_mgmt/nats/login.py:7–28、60–107、168–184、234–256;server/apps/core/tests/test_batch_init_command.py:164–173、395–400。

调用链

release startup.sh → Command.handle → _init_system_mgmt → init_login_settings(enable_otp=0) → _bootstrap_admin → _get_admin_password 固定回退 → create_user 哈希保存并分配 admin 角色;随后 SystemMgmt.login → 注册的 nats.login → check_password → get_user_login_token → _build_jwt_payload(user.id) → JWT。

证据 / 复现

静态证据完整覆盖真实初始化与登录消费方:不依赖测试直接插入 request.user。历史 Issue #3794 为 CLOSED/COMPLETED,PR #4430 合并为 4c0d232;其中 batch_init.py:149–156 缺 Secret 即失败。其后 34d54be 明确恢复默认,两个提交均为当前基线祖先。当前测试明确期待无 Secret 成功创建用户。反证:Secret 优先、已存在用户 no-op、事务、密码哈希、disabled/错误锁定及 OTP 可保护其他分支,但新安装默认 disabled=False、未锁定、OTP=0;正确的已知口令通过 check_password,不触发错误次数保护。未运行基线运行时测试,不推断真实环境网络暴露范围。

建议修复方向

按部署凭据生命周期安排迁移:先盘点未注入 Secret 的合法安装/升级形态,确定并实现受控凭据生成或显式注入、交付、恢复与轮换契约;补齐发布配置及自动化契约验证;先灰度观测凭据就绪情况,再按明确发布版本收紧缺省分支。不可只删除 fallback 或生成随机值后丢弃交付信息。该材料提出治理方向,不代表产品默认变更已获授权。

功能影响 / 回归风险

当前合法未注入 Secret 的首次安装是必须承认的存量形态,直接 fail-fast 会触发 startup.sh 硬门禁并阻止启动;随机密码若无交付/恢复会造成管理员无法登录。需区分 fresh install、已存在管理员、显式迁移及已人工轮换账户,保持已有受控 Secret 的优先级和不覆盖语义;灰度收紧前完成配置迁移与回滚演练。回滚可暂停新严格门禁并回退部署版本,同时保留已经注入/轮换的强凭据;不得把管理员重新写回共享默认值。受控交付方案及生效版本应在修复实施前明确,不能推断本审计授权改变产品默认。

严重性判断

High:合法新安装路径可达且会产生拥有管理员角色、凭据可预测的账户,正确口令可通过默认登录链路。风险取决于未配置 Secret、尚未轮换及登录入口可达,未证明普遍公网暴露,不定为 Critical。历史显式产品回退说明迁移成本高,不说明该安全风险已消除。

严重度:High 工作量:L

负责人:@zhouzhuangjie

历史已修 Issue:#3794;本单记录已核验的回归。

Activity

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

Metadata

Metadata

Assignees

Labels

⚠️ reviewConfirmed defect, high-risk fix; pending dev decision

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions