Mastodon: Persistenter föderierter DoS über unbehandelten NoMethodError im MATH_TRANSFORMER

Ein beliebiger entfernter ActivityPub-Server kann mit einer einzigen signierten Nachricht die föderierte öffentliche Timeline jeder erreichbaren Mastodon-Instanz dauerhaft mit HTTP 500 lahmlegen, ohne einen Account auf dem Ziel zu besitzen.

Advisory-ID: TP-2026-006
Produkt: Mastodon (föderiertes soziales Netzwerk / Microblogging-Server)
Schwachstellentyp: Denial of Service durch unbehandelte Ausnahme (CWE-755)
CVE: CVE-2026-50129
CVSS 3.1: 7.5 (Hoch) · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Hersteller-Advisory: GHSA-qrgq-9fx2-vf2r
Behoben in: 4.5.11, 4.4.18, 4.3.24
Gemeldet: 22. Mai 2026

Zusammenfassung

Mastodon ist ein weit verbreiteter Server für ein föderiertes soziales Netzwerk (ActivityPub). Eingehende HTML-Inhalte föderierter Statuses werden durch einen Sanitizer geführt, dessen MATH_TRANSFORMER-Lambda bei einem <annotation>-Element ohne encoding-Attribut einen NoMethodError wirft. Der einzige Rettungsblock im Formatierungspfad fängt nur ArgumentError ab, sodass die Ausnahme bis zur Rails-Fehlerbehandlung durchpropagiert und einen HTTP 500 erzeugt. Da Mastodon den Roh-HTML föderierter Inhalte ungeprüft speichert, crasht jeder spätere Render-Pfad dieses Status erneut. turingpoint hat den End-to-End-Ablauf als stored, anonym auslösbaren und föderationsverstärkten DoS gegen eine laufende Instanz verifiziert.

Ursache

Mastodon sanitisiert eingehenden föderierten Status-HTML über Sanitize.fragment(..., MASTODON_STRICT), dessen MATH_TRANSFORMER-Lambda <math><semantics><annotation>-Knoten in Text umwandelt (lib/sanitize_ext/sanitize_config.rb:75-104). Fehlt dem <annotation>-Element das encoding-Attribut, liefert node.attributes['encoding'] nil, und der direkt nachgeschaltete .value-Aufruf wirft NoMethodError: undefined method 'value' for nil (lib/sanitize_ext/sanitize_config.rb:87). Der einzige Rettungsblock im Formatierungspfad fängt nur ArgumentError ab (app/lib/html_aware_formatter.rb:23), sodass der NoMethodError ungefangen bis zur Rails-Fehlerbehandlung durchpropagiert und einen HTTP 500 erzeugt. Nur entfernte, föderierte Statuses lösen den Bug aus, weil lokale Posts über linkify/TextFormatter ohne Math-Transform laufen, während entfernte Inhalte über reformat durch den MATH_TRANSFORMER geführt und ihr Roh-HTML ungeprüft persistiert werden (app/lib/activitypub/parser/status_parser.rb:48). Da auch die Admin-Moderationsansicht denselben Formatierungspfad aufruft (app/views/admin/shared/_status_content.html.haml:13), crasht jede Darstellung des vergifteten Status erneut und die Admin-UI kann ihn nicht mehr anzeigen.

Proof of Concept

Eine signierte ActivityPub-Nachricht einer beliebigen entfernten Instanz reicht aus. Der <annotation>-Knoten trägt kein encoding-Attribut:

POST /inbox   (HTTP-Signature eines entfernten ActivityPub-Actors)

{
  "type": "Create",
  "object": {
    "type": "Note",
    "content": "<math><semantics><annotation>x</annotation></semantics></math>"
  }
}

Die Instanz akzeptiert die Aktivität (HTTP 202) und speichert den Roh-HTML. Beim ersten Rendern wirft der .value-Aufruf im MATH_TRANSFORMER den NoMethodError; weil der Status persistiert ist, liefert danach jeder Aufruf der föderierten öffentlichen Timeline sowie jeder weitere Render-Pfad (RSS, Suchindex, ausgehende Föderation) erneut HTTP 500.

Auswirkung

  • Eine einzige signierte Create{Note}-Nachricht einer beliebigen entfernten Instanz vergiftet die föderierte öffentliche Timeline jeder erreichbaren Mastodon-Instanz, anonym und ohne Account auf dem Ziel.
  • Jeder Render-Pfad des Status (öffentliche Timeline, RSS-Feed, Suchindex, ausgehende Föderation an Follower) endet in HTTP 500.
  • Die Admin-Moderationsoberfläche ruft denselben Formatierungspfad auf und kann den Status nicht anzeigen; eine Bereinigung erfordert direktes Löschen per Datenbank oder Rails-Konsole.
  • Persistente Beeinträchtigung der Verfügbarkeit von Timeline und Moderation bis zur manuellen Entfernung des Status.

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.