Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain short upload URL from public phase
-
ExploitCategory restricted but flag not reconciled
-
ExecutionRequest upload URL anonymously
-
ImpactRetrieve now-private media/attachment
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK
2 techniques across 2 tactics: Collection, Discovery The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires the site-level 'secure uploads' setting to be enabled while 'secure_uploads_pm_only' is off (a non-default configuration), and requires a triggering event: a category changing from public to read-restricted, a category permission change, or category restriction applied during a bulk import. Only uploads that were posted while the category was public are affected (including those in deleted topics); exposure is via their short upload URLs, so an attacker must know or be able to enumerate those URLs. Limiting factors: the bug does not expose content that was private from creation, does not grant write/integrity impact, and does not apply to instances that never enabled secure uploads - substantially narrowing the real-world exposed population below what the 7.5 score suggests. |
| Impact | The input provides a CVSS 3.1 vector of CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N (base 7.5), indicating remote, unauthenticated, low-complexity confidentiality disclosure. However, the description reveals the AC:L rating is questionable: exploitation is not against a default state but depends on a specific sequence - secure uploads must be enabled (a non-default hardening feature), AND a category must transition from public to read-restricted (or have permissions changed during a bulk import), AND the attacker must know or possess the 'short upload URL' for the affected media. This makes the attack opportunistic and dependent on conditions outside the attacker's control, so real-world complexity is higher than AC:L implies. No EPSS score, KEV listing, or POC was supplied: exploitation status is no public exploit identified at time of analysis. There is no SSVC decision data. The signals are therefore mild and partly conflicting - the 7.5 'High' rating overstates practical risk because the vulnerability is a passive residual-exposure bug (stale public accessibility flags) rather than an actively triggerable breach; the attacker gains nothing new to exploit, only continued anonymous reachability of content that was supposed to become private. Net priority: moderate - patch promptly on affected Discourse instances that use secure uploads, but this is not a drop-everything emergency absent evidence of exploitation. |
| Exploit ScenarioDerived | A Discourse forum with secure uploads enabled makes a previously public category read-restricted (or restricts categories during a bulk migration). Attachments and images uploaded while the category was public - including those in since-deleted topics - keep their stale 'public' security flag, so an anonymous user who retained or can enumerate the short upload URL continues to download the now-supposedly-private files. No public exploit code is identified; the attack simply reuses previously known upload URLs. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 14, 2026
Discourse forums with the non-default 'secure uploads' feature enabled could keep serving media and attachments to anonymous visitors after the owning category was made read-restricted, because per-upload security metadata was never reconciled when a category's read_restricted flag flipped or when category permissions changed during a bulk import. Only uploads that were posted while the category was still public are exposed - including uploads attached to topics that were later deleted - and they remain reachable through their short upload URLs, which an attacker must know or enumerate; the vendor's reported CVSS 3.1 base of 7.5 reflects network, unauthenticated, no-interaction access, although our assessment raises complexity to High (AC:H) because both a specific non-default configuration and a triggering permission event are required. The issue is fixed in 2026.9.0, 2026.8.1, 2026.7.3 and 2026.1.9, and no public exploit was identified at time of analysis.
RemediationAI
Vendor-released patch: upgrade to Discourse 2026.9.0, 2026.8.1, 2026.7.3 or 2026.1.9, per advisory GHSA-298h-xgw6-4pv3. The upgrade ships a once-off Jobs::BackfillCategoryUploadSecurity job that re-evaluates existing uploads and marks those in read-restricted categories (including topics that were deleted) as secure, plus new callbacks that enqueue the same reconciliation whenever a category's read_restricted attribute changes or a bulk import applies category restrictions. If an immediate upgrade is impossible, emulate the fix manually: from a Rails console, enqueue Jobs::UpdateCategoryUploadSecurity for each category that was ever switched to read-restricted, or run the equivalent backfill while explicitly scoping with Post.with_deleted - the unfixed code paths read only live topics, so deleted-topic uploads will otherwise be skipped and stay publicly reachable. Re-saving affected topics by hand to force TopicUploadSecurityManager to run is unreliable on unpatched code because of the short-circuiting any? bug, so batch-triggering the jobs is preferable. Requiring authentication site-wide (disabling anonymous browsing) reliably blocks the anonymous retrieval vector but is a heavy usability trade-off for public communities and does not fix the underlying metadata. Note that enabling secure_uploads_pm_only, or disabling secure uploads entirely, is not a remediation: both make the backfill job a no-op and leave category uploads treated as public, so the exposure persists.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Discourse's upload-security model marks an upload as secure when it belongs to a read-restricted context (a private category or PM), typically keyed to an access-control post via Upload#access_control_post; once marked secure, the upload is no longer served to anonymous users through its short /uploads/short-url/ path. Two defects combined to break that invariant (CWE-200, exposure of sensitive information due to a missing authorization-state reconciliation). First, Category had no after-commit hook on changes to read_restricted, so flipping a category from public to restricted (or altering category permissions, including via the generic bulk-import script) never enqueued TopicUploadSecurityManager against the existing topics, leaving previously public uploads flagged secure: false. Second, even when reconciliation did run, the manager used Ruby's short-circuiting Enumerable#any? with a mutating block (post.owned_uploads_via_access_control.any? { |upload| upload.update_secure_status(...) }), so it stopped at the first upload that reported a change and skipped the remaining uploads in the post; the second loop had the equivalent problem, comparing a reference object rather than its target_id. The fix commits replace both loops with explicit iterators that accumulate the change flag, add after_commit :enqueue_upload_security_updates, on: :update, if: :saved_change_to_read_restricted? to Category, enqueue Jobs::UpdateCategoryUploadSecurity from the bulk importer, switch the relevant Post lookups to Post.with_deleted so uploads on deleted topics are reconciled, and introduce a once-off Jobs::BackfillCategoryUploadSecurity job to repair existing installations.
Know when Discourse gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
AV:N and PR:N since anonymous users reach files over the network, but AC:H because it needs non-default secure uploads plus a public-to-restricted transition and knowledge of short URLs; only confidentiality is affected.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Discourse is an open-source discussion platform. Prior to 2026.9.0, 2026.8.1, 2026.7.3, and 2026.1.9, sites with secure uploads enabled did not reconcile existing upload security metadata when a previously public category became read-restricted or when category permissions changed during a bulk import. Media and attachments uploaded while the category was public retained a public accessibility flag and remained reachable by anonymous users through their short upload URLs, including uploads associated with deleted topics. This issue is fixed in versions 2026.9.0, 2026.8.1, 2026.7.3, and 2026.1.9.
Technical POC Analysis
CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor), manifesting as stale authorization metadata: a persisted per-upload access decision that is computed once at upload time and neve…
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Organizations running Discourse forums with the non-default 'secure uploads' feature enabled may continue to serve media and attachments to anonymous visitors even after the owning category has been locked down to a restricted audience. The affected content was published while the category was still public and remains reachable through direct upload links - including files attached to topics that were later deleted - so leadership should treat previously controlled community material as potentially public, with attendant confidentiality and compliance exposure for the organization operating the forum.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Discourse versions prior to 3.5.0.beta6 contain a reflected cross-site scripting (XSS) vulnerability in social login fun
discourse-bbcode is the official BBCode plugin for Discourse. Rated critical severity (CVSS 9.8), this vulnerability is
Unauthorized information disclosure in Discourse discussion platform versions prior to 2026.3.0-latest.1, 2026.2.1, and
Discourse is an open source platform for community discussion. Rated high severity (CVSS 8.2), this vulnerability is rem
Discourse versions prior to 2025.12.2, 2026.1.1, and 2026.2.0 contain an insecure direct object reference (IDOR) in the
In Discourse 2.7.0 through beta1, a rate-limit bypass leads to a bypass of the 2FA requirement for certain forms. Rated
Unauthenticated attackers can submit forged webhook payloads to multiple email provider integrations in Discourse versio
Discourse is an open-source discussion platform. Rated medium severity (CVSS 6.5), this vulnerability is remotely exploi
Discourse is an open source platform for community discussion. Rated medium severity (CVSS 5.9), this vulnerability is r
Discourse versions prior to 3.4.4 (stable), 3.5.0.beta5 (beta), and 3.5.0.beta6-dev (tests-passed) contain a critical vu
Discourse is an open source platform for community discussion. Rated critical severity (CVSS 9.8), this vulnerability is
Discourse Patreon enables syncronization between Discourse Groups and Patreon rewards. Rated critical severity (CVSS 9.8
EUVD-2026-101302
NVD
CVE.org
EPSS
GitHub
Exploit-DB