本文是 Yofune_Labs Security Lab 的受控复盘。我们按制造企业常见的“内部知识问答”架构搭建隔离环境,部门名称、人员和系统均为实验室设定,用于说明评估方法。它不是对某家企业的项目报告,也不表示生产环境已发生同样事件。
01背景
实验室设定:一家制造企业把工艺手册、质量规范和部分人事说明放进同一个知识库,供内部问答 Agent 使用。目标是减少“文件在哪个盘”的询问。安全团队希望确认:工艺工程师能不能问到质量部未授权文件。
02架构
可见组件如下:
- 对话应用,员工用域账号登录
- 编排层,把问题交给问答 Agent
- 向量检索服务,使用独立服务账号读取全部文档切片
- 生成模型,负责总结检索片段
- 可选的“相关工单”查询工具,演示阶段未打开写权限
信任假设写在设计文档里:登录过的人是内部人员;模型会被提示“尊重部门权限”;知识库管理员认为敏感文件“一般不会被问到”。
03风险
第一,检索层身份与对话层身份脱节。员工登录只约束了谁能打开聊天窗口,不约束检索器能取哪些切片。
第二,多部门语料混在同一索引。语义相近的质量文件,会作为工艺问题的“有帮助上下文”出现。
第三,回答会进入会话日志。即便界面没有下载按钮,越权摘要已经被存下来。
04攻击路径
实验室扮演工艺岗位用户,提问返修流程。检索器按相似度返回三份切片,其中一份来自质量部内部说明,含有不应出现在工艺岗位视野的组织信息。
Agent 把三份切片一并总结。没有触发任何“权限拒绝”,因为工具调用本身是检索,检索账号拥有全库读权限。
路径可以写成:
登录身份(工艺)→ 自然语言问题 → 全库检索 → 质量部切片进入上下文 → 生成带越权信息的回答 → 写入会话日志
我们没有构造特殊对抗字符串。普通业务问法已经足够。
05修复
检索请求必须携带调用者身份,并在取切片时过滤部门标签。过滤做不到,就把质量部语料从该 Agent 的索引中撤出。
按部门分索引或分命名空间。提示词里的保密条款降为辅助,不再充当控制。
回答引用必须可回查到文档编号和权限标签。对跨权限命中打告警。
06复测
加上检索过滤后,同一问法不再返回质量部切片。回答变短,只覆盖工艺手册。我们再使用带明确文件名的提问,确认过滤不是仅对模糊问法生效。
会话日志抽查未见该内部说明。修复记入回归集:以后索引变更,先跑这条路径。
这次实验室评估要交给负责人的结论很具体:问答窗口的登录,不能代表知识库的授权。不修检索层,Agent 越聪明,越权摘要越完整。