Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-32722 — Bloomberg Memray: Stored XSS tramite metadati della riga di comando non escapati | Kitploit
Strumenti/GitHubGitHub/0xmrma/cve-2026-32722
Analisi Statica del Codice (SAST)Analisi delle VulnerabilitàSfruttamento di Applicazioni WebPenetration TestingPaper e RicercaApprendimento e Formazione
GitHub0xmrma/cve-2026-32722

CVE-2026-32722

Bloomberg Memray: Stored XSS tramite metadati della riga di comando non escapati

Vedi Repository
14 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-32722

XSS persistente di Bloomberg Memray tramite metadati della riga di comando non escapati

Introduzione

Ho trovato questo problema mentre analizzavo Memray, il profiler di memoria Python di Bloomberg, con una semplice domanda in mente:

I metadati di runtime controllati da un attaccante possono finire in modo non sicuro nell'output dei report renderizzati nel browser?

In questo caso, la risposta è stata sì.

Il bug si trovava nel percorso di generazione dei report HTML di Memray, dove i metadati della riga di comando venivano renderizzati in un report aperto nel browser senza escaping. Questo ha trasformato un campo operativo in un sink HTML eseguibile e alla fine è diventato CVE-2026-32722.

Progetto: Memray su GitHub
Advisory: GHSA-r5pr-887v-m2w9 /CVE-2026-32722

photo0

Catena di attacco

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


Cosa fa Memray

Memray è un profiler di memoria Python.

Strumenta un processo Python, registra il comportamento delle allocazioni e produce report che aiutano gli sviluppatori a capire:

  • dove viene allocata la memoria
  • quali percorsi di chiamata ne sono responsabili
  • come appare il picco di utilizzo della memoria
  • come la memoria cambia nel tempo

Alcuni di questi report vengono generati come HTML e aperti in un browser.

Questo rende la generazione dei report un vero confine di sicurezza.

La domanda pertinente non è se Memray sia uno "strumento locale".
La domanda pertinente è se i dati controllati da un attaccante possano finire in modo non sicuro nell'output renderizzato dal browser.

In questo caso, potevano.


Perché valeva la pena esaminare questo bug

Molte persone sottovalutano gli strumenti per sviluppatori.

È un errore.

Quando uno strumento:

  • registra metadati di runtime,
  • memorizza valori influenzati dall'attaccante,
  • e in seguito li renderizza in HTML,

eredita gli stessi rischi di codifica dell'output di un'applicazione web.

Questo era il problema centrale.

Questo bug non era nella logica di profiling. Non era nel tracciamento delle allocazioni. Non era nella gestione nativa della memoria.

Era un classico fallimento del confine di fiducia:

  • metadati non attendibili sono entrati nel sistema,
  • sono finiti in un sink HTML,
  • e sono stati renderizzati senza escaping.

Questo è sufficiente per creare una vera vulnerabilità.


Il confine su cui mi sono concentrato

Non ho affrontato Memray fuzzando opzioni CLI casuali o inseguendo crash.

L'approccio più efficace era identificare per prima la superficie di sicurezza a più alta probabilità.

Per Memray, quella era la generazione di report HTML.

Perché?

Perché l'output HTML introduce un sink del browser, e i sink del browser trasformano i normali bug dei metadati in problemi di sicurezza se:

  • l'input è influenzato dall'attaccante,
  • l'output non è escapato,
  • e il browser interpreta il risultato come markup invece che come testo.

È esattamente ciò che è successo qui.


Causa principale

Il bug si riduce a due righe.

In:

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

l'ambiente Jinja viene creato senza autoescape.

Poi in:

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

metadata.command_line viene renderizzato direttamente nell'HTML.

Questa è l'intera vulnerabilità.

Perché è sfruttabile

Perché metadata.command_line è influenzato dall'attaccante.

Memray registra la riga di comando usata per eseguire il programma profilato. Ciò significa che i valori controllati dall'utente provenienti da argv vengono conservati come metadati e successivamente inseriti nel report.

Quindi la catena di sfruttamento è semplice:

  • l'attaccante controlla il contenuto della riga di comando
  • Memray lo memorizza in metadata.command_line
  • il template lo emette nell'HTML
  • l'ambiente non applica l'autoescape
  • il browser lo interpreta come markup attivo

Questo trasforma i metadati in contenuto eseguibile nel browser.


Cosa rende questo un problema di sicurezza e non solo un rendering errato

La distinzione importante è l'esecuzione.

Molti bug producono HTML malformato. Da solo non basta.

Qui, il contenuto controllato dall'attaccante non era semplicemente visibile nel sorgente della pagina. Veniva interpretato dal browser come HTML attivo ed eseguito come JavaScript.

Questa è la differenza tra:

  • corruzione della formattazione
  • e un vero sink XSS

Quindi la domanda non era:

“L'HTML può comparire nel report?”

La vera domanda era:

“L'HTML controllato dall'attaccante può diventare eseguibile quando il report viene aperto?”

La risposta era sì.


PoC

Il mio riproduttore iniziale usava uno script esplicito più un argomento controllato dall'attaccante:

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

L'HTML generato conteneva markup grezzo controllato dall'attaccante:

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

Aprire o aggiornare il report generato innescava l'esecuzione di JavaScript.

Questo ha stabilito l'affermazione centrale:

  • il valore non era escapato,
  • il browser lo interpretava come markup,
  • e il sink era eseguibile.

Successivamente, durante la divulgazione coordinata, il maintainer ha ulteriormente semplificato il riproduttore:

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

Questa versione è migliore perché isola il confine vulnerabile in modo più diretto:

  • nessun file aggiuntivo
  • nessuna logica applicativa aggiuntiva
  • solo contenuto della riga di comando controllato dall'attaccante che entra nella pipeline del report

Perché è stato scelto il payload

Il payload era intenzionalmente semplice:

root@kitploit:~

Non si tratta di payload appariscenti.

È una sonda di esecuzione pulita perché:

  • non richiede infrastrutture esterne
  • è evidente nell'HTML renderizzato
  • dimostra immediatamente l'interpretazione HTML
  • dimostra l'esecuzione lato browser senza dipendere da contenuti remoti

Per questa classe di bug, è sufficiente.


Validazione dell'ambito

Un solo tipo di report sarebbe già stato sufficiente a giustificare il problema.

Ma volevo sapere se il problema fosse isolato o strutturale.

Ho confermato lo stesso comportamento in:

  • report flamegraph
  • report tabellari
  • report flamegraph generati con --no-web

Questo era importante per due motivi.

Primo

Mostrava che il sink vulnerabile veniva riutilizzato in più output HTML.

Secondo

Dimostrava che il bug non dipendeva da risorse esterne ospitate su CDN.

--no-web riproduceva comunque il problema, il che significa che il problema era nell'HTML generato da Memray e nella gestione dei template, non nel comportamento di JS remoto. Questo ha reso il caso molto più solido.


Perché è stato classificato come gravità bassa

La preoccupazione principale del maintainer era il controllo pratico dell'attaccante.

È giusto.

Non è il tipo di problema in cui un attaccante remoto non autenticato colpisce un endpoint HTTP esposto e ottiene un impatto immediato.

La condizione di sfruttamento è più ristretta:

  • l'attaccante influenza l'input della riga di comando
  • una vittima apre successivamente il report generato in un browser

Quindi la classificazione realistica era gravità bassa.

Questo non lo rende un bug debole.

La gravità riguarda le condizioni di sfruttamento e il probabile impatto. La validità riguarda se il problema è reale.

Questo problema era chiaramente reale:

  • sorgente controllata dall'attaccante
  • sink HTML
  • escaping mancante
  • effettiva esecuzione di JavaScript
  • fix deterministico

Ecco perché è comunque diventato un CVE.


Analisi del fix

Il fix è stato minimale e corretto.

Il maintainer ha modificato:

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

in:

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

È il fix giusto perché affronta direttamente il sink vulnerabile.

Invece di emettere markup grezzo come:

root@kitploit:~

il template ora emette testo escapato:

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

Questo preserva il valore informativo del campo della riga di comando eliminando al contempo il percorso di esecuzione nel browser.

Il maintainer ha inoltre esaminato il resto del contesto del template e ha concluso che:

  • diversi campi erano numerici
  • alcune stringhe erano completamente controllate da Memray
  • i valori legati agli script venivano renderizzati con |tojson

Quindi il problema è stato correttamente circoscritto a metadata.command_line.

È esattamente il tipo di revisione del fix che vuoi in una divulgazione reale.


Divulgazione

È stato segnalato privatamente tramite GitHub Security Advisories.

I maintainer:

  • hanno validato il problema
  • hanno concordato che era un loro bug da correggere
  • hanno semplificato il riproduttore
  • hanno corretto il sink vulnerabile
  • hanno rilasciato il fix in 1.19.2
  • hanno richiesto un CVE
  • hanno pubblicato l'advisory

Al problema è stato assegnato: CVE-2026-32722


Cosa insegna davvero questo bug

La lezione chiave qui è semplice:

i metadati non sono automaticamente attendibili solo perché sembrano operativi.

  • Una riga di comando sembra innocua.
  • Una finestra modale del report sembra innocua.
  • Un file HTML locale sembra innocuo.

Niente di tutto ciò conta quando il contenuto controllato dall'attaccante finisce nell'output renderizzato dal browser senza escaping.

Nel momento in cui uno strumento emette HTML, deve essere trattato come un'applicazione che produce HTML.

Questo è il vero insegnamento.


Punti chiave

  • i generatori di report HTML sono superfici di sicurezza
  • gli strumenti per sviluppatori richiedono comunque disciplina nella codifica dell'output
  • gli artefatti di report locali possono contenere veri sink XSS
  • l'escaping mancante nei template è sufficiente quando i metadati controllati dall'attaccante raggiungono il sink
  • gravità bassa non significa bassa qualità
  • la mentalità giusta qui era l'analisi dei confini di fiducia, non il fuzzing alla cieca

Parole finali

Questa vulnerabilità non riguardava un payload ingegnoso.

Riguardava l'identificazione del confine giusto.

Memray ha preso i metadati della riga di comando influenzati dall'attaccante e li ha renderizzati nell'HTML generato senza applicare escaping. Il browser ha fatto il resto.

Ecco perché questo è diventato CVE-2026-32722.

Corretto in Memray 1.19.2.

photo0
Scarica lo strumento