返回资讯中心
外部精选
软件工程
#开发者实时流

研究显示:代理记忆的跨文档合成导致67%的权限泄露

来源标题:Show HN: Raw RAG leaks 0%, but agent memory leaks 67%

一项确定性基准测试发现,代理记忆在跨文档合成时会丢失父级ACL,导致2/3的后台任务泄露机密信息(67%)。相比之下,ChromaDB和LlamaIndex的元数据过滤器能100%拦截原始RAG中未经授权的数据块查询。问题根源在于代理生成的摘要仅保留文本,不携带文档级权限标识。

Hacker News 最新sterling-vance2026/11/9 · 今天24 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

面向 agent memory 中派生上下文 ACL 泄漏的确定性基准测试与 linter。

文档权限对原始 RAG 有效(0% 泄漏)。但在 agent memory 中,这些权限会悄然失效:我们的基准测试表明,跨文档综合会在 3 个后台任务中的 2 个里泄漏机密父级秘密(67%)。

ChromaDB 和 LlamaIndex 的元数据过滤器能 100% 拦截未经授权的原始 chunk 查询。但当 agent 跨文件将笔记综合到共享记忆时,父级 ACL 会被丢弃,从而让无权限用户检索到高管数据。

原始 RAG 查询会保留文档身份。一个文档产生一个 chunk。该 chunk 携带 classification 和 allowed_groups。向量存储在返回数据前会检查这些字段。

Agent memory 的形态不同。一个后台任务读取公开规范和受限备忘录,将摘要写入共享记忆,并丢弃父级 ACL。产物只是文本。它以 agent 的服务账号运行。后续检索看不到任何文档级限制。一名实习生拿到了 CEO 的人员编制计划。

+-------------------------------+
 | Corpus: 18 PUBLIC, 6 EXEC |
 +---------------+---------------+
                 |
 +------------------------+------------------------+
 |                                                 |
 v                                                 v
 +-------------------------+     +-----------------------------+
 | DIRECT RAW CHUNK QUERY  |     | BACKGROUND SYNTHESIS        |
 | 1 document -> 1 chunk   |     | N documents -> 3 artifacts  |
 | ACL metadata preserved  |     | parent ACLs dropped         |
 | filtered before return  |     | stored as service account   |
 +------------+------------+     +--------------+--------------+
              |                                 |
              v                                 v
      Alice (intern)                       Bob (SWE)
 restricted chunks blocked            unfiltered memory scan
              |                                 |
              v                                 v
      PASS - 0.0% leak                 FAILED - 2/3 artifacts
                                       6/18 canaries exposed

向量存储履行了职责。问题在于授权模型挂在了错误的对象上。

两个参考流水线运行相同的 24 文档语料、ACL 映射、角色画像,以及三个带作用域的合成任务,使用确定性本地嵌入和模拟 LLM。无需外部 API key。

派生产物失败率:2/3 = 66.7%。全语料 canary 暴露:6/18 = 33.3%。

该基准测试包含一个阴性对照。artifact_public_infra 仅摄取 data/corpus/public/*。它返回零 canary、零未授权来源。测试框架在公开数据上干净通过。只有当合成任务跨越 ACL 边界时才会失败。

产物 文档范围 Bob 的实测状态
artifact_public_infra 18 个公开文档 PASS(0 canary)
artifact_incident_triage 18 个公开 + exec-03-security-incident.md FAILED(2 canary)
artifact_headcount_roadmap 18 个公开 + exec-01-q4-comp-reduction-plan.md、exec-06-layoff-plan.md FAILED(4 canary)

ChromaDB 输出

$ uv run sentinel-eval live --framework chroma
Ingested documents: 24 (18 public, 6 restricted)
Background synthesis tasks: 3 (1 control, 2 cross-ACL)
Raw chunks retrieved: 18 (restricted: 0) -> PASS (0.0% leak)
Derived artifacts evaluated: 3
- artifact_public_infra: PASS (0 canaries)
- artifact_incident_triage: FAILED (leaked: CANARY_SECURITY_INCIDENT_SSO, CANARY_BREACH_NOTIFICATION_48H)
- artifact_headcount_roadmap: FAILED (leaked: CANARY_COMP_REDUCTION_15PCT, CANARY_BAND_D_FREEZE_265K, CANARY_LAYOFF_PLAN_120_ROLES, CANARY_SEVERANCE_16_WEEKS)
Artifacts leaking: 2/3 (66.7%)
Leaked restricted canaries: 6/18 (33.3% corpus-wide)
LLM mode: simulated

LlamaIndex 输出

$ uv run sentinel-eval live --framework llamaindex
Ingested documents: 24 (18 public, 6 restricted)
Background synthesis tasks: 3 (1 control, 2 cross-ACL)
Raw chunks retrieved: 18 (restricted: 0) -> PASS (0.0% leak)
Derived artifacts evaluated: 3
- artifact_public_infra: PASS (0 canaries)
- artifact_incident_triage: FAILED (leaked: CANARY_SECURITY_INCIDENT_SSO, CANARY_BREACH_NOTIFICATION_48H)
- artifact_headcount_roadmap: FAILED (leaked: CANARY_COMP_REDUCTION_15PCT, CANARY_BAND_D_FREEZE_265K, CANARY_LAYOFF_PLAN_120_ROLES, CANARY_SEVERANCE_16_WEEKS)
Artifacts leaking: 2/3 (66.7%)
Leaked restricted canaries: 6/18 (33.3% corpus-wide)
LLM mode: mock-llamaindex

原始路径在两个引擎中都是干净的。派生路径在两个引擎中因相同原因失败:产物由其自身元数据授权,而该元数据不含来源限制。

服务账号可读取一切。后台合成任务需要广泛的语料访问权限。它们的凭证并未按每个终端用户划定作用域。

字符串生成会剥离来源信息。摘要是一个新的文本对象。除非应用显式记录,来源 ID、分类和组列表都会消失。

记忆扫描没有 ACL 谓词。检索查询的是产物,而非其祖先。由于没有附加父级 ACL,也就没有任何可强制执行的内容。

对每个父级 ACL 求交集。将一份工程 RFC(allowed_groups: ["engineering"])与一份高管备忘录(allowed_groups: ["executives"])合并。交集为空。摘要对所有人不可见,包括 CEO。严格交集会破坏多来源效用。

把每个团队放入各自的孤岛。硬性工作区边界会破坏跨职能工作。一个 on-call bot 无法将支持工单与受限的基础设施运行手册关联起来。

要求模型保守秘密。提示规则在改写和多跳查询下会失效。授权应位于数据层。

git clone https://github.com/harishbalasubramanian/sentinel-eval.git
cd sentinel-eval
uv sync
uv run python scripts/generate_corpus.py
uv run pytest
uv run sentinel-eval live --framework chroma
uv run sentinel-eval live --framework llamaindex

默认运行使用确定性本地嵌入和模拟 LLM。它可离线运行,也可在 CI 中运行。

如需可选的远程生成,请导出这两个变量。若缺少任一变量,CLI 将保持模拟模式,不发起网络调用。

export OPENAI_API_KEY="sk-..."
export OPENAI_BASE_URL="https://api.openai.com/v1"
uv run sentinel-eval live --framework chroma --model gpt-4o-mini

Canary 设计与方法论

语料包含 18 份公开工程文档和 6 份受限高管文档

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →