Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-32722 — XSS armazenado do Bloomberg Memray via metadados de linha de comando não escapados | Kitploit
Ferramentas/GitHubGitHub/0xmrma/cve-2026-32722
Análise Estática de Código (SAST)Análise de VulnerabilidadesExploração de Aplicações WebTestes de PenetraçãoPapers e PesquisaAprendizado e Educação
GitHub0xmrma/cve-2026-32722

CVE-2026-32722

XSS armazenado do Bloomberg Memray via metadados de linha de comando não escapados

Ver Repositório
1há 4 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-32722

XSS Armazenado no Bloomberg Memray via Metadados de Linha de Comando sem Escape

Introdução

Encontrei este problema ao revisar o Memray, o profiler de memória Python da Bloomberg, com uma pergunta simples em mente:

Metadados de runtime controlados por um atacante podem cruzar para a saída de relatórios renderizada no navegador de forma insegura?

Neste caso, a resposta foi sim.

O bug estava no caminho de geração de relatórios HTML do Memray, onde os metadados da linha de comando eram renderizados em um relatório aberto no navegador sem escape. Isso transformou um campo operacional em um sink HTML executável e, no final, tornou-se CVE-2026-32722.

Projeto: Memray no GitHub
Advisory: GHSA-r5pr-887v-m2w9 /CVE-2026-32722

photo0

Cadeia de Ataque

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


O que o Memray Faz

O Memray é um profiler de memória Python.

Ele instrumenta um processo Python, registra o comportamento de alocação e produz relatórios que ajudam os desenvolvedores a entender:

  • onde a memória é alocada
  • quais caminhos de chamada são responsáveis
  • como é o pico de uso de memória
  • como a memória muda ao longo do tempo

Alguns desses relatórios são emitidos como HTML e abertos em um navegador.

Isso torna a geração de relatórios um limite de segurança real.

A pergunta relevante não é se o Memray é uma "ferramenta local".
A pergunta relevante é se dados controlados por um atacante podem cruzar para a saída renderizada no navegador de forma insegura.

Neste caso, podiam.


Por que Este Bug Valia a Pena Ser Analisado

Muitas pessoas subestimam as ferramentas de desenvolvimento.

Isso é um erro.

Quando uma ferramenta:

  • registra metadados de runtime,
  • armazena valores influenciados por um atacante,
  • e depois os renderiza em HTML,

ela herda os mesmos riscos de codificação de saída de uma aplicação web.

Esse era o problema central aqui.

Este bug não estava na lógica de profiling. Não estava no rastreamento de alocações. Não estava no tratamento de memória nativa.

Foi uma falha clássica de limite de confiança:

  • metadados não confiáveis entraram no sistema,
  • cruzaram para um sink HTML,
  • e foram renderizados sem escape.

Isso é suficiente para criar uma vulnerabilidade real.


O Limite no Qual Foquei

Não abordei o Memray fazendo fuzzing de opções aleatórias de CLI ou perseguindo crashes.

A abordagem mais forte era identificar primeiro a superfície de segurança de maior probabilidade.

Para o Memray, essa superfície era a geração de relatórios HTML.

Por quê?

Porque a saída HTML introduz um sink de navegador, e sinks de navegador transformam bugs comuns de metadados em problemas de segurança se:

  • a entrada for influenciada por um atacante,
  • a saída não tiver escape,
  • e o navegador interpretar o resultado como marcação em vez de texto.

Foi exatamente o que aconteceu aqui.


Causa Raiz

O bug se resume a duas linhas.

Em:

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

o ambiente Jinja é criado sem autoescape.

Então em:

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

metadata.command_line é renderizado diretamente em HTML.

Essa é toda a vulnerabilidade.

Por que isso é explorável

Porque metadata.command_line é influenciado por um atacante.

O Memray registra a linha de comando usada para executar o programa analisado. Isso significa que valores controlados pelo usuário de argv são preservados como metadados e posteriormente inseridos no relatório.

Portanto, a cadeia de exploração é direta:

  • o atacante controla o conteúdo da linha de comando
  • o Memray o armazena em metadata.command_line
  • o template o emite em HTML
  • o ambiente não aplica autoescape
  • o navegador o interpreta como marcação ativa

Isso transforma metadados em conteúdo de navegador executável.


O Que Torna Isso um Problema de Segurança, e Não Apenas uma Renderização Ruim

A distinção importante é a execução.

Muitos bugs produzem HTML malformado. Isso sozinho não é suficiente.

Aqui, o conteúdo controlado pelo atacante não estava meramente visível no código-fonte da página. Ele foi interpretado pelo navegador como HTML ativo e executado como JavaScript.

Essa é a diferença entre:

  • corrupção de formatação
  • e um sink XSS real

Portanto, a pergunta não era:

"O HTML pode aparecer no relatório?"

A pergunta real era:

"O HTML controlado por um atacante pode se tornar executável quando o relatório é aberto?"

A resposta era sim.


PoC

Meu reprodutor inicial usava um script explícito mais um argumento controlado pelo atacante:

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

O HTML gerado continha marcação crua controlada pelo atacante:

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

Abrir ou atualizar o relatório gerado disparava a execução de JavaScript.

Isso estabeleceu a afirmação central:

  • o valor não tinha escape,
  • o navegador o interpretou como marcação,
  • e o sink era executável.

Mais tarde, durante a divulgação coordenada, o mantenedor simplificou ainda mais o reprodutor:

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

Essa versão é melhor porque isola o limite vulnerável de forma mais direta:

  • sem arquivo extra
  • sem lógica de aplicação extra
  • apenas conteúdo de linha de comando controlado pelo atacante entrando no pipeline de relatórios

Por que o Payload Foi Escolhido

O payload foi intencionalmente simples:

root@kitploit:~

Não se trata de payloads chamativos.

É uma sonda de execução limpa porque:

  • não requer infraestrutura externa
  • é óbvio no HTML renderizado
  • prova a interpretação de HTML imediatamente
  • prova a execução no lado do navegador sem depender de conteúdo remoto

Para essa classe de bug, isso é suficiente.


Validação de Escopo

Um único tipo de relatório já teria sido suficiente para justificar o problema.

Mas eu queria saber se isso era isolado ou estrutural.

Confirmei o mesmo comportamento em:

  • relatórios flamegraph
  • relatórios de tabela
  • relatórios flamegraph gerados com --no-web

Isso importava por dois motivos.

Primeiro

Mostrou que o sink vulnerável era reutilizado em múltiplas saídas HTML.

Segundo

Provou que o bug não dependia de ativos hospedados em CDN externo.

O --no-web ainda reproduzia o problema, o que significa que o problema estava no HTML gerado pelo próprio Memray e no tratamento do template, não no comportamento de JS remoto. Isso tornou o caso muito mais forte.


Por que Isso Foi Classificado como Severidade Baixa

A principal preocupação do mantenedor era o controle prático do atacante.

Isso é justo.

Não é o tipo de problema em que um atacante remoto não autenticado atinge um endpoint HTTP exposto e obtém impacto imediato.

A condição de exploração é mais restrita:

  • o atacante influencia a entrada da linha de comando
  • uma vítima abre posteriormente o relatório gerado em um navegador

Portanto, a classificação realista era severidade baixa.

Isso não faz dele um bug fraco.

Severidade diz respeito às condições de exploração e ao impacto provável. Validade diz respeito a se o problema é real.

Este problema era claramente real:

  • fonte controlada pelo atacante
  • sink HTML
  • ausência de escape
  • execução real de JavaScript
  • correção determinística

É por isso que ainda se tornou um CVE.


Análise da Correção

A correção foi mínima e correta.

O mantenedor alterou:

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

para:

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

Essa é a correção certa porque trata diretamente do sink vulnerável.

Em vez de emitir marcação crua como:

root@kitploit:~

o template agora emite texto com escape:

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

Isso preserva o valor informativo do campo de linha de comando enquanto remove o caminho de execução no navegador.

O mantenedor também revisou o restante do contexto do template e concluiu que:

  • vários campos eram numéricos
  • algumas strings eram totalmente controladas pelo Memray
  • valores vinculados a scripts eram renderizados com |tojson Portanto, o problema foi corretamente reduzido a metadata.command_line.

Esse é exatamente o tipo de revisão de correção que você quer em uma divulgação real.


Divulgação

Isso foi relatado em particular por meio do GitHub Security Advisories.

Os mantenedores:

  • validaram o problema
  • concordaram que era um bug deles para corrigir
  • simplificaram o reprodutor
  • corrigiram o sink vulnerável
  • lançaram a correção em 1.19.2
  • solicitaram um CVE
  • publicaram o advisory

O problema recebeu o identificador: CVE-2026-32722


O Que Este Bug Realmente Ensina

A lição principal aqui é simples:

metadados não são automaticamente confiáveis apenas porque parecem operacionais.

  • Uma linha de comando parece inofensiva.
  • Um modal de relatório parece inofensivo.
  • Um arquivo HTML local parece inofensivo.

Nada disso importa quando conteúdo controlado por um atacante cruza para a saída renderizada no navegador sem escape.

No momento em que uma ferramenta emite HTML, ela precisa ser tratada como uma aplicação que produz HTML.

Essa é a verdadeira conclusão.


Pontos-Chave

  • Geradores de relatórios HTML são superfícies de segurança
  • ferramentas de desenvolvimento ainda precisam de disciplina de codificação de saída
  • artefatos de relatórios locais podem conter sinks XSS reais
  • a ausência de escape em templates é suficiente quando metadados controlados por um atacante alcançam o sink
  • severidade baixa não significa baixa qualidade
  • a mentalidade certa aqui foi a análise de limites de confiança, não fuzzing cego

Considerações Finais

Esta vulnerabilidade não era sobre um payload engenhoso.

Era sobre identificar o limite certo.

O Memray pegou metadados de linha de comando influenciados por um atacante e os renderizou em HTML gerado sem aplicar escape. O navegador fez o resto.

É por isso que isso se tornou CVE-2026-32722.

Corrigido no Memray 1.19.2.

photo0
Baixar ferramenta