Seguridad

GenAI Apps & Services: Cómo explotar arquitecturas RAG con Plugins Inseguros

Dentro del OWASP TOP 10 para LLM Apps & Services, el LLM07 está dedicado al “Insecure Plugin Desing”, o como diríamos en Español, al uso de plugins conectados a modelos LLM con fallos de seguridad que pueden hacer que una GenAI App o un GenAI Service utilizado un LLM puedan tener fallos de seguridad. 

Figura 1: GenAI Apps & Services. Cómo explotar
arquitecturas RAG con Plugins Inseguros

De esto he hablado en la charla que impartí en la pasada TRC 2023 en la charla de “Hacker & Developer in the Age of GenAI“, que mis compañeros del equipo de Ideas Locas me prepararon una demo para explicar este concepto en detalle.
El objetivo final es poder mezclar datos y acciones con datos privados o con capacidades en plataformas terceras con la potencia de los modelos LLM. Para eso hay que conectar un modelo público, o entrenado con datos públicos o incluso privados de una organización, con datos puramente personales.
Ampliando el alcance de los modelos LLM
Cómo hacer esta conexión es lo que ha llevado a extender capacidades con plugins, a crear entrenamientos extendidos con datos nuevos, a las arquitecturas RAG (Retrieval Augmented Generation) que tanto se están extendiendo hoy en día, y al uso de funciones que son llamadas a la hora de resolver un prompt.

Figura 3: Microsoft Azure OpenAI Fine-Tuning
En la imagen anterior tenéis, por ejemplo, el flujo de datos en la arquitectura de Fine-Tunning de modelos LLM desde Azure OpenAI, donde se ajustan los datos del modelo LLM de OpenAI que estés utilizando (GPT3, GPT3.5 Turbo, GPT4), con vectores de tokens sobre datos nuevos de entrenamiento generados desde el usuario, de tal manera que la app o el servicio de una compañía puede tener resultados ajustados sobre datos de la corporación, al mismo tiempo que usa la potencia de los modelos entrenados con datos públicos de OpenAI

Figura 4: Microsoft Azure OpenAI Arquitectura RAG

Con estas arquitecturas que interconectan el modelo LLM dentro de sistemas más complejos, se pueden diseñar arquitecturas RAG donde cuando la App hace un Prompt, en lugar de ir directamente al modelo LLM, este hace un Retrieval de los datos añadidos en esta arquitectura, y con ellos, hace un “Augmented Prompting” al motor LLM añadiendo datos necesarios.

Figura 5: Arquitectura Microsoft 365 Copilot
Un ejemplo de esto, es el propio Copilot de Microsoft 365, donde se puede ver que los datos privados de un usuario de mantienen en un “Knowledge Graph” que es consultado antes de hacer el Augmented Prompting al motor LLM de OpenAI. Así se mezcla la potencia del modelo entrenado con los datos públicos, con los datos privados de un usuario.
Creando un arquitectura RAG de demo con ChatGPT y Google Drive
Pero claro, dependiendo de cómo hagas estas arquitecturas, puedes encontrarte con situaciones de conexiones, funciones y flujos inseguros que pueden llevar a filtraciones de datos personales o privados de una organización que puede que no sea lo que te interesa, y esto es el LLM07 del OWASP Top Ten para LLM Apps & Services.
Para que podáis entender este caso, lo primero que vamos a suponer es que tenemos un servicio (en este caso será el propio ChatGPT) que utiliza una serie de Plugins. Para que entendáis esta arquitectura debéis imaginar que este ChatGPT podría ser cualquier Copilot que haya diseñado cualquier empresa para una de sus aplicaciones, y que utilice por detrás un motor LLM (que puede ser GPT4, Gemini, Mixtral, Llamav2 etc…) – e incluso un  SLM –  para orquestar la lógica de interacción. 

Figura 7: Accediendo a ficheros de Google Drive con ChatGPT

Este motor LLM, para extender sus funcionalidades utiliza varios plugins, que permiten automatizar tareas o extender su alcance. Esto es una forma de ampliar las capacidades del motor LLM sobre otros conjuntos de datos, algo que dará lugar, pero también para ampliar las capacidades de prompting, validación o ejecución de acciones. 

Figura 8: La primera vez que se conecte MixerBox ChatDrive debemos dar acceso
Con estos plugins, en una GenAI APP o en un GenAI Service como ChatGPT se pueden hacer cosas como acceder a datos de un Google Drive, a automatizar prompting con URLS o a enviar los resultados por e-mail, que son los tres plugins de ChatGPT que vamos a ver en esta demo. Que son los siguientes. El primero de ellos es MixerBox ChatDrive, que permitirá acceder a contenido de Google Drive desde ChatGPT

Figura 9: Conseguimos un Token OAuth de ese Google Drive para ChatDrive

