Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessEnroll in course as student
-
DeliveryPost discussion with CSS markup in title
-
ExploitUnsanitized title stored in notification content
-
ExecutionDigest/batched email renders title as safe HTML
-
PersistVictim learner opens email in CSS client
-
ImpactTracking pixel fires or spoofed/phishing content shown
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires an attacker enrolled as a student in a course who can submit a discussion post_title (via lms/djangoapps/discussion/rest_api/discussions_notifications.py). The target must have digest or batched email notifications enabled - the immediate-email path is NOT affected because it strips title markup and renders a separately sanitized body. Exploitation further requires a victim (another learner) to open the resulting notification email in an email client that renders CSS/HTML. Limiting factors: course enrollment/authentication of the poster, victim user interaction (opening the email), the non-default reliance on digest/batched (not immediate) email delivery, and impact bounded to tracking/spoofing/phishing rather than code execution. Applies to Open edX from Redwood up to (not including) Ulmo and Verawood.1. |
| Impact | Real-world risk is moderate-to-low despite the 6.1 vendor CVSS. All exploitation signals point to a low-urgency issue: no EPSS score, not in CISA KEV, and no public exploit code (no public exploit identified at time of analysis). The CVSS vector (AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N) shows only Low confidentiality and Low integrity impact with no availability effect, and requires victim user interaction (UI:R - a second learner must open a digest/batched email in a CSS-rendering client). A key data conflict exists: the vector lists PR:N (unauthenticated), but the description states the injecting party must be 'an enrolled student' who can place markup in a discussion post_title - that is a course-enrolled, authenticated actor, so PR:L is more defensible. Also note the impact class is overstated in name: CWE-79 tags this XSS, but the source-code fix and description show it is HTML/CSS injection into email (email clients do not execute JavaScript), enabling email-open tracking, content spoofing and phishing - not script execution or session theft. Bottom line: legitimate to patch on a normal cycle, but not an emergency; the phishing/tracking payoff and required enrollment + victim email-open make it a targeted-abuse issue rather than a mass-exploitable one. |
| Exploit ScenarioDerived | An enrolled student creates or edits a discussion thread whose title contains CSS-capable markup (e.g. a <style> block or tracking-styled element). When the platform generates digest or batched-email notifications, the unsanitized post_title is rendered as safe HTML in digest_content.html, so when another learner opens the email in a CSS-rendering client the injected markup fires - enabling email-open tracking, visual content spoofing, or a phishing lure. No public exploit code exists, but the fix commit and regression tests concretely demonstrate the injection payloads. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 18, 2026
HTML/CSS injection in Open edX Platform discussion-notification emails allows an authenticated, enrolled student to embed CSS-capable markup in a discussion post title, which is then interpolated without sanitization into digest and batched-email notification content and rendered as trusted HTML; when another learner opens that email in a client that renders CSS, the attacker gains email-open tracking, content spoofing, and a credible phishing vector. The issue affects releases from Redwood up to (but not including) Ulmo and prior to Verawood.1, and is fixed in Ulmo and Verawood.1. Exploitation requires course enrollment, digest or batched (non-immediate) notification delivery, and victim interaction with the email, and no public exploit has been identified at time of analysis.
RemediationAI
Upgrade to a Vendor-released patch: Ulmo (release/ulmo.4) or Verawood.1, which escape user-controlled notification context values while preserving structural tag keys; operators running Redwood or an interim release should apply the upstream commits 2af03d21b4142e53e375c7f3699b313e92ec5121, 52f2b3bb3e6fac2601c29e8f926c81498d20bb0b, and 5eae6e51a8797cd3b87cc132f5de73d52561c4d7 as backports if an immediate version jump is not feasible. Detailed guidance is in the vendor advisory at https://github.com/openedx/openedx-platform/security/advisories/GHSA-rv5w-f4r5-h77g. Where patching must be deferred, the most direct mitigation is to disable digest and batched email notifications for the deployment so the affected rendering path is never reached, since the immediate-email path strips title markup and renders a separately sanitized body; the trade-off is that learners lose consolidated digest mail and notification volume increases per-event. Supplementary controls include restricting who may post to discussion forums pending the fix and advising recipients to block remote content and CSS in their mail clients, which reduces tracking and spoofing fidelity but does not eliminate the underlying content injection. Note that KEV and exploit signals are absent, so exposure is bounded to tracking, spoofing, and phishing against users who open notification email in a CSS-rendering client, not code execution.
Affected VersionsENISA
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is a CWE-79 improper-neutralization issue in the Open edX notifications Django app. get_notification_content in openedx/core/djangoapps/notifications/base_notification.py interpolates a context dictionary into per-notification-type content templates using Python str.format, and post_title values originating from lms/djangoapps/discussion/rest_api/discussions_notifications.py were passed through unescaped. add_additional_attributes_to_notifications in openedx/core/djangoapps/notifications/email/utils.py then attaches that content to the notification, and digest_content.html renders it with the |safe filter, deliberately bypassing Django's autoescaping. Because digest and batched emails are rich HTML, injected <style> or other CSS-capable markup is interpreted by the recipient's mail client rather than displayed as text. The immediate-email path is unaffected: it discards the title markup and renders a separately sanitized body. The upstream fix adds django.utils.html.escape to every context value before formatting, exempting only the structural keys 'p' and 'strong' that must remain real HTML tag names for the templates; regression tests assert that <style> and <script> payloads are escaped while structural tags are preserved. This maps to the assessed CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N, where scope changes because the crafted content is delivered and interpreted in an external mail client context.
Know when Openedx 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:R/S:C/C:L/I:L/A:N
Injecting party must be an enrolled student so PR:L not PR:N; victim must open the email (UI:R); injected content crosses into another user's email context (S:C); impact limited to tracking/spoofing (C:L/I:L, A:N).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
DescriptionCVE.org
Open edX Platform enables the authoring and delivery of online learning at any scale. From Redwood until Ulmo and Verawood.1, the add_additional_attributes_to_notifications function in openedx/core/djangoapps/notifications/email/utils.py assigns notification content without sanitizing discussion-title values produced by get_notification_content in openedx/core/djangoapps/notifications/base_notification.py. An enrolled student can place CSS-capable markup in the post_title value supplied by lms/djangoapps/discussion/rest_api/discussions_notifications.py. Digest and batched-email rendering then passes that value through openedx/core/djangoapps/notifications/templates/notifications/digest_content.html as safe HTML, allowing email-open tracking and content spoofing or phishing when another learner opens a CSS-rendering client. The immediate-email path is not affected because it strips title markup and renders a separately sanitized body. This issue is fixed in Ulmo and Verawood.1.
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
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
Drag and Drop XBlock v2 implements a drag-and-drop style problem, where a learner has to drag items to zones on a target
Server-side request forgery in the Open edX Platform SAML provider-data sync endpoint lets an authenticated user holding
This openedx-translations repository contains translation files from Open edX repositories to be kept in sync with Trans
Missing authorization on the `set_course_mode_price()` instructor endpoint in Open edX Platform allows any authenticated
Server-Side Request Forgery with full response exfiltration in Open edX Platform's Studio CMS video download endpoint al
Open edX Platform versions prior to commit 76462f1e5fa9b37d2621ad7ad19514b403908970 suffer from an open redirect vulnera
Stored cross-site scripting (XSS) via CSS injection in Open edX Platform allows enrolled students to inject arbitrary CS
LTI Consumer XBlock implements the consumer side of the LTI specification enabling integration of third-party LTI provid
Open edX Platform from maple release through ulmo allows unauthenticated attackers to bypass email verification by explo
OAuth nonce replay attacks against Open edX LMS's LTI 1.1 Provider endpoint allow an attacker who intercepts a valid LTI
Authenticated course authors or staff holding course-import permission in Open edX Studio (CMS) can break out of the int
EUVD-2026-83443
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB