#3697·quivr

Chat IDOR - 未经过身份验证的所有聊天的读取、删除和消息注入

作者: geo-chen创建于 2026年7月3日更新于 2026年7月3日
标签bugarea: backend

发生了什么事?

2026年6月2日通过https://GitHub.com/QuivrHQ/quivr/security/advisories/GHSA-w7hf-3v2c-xj58报告 - 无答复:

页:1 quivr后端的三个聊天端点接受一个呼叫器提供的聊天-id,并在它上操作而不验证聊天属于请求用户. 任何经过认证的用户都可以读取另一个用户的完整对话历史(问题和LLM回答),永久删除任何用户的聊天,并在任何用户的聊天中注入任意的信息. 同一控制器的相邻端点正确执行所有权检查,确认遗漏是监督而不是设计选择.

详细情况 文件:后端/api/quivr api/modules/chat/controller/chat routes.py

易受影响的终点( 无当前 用户/ 所有权范围界定 ) :

  1. 获取/聊天/{聊天-id}/历史 返回所提供聊天的完整对话 id 。 处理器和基础寄存器过滤器仅在聊天 id上,从未在认证用户的ID上,因此任何认证的呼叫器都会收到任何聊天历史(所有用户问题和所有LLM回答,通常包含敏感的检索到的知识).

  2. DELETE/Chat/{Chat id}(行~89-97)

@chat router.delete (中文(简体) ). "/chat/{chat id}",依赖= [依赖(AuthBearer ())],标签= ["Chat"]. (中文(简体) ). aync def 删除 chat(聊天-id:UUID,聊天-服务:聊天服务Dep) : ""通过聊天ID删除特定聊天". 聊天 service.delete chat from db(chat id) 返回 {“ 消息” : f “ {聊天 id} 已被删除 ” 。

签名没有当前 用户参数;服务纯粹通过聊天 id删除.

  1. POST/Chat/{Chat id}/问答 将一个消息写入聊天中, 由聊天 id 识别, 没有所有权检查, 允许攻击者在受害者的对话中注入捏造的问答。

在同一文件中正确的对比度:相邻的更新 chat metadata handler(行~101-120,PUT/chat/{chat id}/metadata)在变异前会加载聊天并对照认证用户验证所有权. 上面三个终点省略了同样的检查.

根由: AuthBearer () 确定调用者是认证的, 但不会将聊天 id 与调用者绑定 。 聊天寄存器查询仅在聊天 id上按键(没有AND id=:current user),因此对象引用完全由用户控制.

• PoC Prerequisites:一个运行中的quivr后端(官方图像 stangirard/quivr-backend-preformed:latest被使用),有两个注册用户A和B,每个用户有一个无记名标志. 用户 A 创建了至少一个聊天;注意其聊天 id(UUID被曝光给所有者,可被猜测/假设为版本4 UUID,但一般通过引用者泄漏,共享链接,或日志获得).

  1. 作为受害者A,进行交谈并发送一个问题,以便存在一个历史行。 记录 CHAT A.

  2. 作为攻击者B,读取A的历史:

获取/聊天/CHAT A/历史 授权: 熊鼠

央视:HTTP 200带全JSON . . . . . . .