Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-32722 — Bloomberg Memrays Stored XSS über nicht maskierte Befehlszeilen-Metadaten | Kitploit
Tools/GitHubGitHub/0xmrma/cve-2026-32722
Statische Code-Analyse (SAST)SchwachstellenanalyseWebanwendungs-ExploitationPenetrationstestsPapers & ForschungLernen & Bildung
GitHub0xmrma/cve-2026-32722

CVE-2026-32722

Bloomberg Memrays Stored XSS über nicht maskierte Befehlszeilen-Metadaten

Repository anzeigen
17vor 5 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-32722

Bloomberg Memray: Stored XSS über nicht escapte Befehlszeilen-Metadaten

Einleitung

Ich stieß auf dieses Problem, als ich Memray, den Python-Speicherprofiler von Bloomberg, mit einer einfachen Frage im Hinterkopf untersuchte:

Können angreiferkontrollierte Laufzeit-Metadaten unsicher in browser-gerenderte Berichtsausgaben gelangen?

In diesem Fall lautete die Antwort: ja.

Der Fehler lag im Pfad zur HTML-Berichtserstellung von Memray, wo Befehlszeilen-Metadaten ohne Escaping in einen im Browser geöffneten Bericht gerendert wurden. Dadurch wurde ein operatives Feld zu einer ausführbaren HTML-Senke, was letztendlich zu CVE-2026-32722 führte.

Projekt: Memray auf GitHub
Advisory: GHSA-r5pr-887v-m2w9 /CVE-2026-32722

photo0

Angriffskette

attacker-controlled argv → metadata.command_line → HTML template sink without escaping → raw markup in generated report → browser-side JavaScript execution


Was Memray tut

Memray ist ein Python-Speicherprofiler.

Er instrumentiert einen Python-Prozess, zeichnet das Allokationsverhalten auf und erstellt Berichte, die Entwicklern helfen zu verstehen:

  • wo Speicher allokiert wird
  • welche Aufrufpfade dafür verantwortlich sind
  • wie die maximale Speicherauslastung aussieht
  • wie sich der Speicher im Laufe der Zeit verändert

Einige dieser Berichte werden als HTML ausgegeben und im Browser geöffnet.

Das macht die Berichtserstellung zu einer echten Sicherheitsgrenze.

Die relevante Frage ist nicht, ob Memray ein „lokales Tool“ ist.
Die relevante Frage ist, ob angreiferkontrollierte Daten unsicher in browser-gerenderte Ausgaben gelangen können.

In diesem Fall konnten sie das.


Warum dieser Fehler einen Blick wert war

Viele unterschätzen Entwicklerwerkzeuge.

Das ist ein Fehler.

Sobald ein Tool:

  • Laufzeit-Metadaten aufzeichnet,
  • angreiferbeeinflusste Werte speichert,
  • und sie später in HTML rendert,

übernimmt es dieselben Risiken bei der Ausgabe-Kodierung wie eine Webanwendung.

Das war hier das Kernproblem.

Dieser Fehler lag nicht in der Profiling-Logik. Er lag nicht in der Allokationsverfolgung. Er lag nicht in der nativen Speicherverwaltung.

Es war ein klassischer Fehler an der Vertrauensgrenze:

  • nicht vertrauenswürdige Metadaten gelangten ins System,
  • erreichten eine HTML-Senke,
  • und wurden ohne Escaping gerendert.

Das reicht aus, um eine echte Sicherheitslücke zu erzeugen.


Die Grenze, auf die ich mich konzentrierte

Ich bin nicht mit Fuzzing zufälliger CLI-Optionen oder der Jagd nach Abstürzen an Memray herangegangen.

Der stärkere Ansatz war, zuerst die Sicherheitsoberfläche mit der höchsten Erfolgswahrscheinlichkeit zu identifizieren.

Für Memray war das die HTML-Berichtserstellung.

Warum?

Weil HTML-Ausgaben eine Browser-Senke einführen und Browser-Senken gewöhnliche Metadatenfehler in Sicherheitsprobleme verwandeln, wenn:

  • die Eingabe angreiferbeeinflusst ist,
  • die Ausgabe nicht escapt ist,
  • und der Browser das Ergebnis als Markup statt als Text interpretiert.

Genau das ist hier passiert.


Grundursache

Der Fehler lässt sich auf zwei Zeilen reduzieren.

In:

root@kitploit:~
def get_render_environment() -> jinja2.Environment:
    loader = jinja2.PackageLoader("memray.reporters")
    env = jinja2.Environment(loader=loader)

wird die Jinja-Umgebung ohne Autoescape erstellt.

Dann in:

root@kitploit:~
Command line: <code>{{ metadata.command_line }}</code><br>

wird metadata.command_line direkt in HTML gerendert.

Das ist die gesamte Sicherheitslücke.

Warum dies ausnutzbar ist

Weil metadata.command_line angreiferbeeinflusst ist.

Memray zeichnet die Befehlszeile auf, mit der das profilierte Programm ausgeführt wurde. Das bedeutet, dass benutzerkontrollierte Werte aus argv als Metadaten erhalten bleiben und später in den Bericht eingefügt werden.

Die Exploit-Kette ist also unkompliziert:

  • der Angreifer kontrolliert den Inhalt der Befehlszeile
  • Memray speichert ihn in metadata.command_line
  • das Template gibt ihn in HTML aus
  • die Umgebung escapt ihn nicht automatisch
  • der Browser parst ihn als aktives Markup

Das verwandelt Metadaten in ausführbaren Browser-Inhalt.


Was dies zu einem Sicherheitsproblem macht, nicht nur zu schlechtem Rendering

Der wichtige Unterschied ist die Ausführung.

Viele Fehler erzeugen fehlerhaftes HTML. Das allein reicht nicht aus.

Hier war angreiferkontrollierter Inhalt nicht nur im Seitenquelltext sichtbar. Er wurde vom Browser als aktives HTML interpretiert und als JavaScript ausgeführt.

Das ist der Unterschied zwischen:

  • beschädigter Formatierung
  • und einer echten XSS-Senke

Die Frage war also nicht:

„Kann HTML im Bericht erscheinen?“

Die eigentliche Frage war:

„Kann angreiferkontrolliertes HTML ausführbar werden, wenn der Bericht geöffnet wird?“

Die Antwort war ja.


PoC

Mein erster Reproduktionsversuch bestand aus einem expliziten Skript plus einem angreiferkontrollierten Argument:

root@kitploit:~
cat > victim.py <<'PY'
x = [b"A" * 1024 for _ in range(1000)]
print("done")
PY

python -m memray run -o poc.bin victim.py ''
python -m memray flamegraph -o poc.html poc.bin

Das erzeugte HTML enthielt rohes, angreiferkontrolliertes Markup:

root@kitploit:~
Command line: <code>~/memray/src/memray/__main__.py run -o poc.bin victim.py </code><br>

Das Öffnen oder Aktualisieren des erzeugten Berichts löste die JavaScript-Ausführung aus.

Das belegte die Kernaussage:

  • der Wert war nicht escapt,
  • der Browser parste ihn als Markup,
  • und die Senke war ausführbar.

Später, während der koordinierten Offenlegung, vereinfachte der Maintainer den Reproduktionsversuch weiter:

root@kitploit:~
python -m memray run -o poc.bin -c '# '

Diese Version ist besser, weil sie die anfällige Grenze direkter isoliert:

  • keine zusätzliche Datei
  • keine zusätzliche Anwendungslogik
  • nur angreiferkontrollierter Befehlszeileninhalt, der in die Berichts-Pipeline gelangt

Warum dieses Payload gewählt wurde

Das Payload war absichtlich einfach:

root@kitploit:~

Es geht nicht um ausgefallene Payloads.

Es ist ein sauberer Ausführungstest, weil:

  • es keine externe Infrastruktur erfordert
  • es im gerenderten HTML offensichtlich ist
  • es die HTML-Interpretation sofort beweist
  • es die browser-seitige Ausführung beweist, ohne sich auf Remote-Inhalte zu verlassen

Für diese Klasse von Fehlern reicht das.


Validierung des Umfangs

Ein einziger Berichtstyp hätte bereits ausgereicht, um das Problem zu rechtfertigen.

Aber ich wollte wissen, ob das Problem isoliert oder strukturell war.

Ich bestätigte dasselbe Verhalten bei:

  • Flamegraph-Berichten
  • Tabellen-Berichten
  • mit --no-web erzeugten Flamegraph-Berichten

Das war aus zwei Gründen wichtig.

Erstens

Es zeigte, dass die anfällige Senke über mehrere HTML-Ausgaben hinweg wiederverwendet wurde.

Zweitens

Es bewies, dass der Fehler nicht von externen, auf CDNs gehosteten Ressourcen abhing.

--no-web reproduzierte das Problem weiterhin, was bedeutet, dass das Problem in Memrays eigenem generierten HTML und der Template-Verarbeitung lag, nicht im Verhalten von Remote-JS. Das machte den Fall deutlich stärker.


Warum dies als niedriger Schweregrad eingestuft wurde

Die Hauptsorge des Maintainers war die praktische Kontrolle durch den Angreifer.

Das ist fair.

Dies ist nicht die Art von Problem, bei der ein nicht authentifizierter Remote-Angreifer einen exponierten HTTP-Endpunkt trifft und sofortige Auswirkungen erzielt.

Die Ausnutzungsbedingung ist enger:

  • der Angreifer beeinflusst die Befehlszeileneingabe
  • ein Opfer öffnet später den erzeugten Bericht in einem Browser

Die realistische Einstufung war also ein niedriger Schweregrad.

Das macht es nicht zu einem schwachen Fehler.

Beim Schweregrad geht es um Ausnutzungsbedingungen und wahrscheinliche Auswirkungen. Bei der Gültigkeit geht es darum, ob das Problem real ist.

Dieses Problem war eindeutig real:

  • angreiferkontrollierte Quelle
  • HTML-Senke
  • fehlendes Escaping
  • tatsächliche JavaScript-Ausführung
  • eindeutige Behebung

Deshalb wurde daraus trotzdem ein CVE.


Analyse der Behebung

Die Behebung war minimal und korrekt.

Der Maintainer änderte:

root@kitploit:~
{{ metadata.command_line }}

zu:

root@kitploit:~
{{ metadata.command_line|e }}

Das ist die richtige Behebung, weil sie die anfällige Senke direkt adressiert.

Anstatt rohes Markup wie dieses auszugeben:

root@kitploit:~

gibt das Template nun escapten Text aus:

root@kitploit:~
&lt;img src=x onerror=alert(1)&gt;

Das erhält den Informationswert des Befehlszeilenfelds und entfernt gleichzeitig den Browser-Ausführungspfad.

Der Maintainer prüfte auch den restlichen Template-Kontext und kam zu dem Schluss, dass:

  • mehrere Felder numerisch waren
  • einige Zeichenketten vollständig von Memray kontrolliert wurden
  • skriptgebundene Werte mit |tojson gerendert wurden

Das Problem wurde also korrekt auf metadata.command_line eingegrenzt.

Genau eine solche Überprüfung der Behebung wünscht man sich bei einer echten Offenlegung.


Offenlegung

Dies wurde vertraulich über GitHub Security Advisories gemeldet.

Die Maintainer:

  • validierten das Problem
  • stimmten zu, dass es ihr Fehler war, den es zu beheben galt
  • vereinfachten den Reproduktionsversuch
  • patchten die anfällige Senke
  • veröffentlichten die Behebung in 1.19.2
  • beantragten ein CVE
  • veröffentlichten das Advisory

Dem Problem wurde zugewiesen: CVE-2026-32722


Was dieser Fehler tatsächlich lehrt

Die wichtigste Lektion hier ist einfach:

Metadaten sind nicht automatisch vertrauenswürdig, nur weil sie operativ wirken.

  • Eine Befehlszeile wirkt harmlos.
  • Ein Berichts-Dialog wirkt harmlos.
  • Eine lokale HTML-Datei wirkt harmlos.

All das spielt keine Rolle, sobald angreiferkontrollierter Inhalt ohne Escaping in browser-gerenderte Ausgaben gelangt.

In dem Moment, in dem ein Tool HTML ausgibt, muss es wie eine HTML-erzeugende Anwendung behandelt werden.

Das ist die eigentliche Erkenntnis.


Kernpunkte

  • HTML-Berichtsgeneratoren sind Sicherheitsoberflächen
  • Entwicklerwerkzeuge benötigen weiterhin Disziplin bei der Ausgabe-Kodierung
  • lokale Berichtsartefakte können echte XSS-Senken enthalten
  • fehlendes Escaping in Templates reicht aus, wenn angreiferkontrollierte Metadaten die Senke erreichen
  • ein niedriger Schweregrad bedeutet nicht geringe Qualität
  • die richtige Herangehensweise war hier Vertrauensgrenzen-Analyse, nicht blindes Fuzzing

Schlusswort

Bei dieser Sicherheitslücke ging es nicht um ein raffiniertes Payload.

Es ging darum, die richtige Grenze zu identifizieren.

Memray übernahm angreiferbeeinflusste Befehlszeilen-Metadaten und renderte sie ohne Escaping in das generierte HTML. Der Browser erledigte den Rest.

Deshalb wurde daraus CVE-2026-32722.

Behoben in Memray 1.19.2.

photo0
Tool herunterladen