Um link malicioso de compartilhamento do ChatGPT poderia executar código de um invasor na sessão logada de qualquer pessoa que o abrisse, permitindo que ele lesse as conversas privadas dessa pessoa, mostraram pesquisadores da empresa de segurança Parameter.
Os pesquisadores reportaram a falha pelo programa de recompensas por bugs (bug bounty) da OpenAI em 18 de outubro. A empresa corrigiu o problema oito dias depois e o classificou como P1, sua categoria mais grave.
A armadilha era uma conversa comum do ChatGPT compartilhada por meio de seu link público. Ela poderia ser enviada da mesma forma que qualquer chat compartilhado de verdade: por e-mail, como mensagem em um chat, como chamado de suporte ou como publicação em redes sociais.
A vítima não precisava instalar nada, entrar em um espaço de trabalho ou fazer login por meio do invasor. Na versão mais confiável do ataque, ela abria o link e clicava uma vez no botão Preview do ChatGPT. Em uma versão posterior, a Parameter configurou a página para abrir o Preview automaticamente, de modo que abrir o link era o único passo necessário.
O que o invasor poderia fazer
Assim que o link era aberto, o código do invasor era executado dentro da sessão logada da vítima, com o mesmo acesso do site oficial do ChatGPT. Ele listava as conversas recentes da vítima, abria um chat privado que nunca tinha sido compartilhado com o invasor e enviava uma pequena parte dele para um servidor controlado pelos pesquisadores.
O código chamava diretamente as interfaces de programação de aplicações (APIs) do próprio ChatGPT que exigem login, em vez de copiar o que estava na tela. Como era executado com todo o acesso web da vítima, seu alcance não se limitava àqueles chats. « Essencialmente, poderíamos realizar qualquer ação em nome da conta do ChatGPT da vítima », escreveram os pesquisadores.
O trabalho foi um teste controlado. A Parameter não relata nenhum uso real da falha e fez a prova do acesso a chats privados entre contas separadas, e não contra usuários reais.
Como o link escapou do seu isolamento
Segundo a Parameter, a cadeia de ataque funcionava assim. O ChatGPT pode transformar um trecho de HTML (linguagem de marcação usada para criar páginas web) em um chat em uma pequena página web, por meio de um recurso chamado Preview. Como essa página pode conter qualquer código, o ChatGPT a executa em um quadro bloqueado, em um endereço web separado, onde ela não consegue ler a página principal do ChatGPT ao redor.
Esse isolamento resistiu. A entrada veio de um segundo recurso na mesma conversa.
O chat compartilhado também continha um gráfico interativo, e ao desenhá-lo era carregada na página principal do ChatGPT a biblioteca matemática MathLive. O carregamento da MathLive deixou ali um ouvinte ativo que aceitava mensagens sobre seu teclado virtual.
Uma mensagem trocada entre quadros do navegador só é segura se quem a recebe verificar quem a enviou. A Parameter descobriu que esse ouvinte aceitava uma mensagem de teclado vinda de qualquer remetente e que essa mensagem podia carregar HTML bruto. Assim, o Preview conseguia atravessar a fronteira e entregar HTML do invasor à página principal, que era confiável.
Esse HTML criou um novo quadro que o navegador tratava como parte do chatgpt.com. Um script carregado do YouTube forneceu então o código executado dentro dele.
A política de segurança de conteúdo (CSP) do ChatGPT limita de onde podem vir os scripts de uma página. Ela bloqueava códigos embutidos, mas permitia scripts do YouTube, e por isso essa etapa funcionou.
O que a OpenAI corrigiu e o que os usuários devem fazer
A Parameter afirmou que a OpenAI reproduziu tanto a execução de código quanto a prova de acesso a chats privados, elevou a gravidade de P2 (prioridade alta) para P1 (prioridade máxima) e implantou uma correção em duas versões da interface web (frontend) do ChatGPT. Até 26 de outubro, as duas versões rejeitavam as mensagens em que o ataque se apoiava.
Os pesquisadores atribuíram o problema a três decisões de projeto que se combinaram:
- A MathLive executava uma mensagem que alterava suas configurações sem verificar qual quadro a havia enviado.
- Essa mensagem podia carregar HTML bruto como dados de layout do teclado.
- O HTML podia criar um quadro sem isolamento que herdava a identidade do chatgpt.com.
A etapa do YouTube foi apenas o contorno final, e não a causa. Bloqueá-la isoladamente ainda deixaria um Preview não confiável capaz de enviar HTML para o site principal.
Os usuários do ChatGPT não precisam fazer nada. A correção está do lado da OpenAI, sem nada para instalar ou redefinir.
A Parameter publicou seu relato em 28 de outubro, após a correção. A OpenAI pagou um total de US$ 5 mil pelo relatório.