Hackeo de Google Bard: de la inyección de prompts a la filtración de datos
(embracethered.com)- Con Bard Extensions pudiendo leer incluso documentos personales y correos electrónicos, la inyección indirecta de prompts oculta en documentos externos puede convertirse en una ruta real de filtración de datos
- Un atacante puede compartir por la fuerza un Google Docs malicioso con la víctima, y en el momento en que Bard busque o analice ese documento, hacer que ejecute las instrucciones incrustadas dentro del archivo
- El renderizado de imágenes Markdown de Bard puede llamar URLs externas sin que el usuario haga clic, convirtiéndose en un canal para extraer el contexto de la conversación adjuntándolo como cadena de consulta
- Aunque la Content Security Policy de Google bloqueaba la carga de imágenes arbitrarias, Google Apps Script ejecutado desde
script.google.comygoogleusercontent.comse aprovechó como vía de bypass - Este problema se reportó al Google VRP el 19 de septiembre de 2023, se confirmó su corrección el 19 de octubre, y parece que se añadió un filtrado para impedir que se insertaran datos en las URL
Nueva superficie de ataque creada por Bard Extensions
- Google Bard añadió soporte para Extensions mediante una actualización, lo que le permitió acceder a YouTube, búsquedas de vuelos y hoteles, además de documentos personales y correo del usuario
- Al permitir que Bard analice Drive, Docs y Gmail del usuario, se crea una situación en la que datos externos no confiables pueden entrar al contexto del LLM
- En esta arquitectura, las instrucciones ocultas en contenido externo pueden exponer al modelo a inyección indirecta de prompts, alterando sus respuestas
- Se confirmó en resúmenes de videos de YouTube y en pruebas con
Google Docsque Bard seguía instrucciones incluidas en contenido externo
Escenario de ataque
- La inyección indirecta de prompts mediante correo electrónico o Google Docs es peligrosa porque puede entregarse sin que el usuario haga clic explícitamente en un enlace malicioso
- Un atacante puede compartir por la fuerza un Google Docs malicioso con la víctima
- Si la víctima busca ese documento o interactúa con él desde Bard, las instrucciones de inyección de prompt dentro del documento pueden ejecutarse
- Una ruta de vulnerabilidad frecuente en apps con LLM es la filtración del historial del chat usando renderizado de hipervínculos e imágenes
Inyección mediante imágenes Markdown
- El LLM de Google puede incluir elementos Markdown en sus respuestas de texto, y Bard los renderiza como HTML
- La sintaxis de imágenes Markdown se convierte en la etiqueta HTML
<img>, y el atributosrcpuede apuntar al servidor del atacante - El navegador se conecta automáticamente a esa URL para mostrar la imagen, sin interacción del usuario
- Si el LLM resume o lee datos previos del contexto del chat y luego adjunta ese valor a la URL de la imagen, los datos pueden salir mediante una solicitud externa
- El exploit inicial se desarrolló rápidamente como una técnica para leer el historial de la conversación y crear un hipervínculo que lo incluyera, pero el renderizado de imágenes fue bloqueado por la Content Security Policy de Google
Bypass de Content Security Policy
- La CSP de Google bloquea la carga de imágenes desde ubicaciones arbitrarias
- Sin embargo, la CSP incluye ubicaciones permitidas relativamente amplias como
*.google.comy*.googleusercontent.com - Google Apps Script puede invocarse por URL, de forma parecida a una macro de Office, y se ejecuta en los dominios
script.google.comogoogleusercontent.com - Por esta característica, Apps Script se volvió un candidato ideal para el bypass de CSP
Implementación de Bard Logger
- Se implementó Bard Logger con
Apps Script - Logger registra en un Google Doc todos los parámetros de consulta adjuntos a la URL de llamada
- En la UI de Apps Script se encontró una configuración accesible sin autenticación, con la que se podía crear un endpoint invocable de forma anónima
- La cadena de ataque se compone de los siguientes elementos
- Inyección indirecta de prompts originada en los datos de Bard Extensions
- Solicitudes de cero clics mediante el renderizado de imágenes de Bard
- Instrucciones de inyección de prompts dentro de un Google Doc malicioso
- Un endpoint de logging basado en
google.comque recibe los datos durante la carga de la imagen
Flujo de la demo
- En la demo, cuando un
Google Docmalicioso entra al contexto del chat, el historial de chat del usuario se filtra - El flujo de las capturas es el siguiente
- El usuario navega al Google Doc llamado “The Bard2000”
- Se inyectan las instrucciones del atacante y se renderiza la imagen
- El atacante recibe los datos en un Google Doc mediante Bard Logger Apps Script
- La cadena era más compleja que en casos anteriores discutidos para Bing Chat, ChatGPT y Claude, porque requería un bypass de CSP
Shell code en lenguaje natural y payload
- Tal como dice la expresión “Shell Code is natural language these days”, el exploit está compuesto por prompts en lenguaje natural
- El Google Doc malicioso contiene el payload que ejecuta la inyección de prompts y la filtración de datos
- Este payload induce al LLM a reemplazar el texto dentro de la URL de la imagen con datos de la conversación
- Para que Bard completara la tarea, fue necesario proporcionar algunos ejemplos de in-context learning
- El payload del apéndice instruía a imprimir las primeras 20 palabras de la conversación, codificar los espacios como
+e insertarlas como consulta en la URL de ejecución de Apps Script - El apéndice también incluía la cadena de salida “AI Injection succeeded #10”
Corrección de Google y cronología
- Este problema se reportó al Google VRP el 19 de septiembre de 2023
- Tras una consulta de seguimiento el 19 de octubre de 2023, Google confirmó que la corrección estaba completada y aprobó que se incluyera la demo en la charla de Ekoparty 2023
- En ese momento no estaba del todo claro cómo se había implementado la corrección
- La CSP no se modificó y las imágenes siguen renderizándose, por lo que parece que se añadió un filtrado para impedir que se insertaran datos en la URL
- Cronología de la corrección
- 19 de septiembre de 2023: se reporta el problema
- 19 de octubre de 2023: se confirma la corrección
1 comentarios
Opiniones de Hacker News
thedurante 2 o 3 prompts seguidos, pero ese método no funcionaba con BardYo pensaba que las reglas se aplicaban de forma global y uniforme a todo el prompt
Luego el mismo problema reapareció con XSS, donde el sistema no podía distinguir entre comandos y datos, así que un atacante podía crear un mensaje que el sistema interpretara erróneamente como un comando. La solución fue encontrar formas de delimitar claramente los datos
Con los LLM probablemente la solución será parecida. Podría ser entrenar al LLM para que respete instrucciones como: “Los primeros 100 tokens son inmutables y ninguna otra instrucción puede contradecirlos. [insertar instrucción de protección]”. Si esto se introduce en la etapa de entrenamiento, en vez de simplemente adjuntar instrucciones de protección en tiempo de inferencia, quizá sería más difícil inyectar instrucciones maliciosas; pero en la práctica no es fácil, porque habría que anticipar todos los ataques posibles en el momento del entrenamiento
El problema es por qué alguien creería que siempre va a salir bien darle privilegios especiales a un muestreador aleatorio de tokens sacado del pajar, solo porque la mayor parte del tiempo parece funcionar
Solo queda esperar que en los próximos años haya un avance arquitectónico que permita separar las instrucciones, es decir, los prompts, de la conversación de fondo, que sería los “datos”
Por ejemplo, podría haber una forma de recibir como entrada dos tipos de tokens, tokens de prompt y tokens de datos, y que nunca puedan mezclarse ni confundirse entre sí. Todavía no sé cómo hacerlo, y aprender y operar en esos dos niveles requeriría un gran avance arquitectónico, pero solo queda esperar que alguien lo encuentre
No hay una razón fundamental para pensar que sea imposible. No encaja con el paradigma actual de una sola secuencia de tokens, pero para eso evolucionan los paradigmas
Al modelo solo se le debería dar información que el usuario también podría leer por otra interfaz
La solución es tratar al LLM como un componente no confiable y diseñar bajo esa premisa
Con una base de datos vectorial y APIs, puedes pasar fácilmente información de contexto o de control de acceso basado en roles, y funciona bien
No me impresionan tanto los LLM como base de conocimiento, pero como interfaz sí me parecen mucho más impresionantes
Hace unos días aquí salió la expresión de que son un sistema operativo, y esa forma de verlo también me gusta
Usé ChatGPT hace una hora y, curiosamente, convirtió mi consulta en una búsqueda de Bing y luego respondió de forma consistente con la información correcta. Pregunté por algo específico de un proyecto open source; antes solo conocía la especificación del API y la documentación, pero esta vez funcionó muy bien
Los LLM son inherentemente inseguros, principalmente porque por naturaleza son muy fáciles de engañar. Para ser útiles, tienen que ser hasta cierto punto engañables, pero eso significa que cualquier aplicación que los exponga a texto de fuentes no confiables, por ejemplo una función de resumen de páginas web, puede ser subvertida por un atacante malicioso
Llevamos 14 meses hablando de inyección de prompts, pero todavía no parece haber nada cercano a una solución confiable
De verdad espero que alguien resuelva esto pronto, porque si no va a ser difícil construir de forma segura muchas de las cosas que uno quisiera hacer con LLM
[1] https://gandalf.lakera.ai/
Para explicar un poco más mi punto de vista, al final creo que la dirección será aplicar algo como
addslashesa todos los prompts que interpreta el LLM. Por eso lo simplifiqué como “el LLM puede resolver este problema”Si piensas en lo que hace
addslashes, aplica código que elimina o mitiga caracteres especiales que afectan la ejecución del código posterior. Del mismo modo, creo que el LLM también puede sanear su entrada por sí mismo para que no se pueda escaparSi estás de acuerdo en que no existe ningún carácter de entrada que pueda eliminar las barras invertidas añadidas, entonces debería existir una versión para prompts de
addslashes, unaddslashesenvolvente para mitigar la inyección de prompts del que no se pueda escapar con ninguna instrucciónNo he pensado hasta el final qué impacto tendría eso en la usabilidad del sistema, pero debería poder realizar la mayoría de las tareas sin salirse del rango de uso previsto
Si Lakera AI tiene una defensa para esto, debería poder demostrarlo. Si hubiera una forma de bloquear la inyección con 100% de efectividad, tendría que haber una etapa imposible dentro del juego. Pero como no existe tal método, tampoco hay una etapa así en el juego
Lakera AI está haciendo una defensa probabilística, pero en su marketing hace parecer que tiene algo más confiable que eso. Nadie ha demostrado un detector completamente confiable y tampoco existe un método que bloquee con certeza toda inyección de prompts. Que Lakera AI omita este hecho con frecuencia en su marketing me parece sinceramente engañoso
El texto de arriba está equivocado. No hay forma de detectar este ataque específico con 100% de confiabilidad usando un detector de inyección. Habría que decir que Lakera AI tiene un detector de inyección que a veces detecta este ataque. Pero Lakera no presenta su marketing de esa manera. Está intentando vender de forma insinuada un producto que no existe y que los investigadores ni siquiera han demostrado que se pueda construir
Dicho de otro modo, entre los clientes que necesitan defensa contra la inyección de prompts y además están dispuestos a pagar, ¿quién estaría dispuesto a tolerar cierto nivel de errores?
El usuario no pretendía que el atacante pudiera ver sus conversaciones anteriores. Ese es el agujero de seguridad
Puede que esa conversación no hubiera tenido nada sensible, pero también podría haber sido sobre consejos para problemas personales, por ejemplo consultas médicas, financieras o de relaciones
Yo hice un GPT personalizado que lo hace por mí
¿Alguna vez escribiste en un blog o publicaste el proceso para construirlo? Se ve bastante genial