Para ello, la primera vez se debe realizar un proceso de autenticación, que sería como configurar una conexión interna de nuestro motor LLM a una fuente de datos externa. Así que hacemos el proceso, se genera un Token OAuth que utilizará la GenAI App, en este caso ChatGPT. Luego ya podemos hacer Augmented Prompting para que no pida ninguna autenticación extra.

Figura 10: Usando ChatDrive con “Augmented Prompting” manualmente
Y una vez hecho esto, ya tenemos nuestra arquitectura RAG de demo hecha con un plugin, y ChatGPT manualmente, que como se puede ver en el Augmented Prompting le recordamos – a mano – que ya tiene el Token OAuth para que la experiencia de autenticación sea transparente.

Insecure Pluging Desing en LLM Apps & Services
Así que hemos conectado una fuente de datos a un motor LLM como ChatGPT, pero si no controlamos ese Prompt en la App que ponemos en frente de los usuarios, se podrían producir diferentes ataques por no haber contemplado todos los posibles vectores de ataque. Vamos a ver algunos ejemplos.
Filtrar todos los datos de las fuentes de datos vinculadas a una LLM App
La idea es tan sencilla que, si has conectado una fuente de datos externa con un plugin y no has tenido en cuenta que te pueden hacer ataques de extracción de datos masivos, pues la puedes liar. Imagínate un escenario en el que un usuario haciendo SQL Injection pudiera volcar todos los datos de una base de datos. En este caso es lo mismo, no hay control de acceso de seguridad, así que si vinculas una fuente de datos como hemos hecho ahora, y alguien pide todos los datos, podrá llevárselos. 

Figura 11: Usando Prompt en una URL para WebPilot y el plugin de Email Me

Para hacerlo más rápido y visual, hemos utilizado dos plugins más, como son WebPilot para automatizar Prompts desde URLs (genial para pentesting y exploiting), o el de Email Me, para que los datos lleguen filtrados por e-mail por un canal paralelo que nos permita saltarnos cualquier filtro que pueda haber por la aplicación en el front-end. Así que en lugar de pedirle que nos muestre todos los datos por pantalla como hemos visto en la Figura 10, se lo pedimos por e-mail.

Figura 12: El prompt en una URL de GitHub

Es solo un ejemplo de cómo conectar un plugin sin control de acceso a la información de una fuente de datos externa puede ser un verdadero problema, ya que en este ejemplo se ha hecho con ChatGPT, pero… ¿cuántos Copilots de empresa tiene conectadas fuentes de datos que cualquiera se puede llevar masivamente con este ejemplo? Pues muchos, me temo.

Figura 13: Todos los datos de la fuente externa por e-mail

Es solo un ejemplo muy sencillo, pero creo que es fácil de entender en qué consiste el LLM07 de OWASP TOP 10 para LLM Apps & Services.
Filtrando los prompts de otros usuarios
En el ejemplo anterior hemos visto cómo se pueden acceder a todos los datos de una fuente externa vinculada a un modelo LLM si no se han puesto controles de seguridad en el prompting y en los canales de respuesta de datos, ahora vamos a ver cómo en un entorno multiusuario se pueden filtrar los prompts de otros usuarios.

Figura 14: Un usuario pide un Prompt cualquiera

En este caso, hemos hecho un Prompt desde ChatGPT, que supuestamente lo ha hecho un usuario desde una GenAI App o GenAI Service para hacer algo. Ahora otra usuario inyecta un Prompt para conseguir que nos de la lista de los últimos prompts que se han solicitado al modelo LLM de la empresa.

Figura 15: Un Prompt que pide todos los prompts por e-mail en una URL de GitHub

Para ello, de nuevo, utilizamos un Prompt en una URL de GitHub para utilizar WebPilot, y el plugin de Email Me con el objeto de filtrar la información por un canal paralelo y nos llegue al e-mail.

Figura 16: Prompteamos esa URL y ejecutamos el exploit

El resultado es que si no se han tenido estos controles de seguridad, con estos plugins podemos filtrar información privada de otros usuarios. 

Figura 17: Recibimos todos los prompts por e-mail
Hay que tener en cuenta que en el Prompt que llega al LLM va información, más cuando se está usando Augmented Prompting, con lo que se ha enriquecido con datos.
Conclusiones
Estos son solo algunos ejemplos de la cantidad de bugs y fallos de seguridad que nos vamos a encontrar en este nuevo mundo de Pentesting GenAI Apps & Services, así que más vale que te pongas las pilas. Si quieres conocer más de esto, en la próxima Hackr0n 2024 hablaré de estas cosas, así que te espero por allí.
¡Saludos Malignos!
Autor: Chema Alonso (Contactar con Chema Alonso)  

Powered by WPeMatico

Gustavo Genez

Informático de corazón y apasionado por la tecnología. La misión de este blog es llegar a los usuarios y profesionales con información y trucos acerca de la Seguridad Informática.