Skip to content

[Security] CRITICAL default admin credentials (12345678) + KB collections default-public + sessions survive password change #456

Description

@Galaxync

UltraRAG — 默认管理员凭证 + 知识库默认公开 + 会话不随改密失效

本报告记录了在 main 分支(审计时最新)发现的多个高危/严重漏洞,均已对照当前源码核实。最严重的是 CRITICAL 级默认管理员凭证:系统用硬编码弱密码 12345678 自动置备 admin 账户,无强制改密、无启动校验。


漏洞 1 — [CRITICAL] 默认管理员凭证从不强制更改

位置: ui/backend/auth.py:15, 339-359 (_ensure_default_admin_user)

ADMIN_DEFAULT_PASSWORD = "12345678"           # L15  硬编码弱密码

def _ensure_default_admin_user(self, conn):
    ...
    generate_password_hash(ADMIN_DEFAULT_PASSWORD),   # L359 用弱密码种子化 admin

系统初始化时自动置备 admin 账户(用户名 admin,密码 12345678)。must_change_password 标志、无首次登录强制改密、无启动时拒绝默认密码的校验verify_credentials(L190-203)用 check_password_hash 校验,对默认密码直接通过。

影响: 任何知道公开默认密码的人获得完整管理员权限——管理所有知识库、查看/修改所有用户的模型设置(含 API keys via update_model_settings)、访问所有聊天会话。

复现:

curl -X POST "http://<host>/api/login" \
     -H "Content-Type: application/json" \
     -d '{"username":"admin","password":"12345678"}'
# verify_credentials → check_password_hash 通过 → 获 admin session。

修复: 首次启动强制设置管理员密码(环境变量或交互式提示);加 must_change_password 标志并在首次登录强制改密;启动时检测默认密码并拒绝启动/警告。


漏洞 2 — [HIGH] 未追踪知识库集合默认公开可见

位置: ui/backend/kb_visibility_store.py:148 (bootstrap_legacy_public)

bootstrap_legacy_public 为每个缺少可见性记录的集合创建 is_public = 1 的可见性记录。它由 app.py_ensure_legacy_collection_visibility 调用,而后者在每次集合列表请求的 _filter_collections_by_acl 中被调用。upsert_default_private(创建私有记录)仅在 pipeline_name == 'milvus_index' AND index_mode == 'new'_run_kb_background 中调用。

任何通过 'append' 模式、'overwrite' 模式、非 milvus_index 管道或任何外部路径创建的集合都没有可见性记录。第一个列出集合的用户触发 bootstrap_legacy_public,把所有这类集合标记为 PUBLIC(admin 拥有),对所有用户可搜索可见。业务规则"新集合默认私有(最小权限)"被破坏——系统默认公开。

影响: 用户 A 用 index_mode='append' 索引含敏感数据的 KB,集合无可见性记录。任意用户(攻击者)请求集合列表 → bootstrap_legacy_public 为 A 的集合创建 PUBLIC 记录 → 攻击者看到并可查询 A 的集合内容。所有用户获得 A 私有数据的永久访问。

复现:

  1. 用户 A 用 append 模式索引敏感 KB(集合无可见性记录)。
  2. 攻击者请求集合列表 → bootstrap_legacy_public 把 A 的集合标记 PUBLIC。
  3. 攻击者搜索/查询 A 的集合内容。

修复: 默认私有(is_public=0);bootstrap_legacy_public 改为 bootstrap_legacy_private;新集合统一走 upsert_default_private


漏洞 3 — [HIGH] 会话不随密码修改失效

位置: ui/backend/auth.py:229-257 (update_password)

update_password(L229)只更新数据库 password_hash(L257 generate_password_hash(new_password)),无任何机制使已存在的 Flask 会话失效users 表无 password_changed_at 时间戳,session 无 token 版本信息。app.py_get_authenticated_user_id() 只校验 session 中 auth_user_id 的格式(^[A-Za-z0-9_-]+$),不检查密码是否在 session 建立后被修改。

影响: 攻击者通过 XSS/中间人/共享设备窃取受害者 Flask session cookie。受害者发现异常后改密(update_password),但攻击者持有的旧 session cookie 仍有效——_get_authenticated_user_id() 仍返回受害者 user_id。受害者无法通过改密夺回账号控制权,攻击者访问权限实质永久。

复现:

  1. 攻击者窃取受害者 session cookie。
  2. 受害者改密(/api/auth/passwordupdate_password)。
  3. password_hash 更新,但攻击者旧 cookie 仍有效。
  4. 攻击者持续保持认证状态。

修复: users 表加 password_changed_at;session 校验时对比 session 建立时间与 password_changed_at,改密后失效旧 session。


汇总

# 漏洞 严重度 位置
1 默认管理员凭证 12345678 CRITICAL auth.py:15, 339-359
2 知识库集合默认公开 HIGH kb_visibility_store.py:148
3 会话不随改密失效 HIGH auth.py:229-257

所有漏洞均已对照 main 分支源码核实。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions