Description Checklist
🐞 问题详细描述
现象(可观测行为)
多 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
默认 key_file 路径固定 :aw1.kv._security._key_provider._key_file 展开后为 ~/.agent-memory/security/master.key 绝对路径。
文件权限 0o600 :stat mode & 0o777 == 0o600(_restrict_file_mode:417-421 + _private_file_opener:69-70 创建时 0o600)。
首次自动生成 :文件不存在时 secrets.token_bytes(32) 生成 + hex 落盘(_create_key_file:154-178),用 open(..., "x") 独占创建避免并发覆盖(已存在则读,FileExistsError 分支 :168-173)。
根因(代码定位)
来源优先级 :local_envelope_security_provider.py:132-152 _load_or_create_root_key 依次试 key_hex → key_b64 → env(AGENT_MEMORY_ENCRYPTION_ROOT_KEY) → key_file;前三个都为空时落到 key_file。
key_file 默认值 ::55 _DEFAULT_KEY_FILE = "~/.agent-memory/security/master.key";工厂 _build:429 Factory.cfg_get(config, "key_file", _DEFAULT_KEY_FILE) 缺省即用它。
AW / defaults 均未注入确定 root key :memory_api_aw._real_cfg(test_common/aw/memory_api_aw.py:59-102)无 security key;defaults.py:48 "security": {_D: "local"} 无 params → 全用默认 key_file。
get_encryption_root_key 缓存但实例间各自读文件 ::95-98 缓存在 self._root_key,但每个 AW 实例独立 new 一个 LocalKeyProvider,都从同一文件读 → 同一 root。
org 隔离靠派生 :derive_org_key:100-113 HKDF(root, salt, info=...+org_id).derive()——root 同源、org 不同则 org key 不同(encrypt_kv_004 验证)。
截图:
影响评估
部署安全影响: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 认证失败,KeyMismatchError→BackendError)→ 历史加密数据永久不可恢复 (AES-GCM 不可逆,无旧 root 无法解)。当前 SUT 无密钥轮换/批量重加密工具 (F02 已知遗留、关联 issue⑤ KeySource动态密钥provider预留未实现),换 root 没有兜底。生产用默认装配一旦 master.key 丢失,即不可恢复的数据丢失 ——这是本 issue 最严重后果,远超"测试卫生/多租户隔离"。
功能影响:无 。org 派生隔离正常工作(encrypt_kv_004)。
详细的环境信息描述
windows
其他辅助信息
版本信息
感谢您的贡献 🎉!
Reactions are currently unavailable
You can’t perform that action at this time.
Checklist
🐞 问题详细描述
现象(可观测行为)
encrypt_kv_026):aw1.kv._security._key_provider._key_file展开后为~/.agent-memory/security/master.key绝对路径。statmode & 0o777 == 0o600(_restrict_file_mode:417-421+_private_file_opener:69-70创建时 0o600)。secrets.token_bytes(32)生成 + hex 落盘(_create_key_file:154-178),用open(..., "x")独占创建避免并发覆盖(已存在则读,FileExistsError分支:168-173)。根因(代码定位)
local_envelope_security_provider.py:132-152_load_or_create_root_key依次试key_hex→key_b64→ env(AGENT_MEMORY_ENCRYPTION_ROOT_KEY) →key_file;前三个都为空时落到 key_file。:55_DEFAULT_KEY_FILE = "~/.agent-memory/security/master.key";工厂_build:429Factory.cfg_get(config, "key_file", _DEFAULT_KEY_FILE)缺省即用它。memory_api_aw._real_cfg(test_common/aw/memory_api_aw.py:59-102)无securitykey;defaults.py:48"security": {_D: "local"}无 params → 全用默认 key_file。:95-98缓存在self._root_key,但每个 AW 实例独立 new 一个LocalKeyProvider,都从同一文件读 → 同一 root。derive_org_key:100-113HKDF(root, salt, info=...+org_id).derive()——root 同源、org 不同则 org key 不同(encrypt_kv_004验证)。截图:
影响评估
KeyMismatchError→BackendError)→ 历史加密数据永久不可恢复(AES-GCM 不可逆,无旧 root 无法解)。当前 SUT 无密钥轮换/批量重加密工具(F02 已知遗留、关联 issue⑤KeySource动态密钥provider预留未实现),换 root 没有兜底。生产用默认装配一旦 master.key 丢失,即不可恢复的数据丢失——这是本 issue 最严重后果,远超"测试卫生/多租户隔离"。encrypt_kv_004)。详细的环境信息描述
windows
其他辅助信息
版本信息
感谢您的贡献 🎉!