Chat IDOR - 未经过身份验证的所有聊天的读取、删除和消息注入
发生了什么事?
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
易受影响的终点( 无当前 用户/ 所有权范围界定 ) :
获取/聊天/{聊天-id}/历史 返回所提供聊天的完整对话 id 。 处理器和基础寄存器过滤器仅在聊天 id上,从未在认证用户的ID上,因此任何认证的呼叫器都会收到任何聊天历史(所有用户问题和所有LLM回答,通常包含敏感的检索到的知识).
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删除.
- 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,但一般通过引用者泄漏,共享链接,或日志获得).
作为受害者A,进行交谈并发送一个问题,以便存在一个历史行。 记录 CHAT A.
作为攻击者B,读取A的历史:
获取/聊天/CHAT A/历史 授权: 熊鼠
央视:HTTP 200带全JSON . . . . . . .
内容来源: QuivrHQ/quivr