外观
权限过滤失效与敏感数据暴露 Near Miss 复盘
30 秒复盘结论: 这是一个设计型 Near Miss:候选版本的答案缓存键缺少租户和权限指纹,缓存命中后又没有对引用文档重新鉴权,金丝雀查询在发布前发现跨租户引用并阻断上线。止损是关闭受保护知识库缓存、撤销候选入口并审计相关请求;长期修复是让权限贯穿检索、缓存和引用,采用版本化权限指纹、文档级再鉴权、权限变更主动失效与 Fail Closed。当前没有真实用户数据泄露证据,Near Miss 是否实际执行仍需发布记录证明。
目录
1. 摘要与小白解释
公司档案室按员工工牌开放不同柜子,但复印台会缓存上一位员工的答案。如果缓存只看“问了什么”,不看“谁在问”,下一位员工问同一句话就可能拿到上一位的复印件。工牌对应身份和租户,柜门规则对应 ACL,复印台缓存对应答案缓存,交付前再看一次工牌对应引用级鉴权。
类比忽略了群组继承、权限撤销延迟、公开与私有文档混合、行列级权限和生成模型可能在无引用时泄露上下文。安全设计必须 Fail Closed,无法确认权限时拒绝返回。
| 项目 | 内容 |
|---|---|
| 类型 | Near Miss 设计稿,发布前阻断 |
| 风险 | 相同问题跨租户命中旧答案或引用 |
| 发现 | 金丝雀查询、审计日志、跨租户引用告警 |
| 直接原因 | Cache Key 缺租户/权限版本,命中后未再鉴权 |
| 根本原因 | 权限只被当作检索前过滤器,没有成为全链路数据契约 |
| 止损 | 关闭缓存、撤销入口、冻结版本、审计请求 |
2. 故障教学图片
图:故障教学图片|权限过滤旁路与发布前阻断
替代文本: 用户身份、权限策略、检索过滤、答案缓存和生成引用形成链路;缓存键缺租户、权限版本过期和引用未再鉴权构成旁路,金丝雀查询与审计告警在发布前阻断,事实边界为 Near Miss。
教学图片待人工审图用户身份、权限策略、检索过滤、答案缓存和生成引用形成链路;缓存键缺租户、权限版本过期和引用未再鉴权构成旁路,金丝雀查询与审计告警在发布前阻断,事实边界为 Near Miss 暂不公开,正文与 Mermaid 图可正常阅读。
读图结论: 权限必须贯穿候选召回、缓存命中、上下文选择和最终引用,不能只在链路入口检查一次。
红色路径是可能的缓存旁路,绿色路径是发布门禁,蓝色修复链路把权限指纹和文档级鉴权固化到协议。图中不包含真实租户或敏感数据。
图片生成记录: model=gpt-image-2,generated=2026-07-15,prompt_version=v1;查看 Prompt。PNG C2PA 记录 softwareAgent=gpt-image、version=2.0。
质检状态: Agent 已核对文字、箭头和 Near Miss 标签;维护者审图待完成。
3. 事实边界与安全证据
证据边界: 本文没有真实用户请求、敏感文档、发布流水或安全工单,不能确认一个 Near Miss 已在真实环境执行。正文描述的是可执行的候选版本阻断演练,所有租户与文档 ID 均为合成值。
| 结论 | 类型 | 证据或验证动作 |
|---|---|---|
| Cache Key 未包含权限上下文可能跨租户复用 | 工程风险 | 用租户 A 预热、租户 B 查询相同问题 |
| 金丝雀门禁能发现全部越权 | 不成立 | 只能覆盖已设计样本,仍需属性测试和审计 |
| 返回无引用就没有泄露 | 不成立 | 上下文本身可能进入生成结果 |
| 已发生真实数据泄露 | 无证据 | 必须有审计日志和受影响请求确认 |
合成 Trace 字段:request_id、tenant_id、subject_id_hash、role_set_hash、acl_version、policy_decision_id、cache_key_hash、cache_hit、source_tenant_id、document_id_hash、citation_authz_result。日志不得记录原始敏感内容和完整身份信息。
text
cross_tenant_reference_count = source_tenant_id 与 request tenant_id 不一致且未被授权的引用数
revocation_propagation_delay = 权限撤销时间 - 所有缓存与索引完成失效时间
fail_closed_rate = 权限依赖异常时被安全拒绝的请求数 / 权限依赖异常请求数影响域包括检索候选、父子块、重排、缓存、上下文拼装和引用;未进入候选环境的稳定版本不应被写成受影响。
4. 技术栈与架构
4.1 技术点清单
| 技术点 ID | 技术点/环节 | 类型 | 采用方案 | 链路职责 | 版本/证据边界 |
|---|---|---|---|---|---|
| TP-01 | 身份与权限上下文 | 协议 | 租户、主体、角色、ACL 版本组成权限指纹 | 贯穿检索和缓存 | 演练协议 |
| TP-02 | 候选过滤 | 服务 | 检索前硬过滤加重排后校验 | 防止未授权文档进入上下文 | 待权限测试 |
| TP-03 | 缓存隔离 | 存储 | 权限指纹和语料版本参与 Key | 阻止跨边界复用 | 待并发测试 |
| TP-04 | 最终引用门禁 | 服务 | 文档级再次鉴权,异常 Fail Closed | 防止旁路和撤权延迟泄露 | 待演练 |
图:架构|RAG 权限、缓存与引用的纵深防御边界
替代文本: 身份服务生成权限上下文,策略引擎为检索过滤和缓存命名空间提供权限指纹;候选、重排、上下文和引用都经过授权边界,审计与金丝雀查询独立监控。
图表加载中…
读图结论: 纵深防御允许任一层失误被后续门禁阻断,缓存命中不能跳过授权链路。
5. 风险与阻断流程
图:技术调用流程|跨租户缓存旁路的发现、止损与修复验证
替代文本: 租户 A 的授权答案进入候选缓存,租户 B 查询相同问题时旧键可能命中;引用门禁和金丝雀检测发现 source tenant 不一致,拒绝返回并触发缓存关闭、审计与修复回归。
图表加载中…
读图结论: Near Miss 的关键证据是危险结果在到达用户前被独立门禁拒绝,而不是“暂时没人反馈”。
6. 止损、根因与选型
止损顺序:立即关闭受保护知识库答案缓存;停止候选发布并保留制品;使相关缓存命名空间失效;审计请求与引用,不把日志中出现的敏感原文再次扩散;按证据决定通知和升级范围。
- 直接原因: 旧 Cache Key 未包含租户和 ACL 版本,命中后引用未再鉴权。
- 根本原因: 权限语义没有进入缓存、上下文和引用的数据契约。
- 促成因素: 权限撤销不触发失效;测试只验证召回过滤;安全日志缺来源租户。
- 非原因: Embedding 相似度不会替代授权判断;调低 Top-k 也不能修复越权。
- 防线有效点: 金丝雀查询与引用级 Fail Closed 在发布前阻断。
| 技术点 ID | 候选方案 | 优点 | 缺点/代价 | 适用场景 | 不适用场景 | 选择结论与依据 |
|---|---|---|---|---|---|---|
| TP-01 | 只传 user_id | 简单 | 无法表达租户、角色和撤权版本 | 单用户私有应用 | 企业多租户 | 不采用 |
| TP-01 | 权限指纹 | 可版本化和审计 | 需要稳定规范化 | 多租户 ACL | 权限上下文不可确定 | 采用 |
| TP-02 | 生成后文本脱敏 | 易接入 | 未授权内容已进入上下文且可能漏检 | 辅助防泄露 | 访问控制 | 不能替代硬过滤 |
| TP-02 | 检索硬过滤 + 后校验 | 纵深防御 | 增加查询成本 | 权限知识库 | 无 ACL 数据 | 采用 |
| TP-03 | 全局答案缓存 | 命中率高 | 无法安全隔离 | 完全公开语料 | 私有知识库 | 禁止 |
| TP-03 | 权限命名空间缓存 | 继承授权语义 | 命中率降低、失效复杂 | 多租户知识库 | 高频撤权且无法及时失效 | 条件采用 |
| TP-04 | Fail Open | 可用性高 | 权限依赖异常时泄露 | 无敏感数据 | 受保护内容 | 禁止 |
| TP-04 | Fail Closed + 文档再鉴权 | 安全边界明确 | 权限服务异常会拒绝 | 敏感知识库 | 可公开内容的弱依赖路径 | 采用 |
7. 验证、防复发与面试表达
验证矩阵覆盖:跨租户同问、跨角色同问、群组变更、权限撤销、索引切换、父子块继承、缓存预热、权限服务超时、旧 ACL 版本、无引用生成。安全用例只使用合成敏感标记,不使用真实隐私数据。
防复发:权限契约进入 Schema;所有缓存写入来源租户和 ACL 版本;撤权事件触发缓存与索引失效;引用返回前批量鉴权;CI 加入属性测试和跨租户回归;审计日志脱敏且不可被普通业务账号读取;Runbook 固定“阻断—保全证据—失效—审计—通知评估—回归”。
难点卡: 最难的是证明数据在哪一层首次越过授权边界,同时避免排障日志成为第二次泄露源。
亮点卡: 将权限从入口条件升级为检索、缓存和引用的版本化协议,并用独立金丝雀证明门禁有效;代价是缓存命中率和权限服务依赖增加。
反模式: 用相似度阈值代替 ACL;把 tenant_id 只放日志不放 Cache Key;权限服务超时时 Fail Open;将真实敏感文本复制到工单。
7.1 30 秒面试回答
这是一个权限 Near Miss 演练:候选答案缓存缺少租户和权限版本,相同问题可能跨租户命中,但金丝雀查询和引用再鉴权在发布前阻断。我先关闭受保护缓存、撤销入口并审计请求,根因是权限只用于检索前过滤,没有贯穿缓存和引用。长期修复采用权限指纹、文档级鉴权、撤权失效和 Fail Closed;当前没有真实泄露证据。
7.2 60~90 秒与追问
排查时对齐 request_id、tenant_id、ACL 版本、Cache Key、source tenant 和 document_id,先判断结果来自本轮检索还是旧缓存。修复不能只把 tenant_id 加进日志,而要进入缓存命名空间和引用授权;权限依赖异常时宁可拒绝,也不能返回未确认内容。验证覆盖跨租户、跨角色、撤权、索引切换和无引用答案,并确保安全日志本身脱敏。
追问:如何证明 Near Miss 而不是事故?撤权传播延迟怎么测?父子块权限如何继承?权限服务不可用如何降级?语义缓存还能不能用?
8. 总结
一句话记忆: 权限不是检索前的一次过滤,而是贯穿缓存、上下文和引用的全链路契约。
- Near Miss 必须有发布前阻断证据,不能只说“没人投诉”;
- 缓存键必须继承租户、角色、ACL 与语料版本;
- 最终引用需要再次鉴权,权限异常默认 Fail Closed;
- 安全排障必须脱敏并控制证据访问;
- 当前是设计型 Near Miss,未证明真实环境已执行。