Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate with posting privileges
-
DeliveryCraft iframe src with encoded userinfo
-
ExploitBypass allowed_iframes prefix check
-
ExecutionPersist iframe in post
-
ImpactViewers load attacker cross-origin content
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V2 - Validation and Business Logic Input validation, allowlisting
|
| Exploitation Conditions | Requires an authenticated Discourse account with posting privileges (PR:L) and a site where the allowed_iframes prefix policy is configured to permit at least one iframe host prefix. The attacker must craft an iframe src containing encoded userinfo so the decoded form the sanitizer validates differs from the stored src the browser interprets. Exploitation is limited by the need for a valid posting account and by the fact that impact is confined to rendering attacker-controlled cross-origin content in viewers' browsers (no direct RCE or availability loss); default configurations that heavily restrict or disable iframes reduce exposure. |
| Impact | This is a genuine but moderate-severity issue, not a high-priority emergency. The CVSS 3.1 score of 5.4 (AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N) reflects a network-reachable flaw requiring authentication (PR:L - an account with posting privileges) and yielding only Low confidentiality and Low integrity impact with no availability effect. No EPSS score, KEV listing, or public POC is present in the provided data, so this is 'no public exploit identified at time of analysis.' The vulnerability is a sanitizer allowlist-bypass: the Discourse post sanitizer decoded and validated the iframe src differently from the stored value, so an encoded userinfo segment let the browser resolve an attacker-controlled host while the allowed_iframes prefix check accepted the encoded URL as allowed. Real-world risk is bounded because exploitation requires a valid posting account and the allowed_iframes feature to be configured, and the impact is confined to rendering attacker cross-origin content (phishing/clickjacking/limited content injection) rather than direct code execution. This is a defense-in-depth sanitizer fix worth patching promptly on public/large forums but is not a critical mass-exploitation candidate. |
| Exploit ScenarioDerived | An authenticated user with posting privileges crafts a post containing an <iframe> whose src encodes userinfo so that the allowlist prefix check passes against the encoded form while the browser resolves an attacker-controlled host. Once persisted, every viewer of that post silently loads attacker-controlled cross-origin content (e.g., a phishing or credential-harvesting page framed as trusted forum content). No public exploit code is identified in the provided data, though the fix and regression tests are public in PR #42882. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 24, 2026
Stored cross-origin iframe injection in Discourse allows an authenticated user with posting privileges to bypass the allowed_iframes prefix policy by embedding an iframe whose src contains encoded userinfo, so the sanitizer's decoded validation passes while the browser resolves an attacker-controlled host. Affected releases are those prior to 2026.1.8, 2026.6.3, 2026.7.2, and 2026.8.0; the assessed CVSS 3.1 vector is AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N (5.4), reflecting limited confidentiality and integrity impact and no availability loss. Exploitation requires a valid posting account and a site where at least one iframe host prefix is permitted, and there is no public exploit identified at time of analysis; the risk is genuine but moderate rather than an emergency.
RemediationAI
Vendor-released patch: upgrade to Discourse 2026.1.8, 2026.6.3, 2026.7.2, or 2026.8.0 - whichever matches your release track - as documented in advisory GHSA-54vw-chv3-wjpv (https://github.com/discourse/discourse/security/advisories/GHSA-54vw-chv3-wjpv) and implemented via pull request https://github.com/discourse/discourse/pull/42882 with commits 0a8015e6c7a5079981843721494d30c9a91f5415, 1304b0c04f87534053b0d574ae5a9b9ba13dd590, bac7dd1201911851462483271b4567246fa1309d, and fed3a58c48412ce7207b72a4629ddbc44482cd64. If an immediate upgrade is not possible, the most effective compensating control is to empty or drastically narrow the allowed_iframes site setting so the vulnerable prefix-matching branch is never exercised; the trade-off is that legitimate embedded content (video previews, trusted third-party widgets) stops rendering inside posts. Where embedded content must be retained, restrict the allowlist entries to exact, immutable prefixes without wildcards and avoid trusting user-influenced hosts, then audit existing posts for stored iframe markup pointing at unexpected origins and remove it. Reducing the population able to post (trust-level or group restrictions) lowers exposure but does not eliminate it for existing members, so pairing it with the configuration change is recommended. Also review the other issues hardened in the same PR in case your version predates those fixes as well: LIKE-wildcard escaping in URL lookups, mention href encoding, and the video placeholder attribute-breakout guard.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 4 packages in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Discourse is a Ruby on Rails plus Ember.js discussion platform that renders user-authored posts through a server-side and client-side HTML sanitizer. At issue is CWE-20 improper input validation in the iframe allowlisting logic: the site setting allowed_iframes defines URL prefixes that are permitted for embedded iframes, but the sanitizer checked a decoded/normalized form of the src while persisting and later rendering the original encoded src. By placing encoded userinfo into the URL, an attacker could make the decoded form appear to match an allowed prefix even though the browser parses the authority component differently, yielding a same-looking-but-actually-cross-origin frame. The associated upstream pull request (discourse/discourse#42882) bundles related hardening in the same code paths, including escaping LIKE wildcards with sanitize_sql_like in has_url.rb, URI-encoding actor names in mention hrefs (encodeURIComponent on userPath in small-action and nested-activity-log components), and rejecting video placeholder sources containing a double quote to prevent attribute breakout in video-placeholder.js. The CPE cpe:2.3:a:discourse:discourse:*:*:*:*:*:*:*:* identifies the Discourse application as the sole affected product.
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:L/UI:N/S:U/C:L/I:L/A:N
Network-reachable stored injection needing an authenticated posting account (PR:L); rendering attacker cross-origin content yields Low confidentiality/integrity, no availability impact, same-origin scope unchanged.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Discourse is an open-source discussion platform. Prior to 2026.1.8, 2026.6.3, 2026.7.2, and 2026.8.0, the Discourse post sanitizer allowed a stored cross-origin iframe to bypass the allowed_iframes prefix policy when the iframe src contained encoded userinfo. The sanitizer validated a decoded form differently from the stored iframe src, allowing the browser to interpret an attacker-controlled host while the allowlist check accepted the encoded URL as an allowed prefix. An authenticated user with posting privileges could persist the iframe in a post and cause attacker-controlled cross-origin content to be rendered. This issue is fixed in versions 2026.1.8, 2026.6.3, 2026.7.2, and 2026.8.0.
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
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-86298
NVD
CVE.org
EPSS
GitHub
Exploit-DB