Opencast: Gespeichertes XSS im Paella-Player über Untertitel-Cues (WebVTT/DFXP)

Ein Inhaltsautor ohne Administratorrechte lädt eine Untertiteldatei mit HTML im Cue-Text hoch; der Paella-Player schreibt den Cue ungeprüft per innerHTML in das DOM, sodass beim Ansehen mit aktivierten Untertiteln JavaScript in der Sitzung jedes Betrachters ausgeführt wird.

Advisory-ID: TP-2026-049
Produkt: Opencast (Open-Source-System für die Aufzeichnung, Verwaltung und Auslieferung von Vorlesungs- und Videoinhalten)
Schwachstellentyp: Gespeichertes Cross-Site-Scripting (CWE-79)
CVE: CVE-2026-77615
CVSS 3.1: 8.7 (Hoch) · CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
Hersteller-Advisory: GHSA-m6c8-jcw2-5r25
Betroffene Versionen: opencast-engage-paella-player-7 und -8 < 19.7 und < 20.2 (verifiziert auf 18.8 und 20.0, Docker allinone)
Behoben in: 19.7, 20.2
Gemeldet: 17. Juni 2026

Zusammenfassung

Opencast ist ein Open-Source-System für die Aufzeichnung, Verwaltung und Auslieferung von Vorlesungs- und Videoinhalten; der ausgelieferte Paella-Player blendet Untertitel im Browser des Betrachters ein. Der Player schreibt den Text jedes aktiven Untertitel-Cues ungeprüft per innerHTML in das DOM, sodass HTML in einem WebVTT- oder DFXP-Cue zu lebendem DOM im Opencast-Origin wird. Ein Inhaltsautor ohne Administratorrechte lädt eine Untertiteldatei mit einem HTML-Payload im Cue-Text hoch und veröffentlicht das Event; /search/episode.json liefert die Untertitelspur anschließend an jeden, auch an anonyme Betrachter. Sobald ein Betrachter Untertitel aktiviert, wird das Skript in seiner Sitzung ausgeführt, was den Diebstahl von Sitzungs- und CSRF-Token sowie die Übernahme einer Administrator-Sitzung erlaubt. turingpoint hat die Kette live auf 18.8 und dem aktuellen 20.0 verifiziert (Ausführung im Browser, <img onerror> im Untertitelcontainer) und an den Hersteller gemeldet, der sie in 19.7 und 20.2 behoben hat.

Ursache

Die Untertitel-Leinwand des Paella-Players hängt jeden aktiven Cue per _captionsContainer.innerHTML += cue an (gebündeltes paella-core, ausgeliefert unter /paellaN/ui/paella-player.js), sodass HTML im Cue-Text zu lebendem DOM im Engage-Origin wird. Der Untertiteleintrag entsteht aus jedem Medienpaket-Element mit captions/*-Flavor (modules/engage-paella-player-7/src/js/EpisodeConversor.js:392), und /search/episode.json liefert Manifest und Untertiteldatei auch an anonyme Clients. Die WebVTT- und DFXP-Plugins sind standardmäßig aktiv (etc/ui-config/mh_default_org/paella7/config.json:571/:574), und der Upload „Subtitles" (captions/source, .vtt) ist eine Standardoption (etc/listproviders/event.upload.asset.options.properties). Der Workflow partial-process-uploaded-captions schneidet und markiert die Datei nur, bereinigt sie aber nie, und es gibt weder CSP noch X-Content-Type-Options. Ein Inhaltsautor ohne Administratorrechte (ROLE_API_EVENTS_CREATE/ROLE_UI_TASKS_CREATE) hinterlegt so den Cue, der bei jedem Betrachter feuert, der Untertitel aktiviert, einschließlich anonymer Betrachter und angemeldeter Administratoren.

Proof of Concept

# 1. Untertiteldatei (WebVTT) mit HTML im Cue-Text, als Inhaltsautor hochladen:
WEBVTT

00:00:00.000 --> 00:00:10.000
<img src=x onerror="alert(document.domain)">

# 2. Event veröffentlichen; /search/episode.json liefert die Untertitelspur an jeden Betrachter.
# 3. Betrachter öffnet den Player und aktiviert Untertitel:
#    der Cue landet per innerHTML += im _captionsContainer -> das Skript feuert.

Der Cue-Text wird ohne Maskierung an _captionsContainer.innerHTML angehängt, sodass <img src=x onerror=…> als echtes DOM-Element geparst wird und der Handler im Opencast-Origin läuft. Weil die Untertitelspur anonym über /search/episode.json ausgeliefert wird, trifft die Ausführung jeden Betrachter des veröffentlichten Videos, der Untertitel einschaltet.

Auswirkung

  • Ausführung von JavaScript im Opencast-Origin in der Sitzung jedes Betrachters, der Untertitel aktiviert, einschließlich anonymer und angemeldeter Nutzer.
  • Diebstahl von Sitzungs- und CSRF-Token sowie Aktionen über die Opencast-API im Namen des Opfers.
  • Übernahme einer Administrator-Sitzung, wenn ein Administrator das Video mit aktivierten Untertiteln ansieht (Inhaltsautor ohne Sonderrechte → Administrator).
  • Speicherung durch einen Inhaltsautor ohne Administratorrechte; Auslösung bei jedem Betrachter mit aktivierten Untertiteln.

Referenzen

Steckt so etwas in Ihrer Software?

Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.