Skip to main content

Discourse CVE-2026-91157

| EUVDEUVD-2026-101302 HIGH
Information Exposure (CWE-200)
2026-10-14 GitHub_M
7.5
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain short upload URL from public phase
  2. Exploit
    Category restricted but flag not reconciled
  3. Execution
    Request upload URL anonymously
  4. Impact
    Retrieve 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.5% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

discourse < 2026.1.9
discourse 2026.7.0-latest, < 2026.7.3
discourse 2026.9.0-latest, < 2026.9.0
discourse 2026.8.0-latest, < 2026.8.1

Affected Packages

euvd discourse fix: 2026.1.9, 2026.7.3, 2026.8.1, 2026.9.0

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

Vendor (GitHub_M) PRIMARY 7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
vuln.today AI 5.9 MEDIUM

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.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N
4.0 AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
None

Lifecycle Timeline

2
Patch available
Oct 14, 2026 - 17:18 EUVD
CVE Published
Oct 14, 2026 - 15:37 cve.org
HIGH 7.5

DescriptionCVE.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

Why It Matters

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.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.5%
Top 60% exploitable
Prevalence
Medium
popular open-source forum platform, common but not ubiquitous enterprise footprint
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
Medium

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

CVE-2025-48954 HIGH POC
8.1 Jun 25

Discourse versions prior to 3.5.0.beta6 contain a reflected cross-site scripting (XSS) vulnerability in social login fun

CVE-2022-46162 CRITICAL POC
9.8 Nov 30

discourse-bbcode is the official BBCode plugin for Discourse. Rated critical severity (CVSS 9.8), this vulnerability is

CVE-2026-27934 HIGH POC
8.7 Mar 19

Unauthorized information disclosure in Discourse discussion platform versions prior to 2026.3.0-latest.1, 2026.2.1, and

CVE-2024-47773 HIGH POC
8.2 Oct 08

Discourse is an open source platform for community discussion. Rated high severity (CVSS 8.2), this vulnerability is rem

CVE-2026-26265 HIGH POC
7.5 Feb 26

Discourse versions prior to 2025.12.2, 2026.1.1, and 2026.2.0 contain an insecure direct object reference (IDOR) in the

CVE-2021-3138 HIGH POC
7.5 Jan 14

In Discourse 2.7.0 through beta1, a rate-limit bypass leads to a bypass of the 2FA requirement for certain forms. Rated

CVE-2026-26077 MEDIUM POC
6.5 Feb 26

Unauthenticated attackers can submit forged webhook payloads to multiple email provider integrations in Discourse versio

CVE-2023-38706 MEDIUM POC
6.5 Sep 15

Discourse is an open-source discussion platform. Rated medium severity (CVSS 6.5), this vulnerability is remotely exploi

CVE-2024-53991 MEDIUM POC
5.9 Dec 19

Discourse is an open source platform for community discussion. Rated medium severity (CVSS 5.9), this vulnerability is r

CVE-2025-48877 CRITICAL
9.8 Jun 09

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

CVE-2023-47121 CRITICAL
9.8 Nov 10

Discourse is an open source platform for community discussion. Rated critical severity (CVSS 9.8), this vulnerability is

CVE-2022-39355 CRITICAL
9.8 Oct 26

Discourse Patreon enables syncronization between Discourse Groups and Patreon rewards. Rated critical severity (CVSS 9.8

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy