Notas prácticas de red teaming de IA/LLM
Bienvenido. Estas son notas prácticas y directas sobre red teaming de LLM, escritas desde el punto de vista de un pentester. Usa las pestañas de arriba para moverte: Fundamentos explica qué estás probando en realidad, Ataques y Metodología son el cómo, Bootcamp es un curso guiado y PortSwigger trae laboratorios resueltos, Alcance y Flujo de ataque te ayudan a delimitar un objetivo, y Terminología es el diccionario rápido. ¿Primera vez aquí? Solo lee esta pestaña de arriba abajo. Pulsa / en cualquier momento para buscar en todo.
Lee esto primero. En un minuto te muestra qué es realmente una "función de IA", las palabras modelo / chatbot / agente, y cómo la IA genera una respuesta. Una vez que ves el panorama, las demás pestañas cobran sentido.
Una "función de IA" no es más que una app normal con un modelo de IA enchufado. Pruebas la app que construyó el cliente. El cerebro del modelo suele ser del proveedor (Claude, OpenAI) y queda fuera de alcance.
Estas tres palabras confunden a todo el mundo. Es solo una escalera: cada peldaño añade una cosa.
Cuanto más a la derecha, más puede hacer, y más puedes atacar tú.
El modelo no "piensa". Lee texto y adivina la siguiente palabra, una y otra vez. Lo que merece la pena mirar no es el adivinar, es quién escribió el texto del que adivina. Cinco tipos de texto acaban delante de él, y solo uno lo escribió la gente que construyó la aplicación.
Una sola imagen, de izquierda a derecha. Cinco tipos de texto llegan por la izquierda, se unen en una sola cadena y se entregan al modelo. Fíjate en el documento ámbar: se sienta dentro del turno verde de user, y cuando el modelo lo tiene, ya no está. Cada caja lleva el ataque en el que se convierte, y las tres marcas discontinuas son los únicos sitios donde puede ponerse un control.
Cada flecha lleva texto. Las etiquetas de rol sobreviven hasta dentro del modelo, pero etiquetan turnos y no autores, y los tres controles están fuera de la caja.
Vuelve a mirar la caja del modelo en el diagrama. Las etiquetas de rol entraron y salieron por el otro lado, pero el documento ámbar no: quedó plegado dentro del turno verde de user, y dentro del modelo ya no queda nada que diga que lo escribió un desconocido.
Los roles son reales. Una API moderna recibe system, user, assistant y tool como campos separados, y sobreviven hasta la secuencia de tokens como tokens delimitadores. Lo que no sobrevive es nada más fino que un turno.
Un documento recuperado no tiene un rol propio. Se pega dentro de un turno user, o dentro de un turno tool, así que cuando el modelo lo lee lleva exactamente el rango del turno en el que lo metieron. Lo mismo pasa con lo que trae una herramienta: la envoltura y el sitio de quien ataca son una sola masa bajo una sola etiqueta.
Y un rol es una tendencia, no un permiso. A los modelos se les entrena para dar más peso a una instrucción de system que a una de user, y la mayor parte del tiempo ese entrenamiento aguanta. Es una tendencia aprendida de ejemplos, no una regla que el runtime imponga, y por eso una instrucción lo bastante segura de sí misma dentro de una salida de herramienta todavía puede ganar. Instrucción y datos siguen siendo el mismo material.
Así que los controles que existen de verdad se sitúan antes de esta caja o después: filtros de entrada, listas de permitidos en la recuperación, escáneres de salida, aprobación de herramientas, sandboxes. Los que intentan trabajar dentro, como el entrenamiento de jerarquía de instrucciones, también son tendencias, y las tendencias se doblan. Y por eso la pregunta útil nunca es "¿es seguro el modelo?". Es sobre cuáles de estas flechas puede escribir quien ataca, y qué hay al otro lado de la caja cuando lo hace.
Cada capa que viste arriba tiene su propio bug. Este es el OWASP LLM Top 10, en palabras sencillas:
| Capa | El bug |
|---|---|
| Tu entrada | Inyección de prompts: tu texto actúa como un comando. |
| El modelo | Jailbreak (romper su seguridad); si está ajustado, filtrar sus datos de entrenamiento. |
| Documentos / RAG | Envenenar los documentos para que el modelo los obedezca (inyección indirecta). |
| Herramientas | Hacer que use una herramienta que no debería, o atacar la entrada de la herramienta (SQLi, SSRF, ejecutar código). |
| La respuesta que se muestra | Manejo inseguro de la salida: la app ejecuta la respuesta como HTML/SQL, y llegan XSS y compañía. |
La misma respuesta puede estar bien en una app y ser un desastre en otra. Así que antes de probar, pregunta: ¿para qué sirve esta app y qué contaría como "malo" aquí?
| App | Cómo se ve lo "malo" |
|---|---|
| Generador de historias / juegos | quiere salidas creativas y disparatadas: casi todo vale. |
| Bot interno de RR. HH. o soporte | debe ceñirse a los hechos: inventarse una política es el bug. |
| Redactor de emails para la empresa | debe ser honesto pero acorde a la marca: un texto grosero o deshonesto es el bug. |
Normalmente quieres la inteligencia del modelo (buen lenguaje y razonamiento), no su conocimiento: debería responder a partir de tus datos y decir "no lo sé" en caso contrario.
Fuentes: OWASP Top 10 for LLM Apps, PortSwigger Web LLM attacks, MITRE ATLAS. Siguiente: la pestaña Terminología para las palabras, luego Metodología para el plan.