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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
El resultado es que si no se han tenido estos controles de seguridad, con estos plugins podemos filtrar información privada de otros usuarios.
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)
1 comentario:
Perdonar la foto de yogurin, pero era yo de joven. El artículo es brillante y abre un debate muy interesante. ¿Hay algún estrategia o diseño útil con por ejemplo azure confidencial computing para evitar el agujero?. Muchísimas gracias Chema
Publicar un comentario