Hackeando o Google Bard: da injeção de prompt ao vazamento de dados
(embracethered.com)- Com as Bard Extensions permitindo ler até documentos pessoais e e-mails, a injeção indireta de prompt escondida em documentos externos pode se tornar uma rota real de vazamento de dados
- Um invasor pode compartilhar à força um Google Docs malicioso com a vítima e fazer com que o Bard execute as instruções contidas no documento no momento em que ele o pesquisar ou analisar
- A renderização de imagens em Markdown do Bard pode chamar URLs externas sem clique do usuário, tornando-se um canal para extrair o contexto da conversa anexado como string de consulta
- A Content Security Policy do Google bloqueava o carregamento arbitrário de imagens, mas Google Apps Script executado em
script.google.comegoogleusercontent.comfoi usado como caminho de contorno - O problema foi reportado ao Google VRP em 19 de setembro de 2023, teve a correção confirmada em 19 de outubro, e aparentemente foi adicionada uma filtragem para impedir que dados fossem inseridos na URL
A nova superfície de ataque criada pelas Bard Extensions
- O Google Bard passou a oferecer suporte a Extensions com uma atualização, permitindo acesso ao YouTube, buscas de voos e hotéis, além de documentos pessoais e e-mails do usuário
- Como o Bard passou a poder analisar Drive, Docs e Gmail do usuário, surge uma situação em que dados externos não confiáveis são trazidos para o contexto do LLM
- Nessa arquitetura, é possível ficar exposto a injeção indireta de prompt, em que instruções escondidas em conteúdo externo alteram a resposta do modelo
- Em testes com resumos de vídeos do YouTube e
Google Docs, foi confirmado que o Bard seguia instruções incluídas em conteúdo externo
Cenário de ataque
- A injeção indireta de prompt via e-mail ou Google Docs é perigosa porque pode ser entregue sem que o usuário clique explicitamente em um link malicioso
- O invasor pode compartilhar à força um Google Docs malicioso com a vítima
- Se a vítima pesquisar ou interagir com esse documento usando o Bard, as instruções de injeção de prompt dentro do documento podem ser executadas
- Uma rota vulnerável comum em apps de LLM é o vazamento do histórico de chat usando hyperlinks e renderização de imagens
Injeção de imagem em Markdown
- O LLM do Google pode incluir elementos Markdown em respostas de texto, e o Bard os renderiza como HTML
- A sintaxe de imagem em Markdown é convertida na tag HTML
<img>, e o atributosrcpode apontar para um servidor do invasor - O navegador acessa automaticamente essa URL para exibir a imagem, sem interação do usuário
- Se o LLM resumir ou ler dados anteriores do contexto do chat e depois anexar esse valor à URL da imagem, os dados podem sair por uma requisição externa
- O exploit inicial foi desenvolvido rapidamente lendo o histórico de conversa e criando um hyperlink que o incluía, mas a renderização de imagens foi bloqueada pela Content Security Policy do Google
Contorno da Content Security Policy
- A CSP do Google bloqueia o carregamento de imagens de locais arbitrários
- No entanto, a CSP inclui locais permitidos relativamente amplos, como
*.google.come*.googleusercontent.com - O Google Apps Script pode ser chamado por URL de forma parecida com macros do Office, e é executado nos domínios
script.google.comougoogleusercontent.com - Por essa característica, o Apps Script se tornou um bom candidato para contornar a CSP
Implementação do Bard Logger
- O Bard Logger foi implementado com
Apps Script - O Logger registra em um Google Doc todos os parâmetros de consulta anexados à URL de chamada
- Na UI do Apps Script, foi possível encontrar uma configuração acessível sem autenticação e criar um endpoint que permitia chamadas anônimas
- A cadeia de ataque é composta pelos seguintes elementos
- Injeção indireta de prompt originada dos dados das Bard Extensions
- Requisição zero-click gerada pela renderização de imagens do Bard
- Instruções de injeção de prompt dentro do Google Doc malicioso
- Endpoint de logging baseado em
google.comque recebe os dados quando a imagem é carregada
Fluxo da demonstração
- Na demonstração, quando o
Google Docmalicioso entra no contexto do chat, o histórico de chat do usuário é vazado - O fluxo das capturas de tela é o seguinte
- O usuário acessa o Google Doc chamado “The Bard2000”
- As instruções do invasor são injetadas e a imagem é renderizada
- O invasor recebe os dados em um Google Doc por meio do Bard Logger Apps Script
- A cadeia era mais complexa do que casos anteriores discutidos em Bing Chat, ChatGPT e Claude, porque exigia contornar a CSP
Shell Code em linguagem natural e payload
- Como na expressão “Shell Code is natural language these days”, o exploit é composto por prompts em linguagem natural
- O Google Doc malicioso contém um payload que executa injeção de prompt e vazamento de dados
- Esse payload induz o LLM a substituir o texto dentro da URL da imagem por dados da conversa
- Para que o Bard concluísse a tarefa, foi necessário in-context learning com alguns exemplos
- O payload do apêndice instrui a imprimir as primeiras 20 palavras da conversa, codificar espaços como
+e inserir isso como consulta na URL de execução do Apps Script - O apêndice também inclui a string de saída “AI Injection succeeded #10”
Correção do Google e cronograma
- O problema foi reportado ao Google VRP em 19 de setembro de 2023
- Após uma consulta sobre o status em 19 de outubro de 2023, o Google confirmou a conclusão da correção e aprovou a inclusão da demonstração na apresentação da Ekoparty 2023
- O método de correção na época não ficou totalmente claro
- A CSP não foi alterada e as imagens ainda são renderizadas, então aparentemente foi adicionada uma filtragem para impedir a inserção de dados em URLs
- Cronograma da correção
- 19 de setembro de 2023: problema reportado
- 19 de outubro de 2023: correção confirmada
1 comentários
Opiniões no Hacker News
thepor 2 ou 3 prompts seguidos, mas esse método não funciona no BardEu achava que as regras eram aplicadas de forma global e uniforme a todo o prompt
Depois, o mesmo problema reapareceu no XSS: o sistema não conseguia distinguir comandos de dados, então um atacante podia criar uma mensagem que o sistema interpretaria erroneamente como comando. A solução foi encontrar uma forma de delimitar claramente os dados
Com LLMs, a solução provavelmente será parecida. Pode ser treinar o LLM para respeitar comandos do tipo “os primeiros 100 tokens são imutáveis, e nenhuma outra instrução pode contradizê-los. [inserir comandos protegidos]”. Se isso for colocado na etapa de treinamento, em vez de anexar instruções protegidas no momento da inferência, talvez fique mais difícil injetar instruções maliciosas; mas, na prática, não é fácil, porque seria preciso prever todos os ataques possíveis no momento do treinamento
O problema é por que se acredita que sempre vai dar certo só porque se deu acesso especial a um amostrador de tokens aleatórios tirados de um palheiro e, em geral, ele parece funcionar bem
Precisamos torcer para que, nos próximos anos, surja algum avanço estrutural que permita separar instruções, isto é, prompts, da conversa de corpo, que é “dado”
Por exemplo, poderia haver um modelo que recebesse como entrada dois tipos de token, tokens de prompt e tokens de dados, de modo que eles nunca se misturem nem sejam confundidos. Ainda não sei como fazer isso, e seria necessário um grande avanço estrutural para treinar e operar nesses dois níveis, mas só nos resta torcer para que alguém descubra
Não há uma razão fundamental para acreditar que seja impossível. Isso não se encaixa no paradigma atual de uma única sequência de tokens, mas é justamente por isso que paradigmas evoluem
O modelo só deve receber dados que o usuário poderia ler por alguma outra interface
A solução é tratar o LLM como um componente não confiável e projetar o sistema com essa premissa
Usando um banco de dados vetorial junto com uma API, é fácil passar contexto ou informações de controle de acesso baseado em papéis, e isso funciona bem
Não fiquei muito impressionado com LLMs em forma de base de conhecimento, mas como interface eles são muito mais impressionantes
Alguns dias atrás, apareceu aqui a expressão sistema operacional, e eu também gostei dela
Uma hora atrás também usei o ChatGPT e, curiosamente, ele transformou minha consulta em uma busca no Bing e respondeu de forma consistente com as informações corretas. Perguntei coisas específicas sobre um projeto open source; antes ele só conhecia a especificação da API e a documentação, mas desta vez funcionou muito bem
LLMs são inerentemente inseguros, principalmente porque são inerentemente fáceis de enganar. Para serem úteis, eles precisam ser enganáveis até certo ponto, mas por causa disso qualquer aplicação que exponha texto de fontes não confiáveis, como resumo de páginas web, pode ser subvertida por um atacante malicioso
Estamos falando de injeção de prompt há 14 meses, mas ainda não há nada que pareça perto de uma solução confiável
Espero muito que alguém resolva esse problema em breve; caso contrário, será difícil construir com segurança muitas das coisas que gostaríamos de fazer com LLMs
[1] https://gandalf.lakera.ai/
Para explicar um pouco melhor o meu ponto de vista: acho que, no fim, a direção será aplicar algo como
addslashesa todos os prompts interpretados pelo LLM. Por isso simplifiquei para “o LLM consegue resolver esse problema”Se pensarmos no que
addslashesfaz, ele aplica código que remove ou mitiga caracteres especiais que afetam a execução do código subsequente. Da mesma forma, acho que um LLM também pode higienizar a entrada por conta própria para impedir escapesSe você concorda que não há nenhum caractere de entrada capaz de remover as barras adicionadas, então deveria existir uma versão de
addslashespara prompts — umaddslashesenvoltório que mitiga prompt injection — da qual nenhuma instrução consiga escaparNão pensei até o fim em que impacto isso teria na usabilidade do sistema, mas ele deveria conseguir executar a maioria das tarefas permanecendo dentro do escopo de uso pretendido
Se a Lakera AI tem uma defesa contra isso, deveria conseguir provar. Se existe um método 100% eficaz para bloquear injections, deveria haver uma fase impossível dentro do jogo. Mas, como esse método não existe, também não há uma fase assim no jogo
A Lakera AI usa uma defesa probabilística, mas o marketing faz parecer que há algo mais confiável do que isso. Ninguém demonstrou um detector totalmente confiável, e não existe método que impeça com certeza todas as prompt injections. Acho sinceramente enganoso que a Lakera AI frequentemente omita esse fato no marketing
O texto acima está errado. Não há como detectar esse ataque específico com 100% de confiabilidade usando um detector de injections. O correto seria dizer que a Lakera AI tem um detector de injections que às vezes pega esse ataque. Mas a Lakera não descreve isso assim no marketing. Ela tenta vender, de forma velada, um produto que não existe e que os pesquisadores nem sequer provaram que conseguem criar
Em outras palavras: entre os clientes que precisam de defesa contra prompt injection e estão dispostos a pagar por isso, quem pode tolerar algum nível de erro?
O usuário não pretendia que suas conversas anteriores fossem vistas pelo atacante. Essa é a falha de segurança
Essa conversa poderia ter sido totalmente inofensiva, mas também poderia envolver aconselhamento sobre questões pessoais, como saúde, finanças ou relacionamentos
Eu criei um GPT customizado que faz isso no lugar delas
Você já escreveu em um blog ou publicou em algum lugar o processo de criação dele? Parece bem legal