Skip to content

[Bug]: 【mem2.0】默认随机 root key(home master.key)——master.key 丢失/换环境未携带 = 历史加密数据不可恢复;另:跨实例共享 home 文件 #99

Description

@openjiuwen-collaboration-bot

Checklist

  • 我已经搜索过相关问题,但没有得到预期的帮助。
  • 最新版本中该错误尚未修复。
  • 请注意,如果您提交的Bug描述缺少相应的环境信息和最小可复现的demo,我们将很难复现和解决该问题,从而降低收到反馈的可能性,甚至该问题将被关闭。

🐞 问题详细描述

现象(可观测行为)

  1. 多 AW 实例 root key 同源encrypt_kv_026):
    aw1 = MemoryApiAW(); aw2 = MemoryApiAW()   # 不同 uid、不同后端实例
    aw1.kv._security._key_provider.get_encryption_root_key() \
        == aw2.kv._security._key_provider.get_encryption_root_key()   # True,同一 master.key
  2. 默认 key_file 路径固定aw1.kv._security._key_provider._key_file 展开后为 ~/.agent-memory/security/master.key 绝对路径。
  3. 文件权限 0o600stat mode & 0o777 == 0o600(_restrict_file_mode:417-421 + _private_file_opener:69-70 创建时 0o600)。
  4. 首次自动生成:文件不存在时 secrets.token_bytes(32) 生成 + hex 落盘(_create_key_file:154-178),用 open(..., "x") 独占创建避免并发覆盖(已存在则读,FileExistsError 分支 :168-173)。

根因(代码定位)

  1. 来源优先级local_envelope_security_provider.py:132-152 _load_or_create_root_key 依次试 key_hexkey_b64 → env(AGENT_MEMORY_ENCRYPTION_ROOT_KEY) → key_file;前三个都为空时落到 key_file。
  2. key_file 默认值:55 _DEFAULT_KEY_FILE = "~/.agent-memory/security/master.key";工厂 _build:429 Factory.cfg_get(config, "key_file", _DEFAULT_KEY_FILE) 缺省即用它。
  3. AW / defaults 均未注入确定 root keymemory_api_aw._real_cfgtest_common/aw/memory_api_aw.py:59-102)无 security key;defaults.py:48 "security": {_D: "local"} 无 params → 全用默认 key_file。
  4. get_encryption_root_key 缓存但实例间各自读文件:95-98 缓存在 self._root_key,但每个 AW 实例独立 new 一个 LocalKeyProvider,都从同一文件读 → 同一 root。
  5. org 隔离靠派生derive_org_key:100-113 HKDF(root, salt, info=...+org_id).derive()——root 同源、org 不同则 org key 不同(encrypt_kv_004 验证)。

截图:

089dc0166aeaa7049b30589d304e9b3d.png

影响评估

  • 部署安全影响:Medium~High(多租户)。root key 集中于单文件,泄露即全租户沦陷;HKDF(org) 派生提供密码学隔离但不提供"root 独立性"。
  • 数据安全影响:Critical(master.key 丢失 = 历史加密数据不可恢复)。root key 是全局根,所有 org key/data key 由它派生/包裹。master.key 丢失或换环境重新生成(新部署、重装、容器重建未挂载、home 清空、多节点各自生成)→ 新 root 派生新 org key → 老密文里被旧 org key 包裹的 data key 解不开(AES-GCM 认证失败,KeyMismatchErrorBackendError)→ 历史加密数据永久不可恢复(AES-GCM 不可逆,无旧 root 无法解)。当前 SUT 无密钥轮换/批量重加密工具(F02 已知遗留、关联 issue⑤ KeySource动态密钥provider预留未实现),换 root 没有兜底。生产用默认装配一旦 master.key 丢失,即不可恢复的数据丢失——这是本 issue 最严重后果,远超"测试卫生/多租户隔离"。
  • 功能影响:无。org 派生隔离正常工作(encrypt_kv_004)。

详细的环境信息描述

windows

其他辅助信息

版本信息

感谢您的贡献 🎉!

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions