Falha nos HTML previews do ChatGPT permitia tomar contas com um link compartilhado: como funcionava a cadeia descoberta pela Parameter Labs

Ilustração de link de compartilhamento do ChatGPT vazando dados de uma conta

Fala aí, beleza? A Parameter Labs publicou o relato Do the Math: How We Took Over ChatGPT Accounts, e o resumo assusta: um link de compartilhamento do ChatGPT podia vazar os dados privados de quem abrisse ou agir em nome dessa pessoa, bastando ela estar logada

Segundo a Parameter Labs, a OpenAI corrigiu a falha em 26 de outubro.

O que são os HTML previews do ChatGPT e por que o sandbox importa

HTML preview é o recurso que mostra o resultado de um código direto dentro do ChatGPT

Segundo a documentação de ajuda da OpenAI, nos code blocks compatíveis você seleciona Preview e vê a coisa rodando ali mesmo

As prévias podem incluir páginas HTML, componentes React, imagens SVG, diagramas Mermaid e gráficos Vega ou Vega-Lite

Na leitura do Simon Willison, essa é a versão atual do padrão de artifacts que a OpenAI antes chamava de Canvas, com o HTML exibido num iframe com sandbox

E por que o sandbox importa tanto?

Porque esse HTML é código não confiável, muitas vezes gerado por IA ou colado por qualquer um

O isolamento existe justamente pra que esse código não encoste nas APIs do ChatGPT nem nos dados privados do usuário

Como funcionava a cadeia de exploração, passo a passo

A cadeia é longa, e nenhum elo sozinho resolvia o problema do atacante

O truque foi encadear vários detalhes pequenos até sair do sandbox, se liga:

  1. O ChatGPT usava a biblioteca JavaScript MathLive no suporte a gráficos, e o teclado virtual da MathLive podia ser acionado na página principal via postMessage() a partir de um iframe com sandbox
  2. O controlador de nível superior da MathLive usava a política de origem none e aceitava mensagens de qualquer endereço; a mensagem update-setting trocava o layout do teclado por HTML, e esse HTML era atribuído a innerHTML na página real do ChatGPT sem nenhuma sanitização
  3. Scripts inseridos via innerHTML não rodam, então o ataque injetou um iframe com srcdoc, que a MathLive colocou sem atributo sandbox; como foi criado pela própria página principal, esse frame herdava a origem https://chatgpt.com
  4. A CSP da OpenAI bloqueava scripts inline e só aceitava scripts de alguns domínios, e um deles era o YouTube; o endpoint oEmbed do YouTube aceitava um parâmetro callback no estilo JSONP e devolvia esse callback dentro da resposta JavaScript antes de validar o restante
  5. Com JavaScript rodando dentro do ChatGPT, o ataque buscava dados privados do usuário pelas APIs e exfiltrava tudo por meio de uma referência de imagem
  6. Resultado final: uma URL de compartilhamento do ChatGPT que, aberta por outro usuário logado, podia vazar os dados dele ou agir em nome dele

Que JSONP é esse?

É um padrão antigo em que o servidor devolve um script chamando a função que você passou no parâmetro de callback

Se o servidor não filtra direito esse nome, ele acaba devolvendo o JavaScript que o atacante quiser, e a CSP enxerga aquilo como script vindo de um domínio confiável…

Os detalhes completos da exploração estão no post da Parameter Labs, que é a referência técnica do caso

Quando a falha foi corrigida

A Parameter Labs relata que enviou o caso à OpenAI em 18 de outubro de 2026 e que a correção foi concluída em 26 de outubro.

O que conferir se seu aplicativo usa MathLive

Se o seu aplicativo usa a biblioteca, confira as versões publicadas pela MathLive e verifique como o seu código trata mensagens enviadas por iframes. A cadeia descrita pela Parameter mostra por que o receptor precisa verificar a origem e controlar quais dados podem chegar ao DOM.

Lições para quem renderiza HTML gerado por IA em sandbox

Se você está montando um app de artifacts, preview de código ou qualquer coisa que renderiza HTML gerado por IA, essa cadeia é um checklist pronto do que não fazer

Cada lição abaixo quebraria um elo diferente do ataque:

  1. Valide a origem em todo listener de postMessage: confira event.origin e event.source antes de fazer qualquer coisa com a mensagem, porque um iframe com sandbox continua podendo enviar mensagens pra página principal (isso quebraria o passo 2)
  2. Não use innerHTML com dados de outros frames: não precisa executar script direto pra escapar do isolamento, injetar um iframe sem sandbox já basta (isso quebraria o passo 3)
  3. Revise cada domínio liberado na CSP: procure endpoints que reflitam conteúdo, como JSONP ou callbacks em oEmbed, porque um único domínio confiável pode virar ponte pra rodar JavaScript (isso quebraria o passo 4)

A própria Parameter resume essas lições assim: CSP é defesa em profundidade, mas não torna seguro um caminho de renderização que já é inseguro por outro lado

Tem uma quarta lição escondida aí: dependência de terceiro também é superfície de ataque

Ninguém olha pra uma biblioteca de matemática pensando em tomada de conta, né?

Pois foi exatamente por ela que a porta abriu

Próximo passo: auditar o seu próprio sandbox

Abre o código do seu app de preview e faz duas listas: todos os listeners de postMessage e todos os domínios liberados na CSP

Passa cada item pelos três padrões de falha e anota o que não tem validação de origem, o que usa innerHTML com dado externo e qual domínio pode refletir conteúdo

Se a MathLive estiver no projeto, confira a versão e atualiza se precisar

E pra entender cada detalhe da cadeia, vale ler o post completo da Parameter Labs com calma

Até o próximo post!

Quer aprender mais sobre inteligência artificial e programação na prática? Conheça o canal Hora de Codar no YouTube e acompanhe os próximos vídeos.

Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 30min

Blog | Mais populares