CVE-2026-72732
Executive Summary
CVE-2026-72732 is a low-severity information disclosure vulnerability in the Discourse open-source discussion platform. A low-privileged, authenticated user can retrieve the names of hidden tags through the discourse_templates endpoint because the serializer responsible for building the response fails to enforce tag group permissions via the request Guardian. All Discourse instances running versions prior to 2026.1.6, 2026.5.2, 2026.6.1, and 2026.7.0 are affected, and the issue is classified as CWE-862 (Missing Authorization). The practical impact is limited to confidentiality — restricted tag names can leak internal categories or project structure — with no integrity or availability impact observed.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The vulnerability resides in the Discourse Templates plugin, located at plugins/discourse-templates/app/serializers/discourse_templates/templates_serializer.rb in the Discourse source tree. The serializer class DiscourseTemplates::TemplatesSerializer is responsible for rendering template data, including associated tag metadata, back to the client. According to the NVD description, the serializer does not filter tags through the request Guardian and does not respect tag group permissions.
Discourse implements tag group permissions as an access-control layer: an administrator can define a tag group that restricts certain tags to specific user categories or trust levels. When a tag is hidden by such a permission set, the platform is expected to omit that tag from any API or serializer output delivered to users who lack the required authorization. The Guardian object is Discourse's centralized permission-checking mechanism — every controller action normally negotiates object-level permissions through Guardian#can_* checks before data is serialized. In this case, the serializer bypasses that mechanism for tag metadata. As a result, tags that the requesting user is not permitted to view are still included in the serialized discourse_templates response.
The underlying flaw class is missing authorization (CWE-862): the code path performs data retrieval without first verifying that the caller has been granted visibility for every object (tag) included in the output. This is not an injection vulnerability, nor does it require crafted payloads — the flaw is purely one of omission in the server-side authorization layer. The attack surface is the HTTP endpoint that surfaces discourse_templates data; because Discourse is a public-facing web application, the network vector (AV:N) applies, but a valid account with low privileges (PR:L) is required to reach the serializer. No user interaction is needed (UI:N), and the scope remains unchanged (S:U).
The CVSS score of 4.3 reflects the low confidentiality impact: disclosure of hidden tag names is not a direct credential or sensitive-record leak, but it can reveal the existence of restricted content areas. The EPSS score of 0.00251 (16.7th percentile) indicates that the vulnerability is not currently being actively exploited in the wild, and the absence of a CISA KEV listing corroborates that. No public exploit code or Nuclei template has been reported, so detection guidance relies on monitoring for anomalous access to the affected endpoint.
Exploitation Scenarios
Because no public proof-of-concept exists, the attack chain below is inferred from the vulnerability class (missing authorization in a serializer) and the NVD description. The steps are expressed at the class level, without fabricated implementation specifics.
Reconnaissance / target identification: An attacker first identifies a self-hosted Discourse instance running an affected version (any release before 2026.1.6, 2026.5.2, 2026.6.1, or 2026.7.0). Instance version can be fingerprinted from page metadata, headers, or the
/aboutroute. The attacker also confirms that the Discourse Templates plugin is enabled, since the vulnerable endpoint only exists when that plugin is active.Privilege acquisition: The attacker registers a standard low-privileged account or compromises an existing one. No elevated permissions are required — the CVSS vector specifies PR:L, meaning a regular authenticated user is sufficient.
Triggering the flaw: The attacker sends authenticated HTTP requests to the
discourse_templatesendpoint. The request does not require special parameters or payloads; the normal endpoint response includes serialized template data. Because the serializer does not consult the request Guardian, it appends all tags associated with the template records, including tags that are restricted by tag group permissions and therefore hidden from this user's role.Post-exploitation impact: The response body leaks the names of hidden tags. In a discussion platform, tag names frequently mirror internal project codenames, client names, compliance classifications (e.g., "legals-hold", "hr-confidential"), or unannounced product lines. The attacker uses this information to map the organization's internal structure, identify high-value discussion areas, and refine further social-engineering or targeted attacks against users who participate in those restricted categories. The disclosed tag names themselves are not credentials, so lateral movement is not directly enabled; the value is informational.
It is acceptable to note that the full exploitation chain beyond this serialized response cannot be verified with the available data. No public PoC is available; attack chain is inferred from vulnerability class.
Impact Assessment
The business impact of CVE-2026-72732 is centered on confidentiality and information governance. Discourse deployments in enterprise environments commonly use tag groups to enforce access control over sensitive topics — legal matters, HR discussions, security incidents, or unreleased product planning. When the discourse_templates endpoint discloses those hidden tag names to any authenticated user, the platform's access-control model is demonstrably broken for that endpoint, undermining the trust boundary that tag group permissions are intended to enforce.
The CVSS subscores quantify the impact precisely: Confidentiality Impact is Low (C:L), Integrity Impact is None (I:N), and Availability Impact is None (A:N). The scope is Unchanged (S:U), meaning the compromise does not cross a trust boundary into other components. The attack requires no user interaction and is exploitable over the network, but the low privilege requirement filters out unauthenticated internet-wide scanning. The blast radius is therefore limited to authenticated users of a specific Discourse instance — which is precisely the population that the permission model is supposed to constrain.
Organizations that do not use tag group restrictions, or that do not enable the Discourse Templates plugin, are not meaningfully affected. The overall risk is low-to-moderate: low technical severity, no known exploitation in the wild, but a real compliance concern for deployments that rely on hidden tags for information classification. Because the leak is silent — the attacker simply receives extra data in a legitimate API response — there may be no obvious sign of compromise and no audit-trail anomaly other than endpoint access.
Detection Guidance
The following detection content targets access to the discourse_templates endpoint and the unusual exposure of tag metadata. Since the vulnerability is server-side authorization omission, network-level rules look for privileged-use patterns; host/log-level rules look for the endpoint path and response characteristics. Note that the exact URL path beyond "discourse_templates" is not specified in the advisory, so rules use substring matching.
Sigma Rule
title: Discourse discourse_templates Endpoint Access - Potential Tag Enumeration
id: 9f7c3a2b-1d4e-4f6a-8b2c-3e5a7d9f1c02
status: experimental
description: Detects HTTP requests to the discourse_templates endpoint, which may be abused to enumerate hidden tag names (CVE-2026-72732).
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-72732
author: Valters IT Threat Intelligence
date: 2026/06/12
logsource:
category: web
product: generic
detection:
selection:
http.url|contains: "discourse_templates"
http.method: "GET"
filter_known_admin:
http.url|contains: "/admin"
filter_internal_health:
http.url|contains: "/health"
condition: selection and not 1 of filter_*
falsepositives:
- Legitimate administrative use of the discourse-templates feature
level: medium
tags:
- attack.t1190
- cve.2026.72732
- cwe.862
YARA Rule
rule Discourse_Template_Hidden_Tag_Disclosure
{
meta:
description = "Detect response bodies or log entries exposing tag data from the discourse_templates endpoint (CVE-2026-72732)"
author = "Valters IT Threat Intelligence"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-72732"
cve = "CVE-2026-72732"
date = "2026-06-12"
strings:
$a = "discourse_templates" ascii nocase
$b = "templates_serializer" ascii nocase
$c = "tags" ascii nocase
$d = "tag_groups" ascii nocase
condition:
$a and 2 of ($b, $c, $d)
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-72732 - Discourse discourse_templates tag enumeration attempt"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"discourse_templates"; nocase; classtype:attempted-recon; reference:cve,2026-72732; metadata:created_at 2026_06_12, updated_at 2026_06_12; sid:202672732; rev:1;)
Elastic Detection
any where network.protocol == "http" and http.request.method == "GET" and url.path like "*discourse_templates*"
Splunk SPL Query
index=* (sourcetype="access_combined" OR sourcetype="iis" OR sourcetype="nginx:combined")
uri_path="*discourse_templates*"
| stats earliest(_time) as first_seen latest(_time) as last_seen count by src_ip, user, clientip, status, uri_path
| where count >= 1
| eval severity=case(status=="200","HIGH", status=="403","LOW", status=="401","LOW", true(), "MEDIUM")
| table first_seen, last_seen, src_ip, user, clientip, status, uri_path, count, severity
| sort - first_seen
Wazuh OSSEC Rule
<group name="discourse,">
<rule id="100921" level="7">
<decoded_as>web</decoded_as>
<match>discourse_templates</match>
<description>Discourse discourse_templates endpoint accessed - possible hidden tag name enumeration (CVE-2026-72732)</description>
<group>web_application_attack,</group>
<mitre>
<id>T1190</id>
</mitre>
<info type="cve">CVE-2026-72732</info>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence for this advisory is 2/4 (CLAIMED), meaning a patch is claimed by a single source (OSV) but has not been independently confirmed against the vendor's release artifacts. The NVD description identifies specific fixed versions — 2026.1.6, 2026.5.2, 2026.6.1, and 2026.7.0 — and those should be treated as the authoritative remediation targets. Your organization should verify the claimed fix in your own test environment before production rollout.
Immediate mitigations (no vendor workaround is published):
- Upgrade to the nearest fixed release branch as soon as possible: 2026.1.6, 2026.5.2, 2026.6.1, or 2026.7.0, depending on which release line your instance tracks.
- If an immediate upgrade is not feasible, restrict access to the
discourse_templatesHTTP endpoint at the reverse proxy or WAF layer to administrators only, using URL substring matching. This is a compensating control and will break legitimate end-user template features. - Audit existing accounts for dormant low-privilege users; the vulnerability is only exploitable by authenticated users, so reducing the authenticated attack surface reduces risk.
- Monitor application logs for repeated
discourse_templatesrequests from non-admin accounts and investigate as suspicious activity.
Patch/upgrade steps:
- Confirm your current Discourse version against the fixed range: any version before 2026.1.6, 2026.5.2, 2026.6.1, and 2026.7.0 is affected.
- Because patch confidence is only 2/4, validate the fix in a staging environment: after upgrading, log in as a low-privilege test account, query the
discourse_templatesendpoint, and confirm that hidden/restricted tag names are no longer returned. - After validation, apply the upgrade to production during a maintenance window, reviewing Discourse's standard upgrade and backup procedures.
- Re-run the same validation in production with an auditor account after rollout.
Long-term hardening:
- Enable and enforce tag group permissions consistently across all Discourse categories and tags; audit current tag group definitions for any hidden tags that should be public.
- Integrate the latest Discourse release tracking into your vulnerability-management workflow so future out-of-band security fixes (like this one) are captured even when the authoritative CNA advisory is sparse.
- Add the Sigma/Splunk/Elastic detection content above to your SIEM to establish a baseline of
discourse_templatesaccess; tune the rules to administrative IP ranges to reduce false positives. - Consider applying network segmentation or authenticated reverse-proxy requirements (e.g., SSO) to reduce the likelihood that low-privilege local accounts are available to external attackers.
References
No known threat actor campaigns or in-the-wild exploitation evidence exist for CVE-2026-72732 at the time of writing. The CISA KEV catalog does not list this CVE. The following authoritative references are available:
- NVD Entry — https://nvd.nist.gov/vuln/detail/CVE-2026-72732
- OSV Vulnerability Record — https://osv.dev/vulnerability/CVE-2026-72732
- CWE-862 Missing Authorization — https://cwe.mitre.org/data/definitions/862.html
- Discourse Official Site / Release Downloads — https://www.discourse.org/
- Discourse GitHub Repository (contains the vulnerable plugin path
plugins/discourse-templates/app/serializers/discourse_templates/templates_serializer.rbreferenced in the advisory) — https://github.com/discourse/discourse
Note on OSV package data: the OSV record lists three package entries (a root package and two commit hashes) all marked as "unfixed," which is consistent with the 2/4 patch confidence rating — the OSV source claims a fix exists in the released versions named by the NVD description, but the OSV record itself has not been updated to reflect patched states for those commit-specific references. Verify against your installed build to determine actual exposure.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.