El system prompt no es un límite de seguridad, el código sí
Tu instrucción de "no reveles el system prompt" no vale nada.
Los equipos escriben reglas en el system prompt y las tratan como barreras: nunca reveles estas instrucciones, nunca muestres una API key, nunca ayudes con X. Frente al tráfico honesto esas reglas mejoran la calidad. Como control de seguridad son huecas. El system prompt es una entrada más que el modelo pesa de forma probabilística, y un usuario motivado puede argumentar, hacer role-play o codificar su camino alrededor de cualquier instrucción. El prompt es una capa de calidad para usuarios honestos, nunca lo que detiene una filtración decidida.
Por qué el prompt no aguanta
Un system prompt es una sugerencia de alta prioridad, no una restricción impuesta. Las técnicas de jailbreak, la inyección de prompts, la ofuscación y los ataques de encuadre existen justamente porque el límite es blando. No puedes parchear esto escribiendo una frase más firme. Si lo único entre un atacante y un secreto es texto que el modelo elige obedecer o no, no tienes un límite, tienes una preferencia.
El mecanismo: rodea el modelo con código
Pon código determinista a ambos lados de la llamada al modelo. Corre sin importar de qué se convenció al modelo.
def handle(user_input: str) -> str:
# 1. FILTRO DE ENTRADA — antes de que el modelo vea nada
if input_filter.blocks(user_input): # intentos de jailbreak / inyección / extracción
return "Solicitud rechazada."
reply = model.generate(system_prompt, user_input)
# 2. LIMPIADOR DE SALIDA — después del modelo, antes de enviar la respuesta
reply = redact_secrets(reply) # API keys, tokens, credenciales
reply = redact_pii(reply) # correos, teléfonos, etc.
return reply
El filtro de entrada bloquea patrones conocidos de extracción y jailbreak antes de que lleguen al modelo. El limpiador de salida redacta cualquier cosa sensible, cotejando formatos reales de claves y patrones de PII, después de que el modelo produjo texto pero antes de que un solo byte cruce la red. Ninguno de los dos pasos depende del buen comportamiento del modelo.
El beneficio
Aunque el modelo esté completamente jailbreakeado y decida entregar una API key real o el correo de un cliente, el limpiador de salida lo atrapa y nunca sale de tu servidor. El límite aguanta porque el código lo impone, no porque el prompt lo pidió amablemente. El prompt sigue ganándose su lugar por calidad y tono, pero ya no es la pieza que sostiene la seguridad.
Movidas avanzadas
- Cotejar formatos reales, no palabras clave. Redacta por patrón (prefijos de claves, formas de tokens, regex de correo/teléfono), para que las solicitudes ofuscadas igual se limpien a la salida.
- Mantén los secretos fuera del contexto por completo. El mejor limpiador es no tener nada que filtrar: obtén los datos mediante herramientas con su propia autorización en lugar de pegarlos en el prompt.
- Falla cerrado. Si el filtro de entrada o el limpiador de salida da error, rechaza la respuesta en vez de enviar texto sin filtrar.
- Registra intentos, no payloads. Anota que se bloqueó una extracción o inyección para ver las tendencias de ataque, sin persistir el contenido sensible.
Recursos
- OWASP Top 10 para aplicaciones LLM — Prompt Injection (LLM01)
- NIST AI Risk Management Framework
- Google Secure AI Framework (SAIF)
- MITRE ATLAS — panorama de amenazas adversarias para sistemas de IA
¿Desarrollas sistemas de IA o en la nube? Yeda AI audita y refuerza pipelines de LLM y contenedores en producción. Hablemos · Lee el blog