Lemmy: Gespeichertes XSS über den Alt-Text von Markdown-Bildern
Ein freigegebenes Mitglied oder eine föderierte Remote-Instanz schleust über den Alt-Text eines Markdown-Bildes gespeichertes JavaScript ein, das im Browser anderer Nutzer ausführt.
Advisory-ID: TP-2026-018
Produkt: Lemmy (föderierte Open-Source-Link-Aggregator- und Diskussionsplattform im Fediverse)
Schwachstellentyp: Gespeichertes Cross-Site-Scripting (CWE-79)
CVE: CVE-2026-54743
CVSS 3.1: 5.4 (Mittel) · CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
Betroffene Versionen: lemmy-ui 0.19.x
Behoben in: lemmy-ui (Fix in #4210)
Hersteller-Advisory: GHSA-2g66-9fr3-ppwj
Gemeldet: 30. Mai 2026
Zusammenfassung
Lemmy ist eine föderierte Open-Source-Plattform für Link-Aggregation und Diskussionen im Fediverse. Das Frontend lemmy-ui rendert Markdown für Beiträge, Kommentare, private Nachrichten und Community-Beschreibungen über mdToHtml, das ein rohes { __html }-Objekt ohne Sanitizer-Pass in den DOM gibt. Der Renderer läuft mit html: false, registriert aber das Plugin markdown-it-html5-embed mit useImageSyntax, das aus  ein <video>-Element mit Text-Fallback baut und den alt-Text dabei ungeschützt in die Fallback-Meldung einsetzt. Im Ergebnis schleust jedes freigegebene Mitglied oder jede föderierte Remote-Instanz über den alt-Text eines Bild-Markdowns gespeichertes HTML/JavaScript ein, das im Browser anderer Nutzer ausführt. In der Standard-Produktionskonfiguration entschärft eine Content Security Policy die Ausführung; der Hersteller hat die Stelle dennoch behoben. turingpoint hat den Ablauf verifiziert und verantwortungsvoll gemeldet.
Ursache
lemmy-ui rendert nutzererzeugten Markdown über mdToHtml und gibt das Ergebnis als rohes { __html }-Objekt ohne Sanitizer in den von Inferno verwalteten DOM. Der Markdown-Renderer ist mit html: false konfiguriert, was literale HTML-Token in der Quelle blockiert, registriert aber zusätzlich das Plugin markdown-it-html5-embed mit useImageSyntax: true. Mit dieser Option wird aus  ein <video>-Element, dessen Text-Fallback das Plugin durch rohe String-Ersetzung des alt-Textes in eine Meldung erzeugt, ohne den alt-Text HTML-zu-escapen. html: false wirkt nicht auf Plugin-generierte Ausgabe, sodass der alt-Text als aktives HTML den DOM erreicht und vom { __html }-Pfad ungefiltert eingefügt wird. Da der gerenderte Inhalt von jedem freigegebenen Mitglied oder jeder föderierten Remote-Instanz stammt, ist die Nutzlast persistent gespeichert und führt im Browser jedes Betrachters aus, sofern keine Content Security Policy greift.
Proof of Concept
Als freigegebenes Mitglied in einem Beitrag, Kommentar, einer privaten Nachricht oder Community-Beschreibung:

Das Plugin markdown-it-html5-embed baut daraus ein <video>-Element und setzt den alt-Text per roher String-Ersetzung in den Text-Fallback ein. Da der alt-Text nicht HTML-escaped wird und html: false für Plugin-Ausgabe nicht greift, erreicht das <img onerror=...> als aktives HTML den DOM und führt im Browser jedes Betrachters aus.
Auswirkung
- Ausführung von Angreifer-JavaScript in der Sitzung jedes Nutzers, der den Beitrag, Kommentar, die Nachricht oder Community-Beschreibung ansieht.
- Persistente, über Federation an Remote-Instanzen verteilbare Nutzlast.
- Sitzungsbezogene Aktionen im Namen des Opfers im Rahmen der lemmy-ui-Oberfläche.
- In der Standard-Produktionskonfiguration durch eine Content Security Policy entschärft.
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.
