💉 Qué es el Prompt Injection
La inyección de prompts es el ataque más crítico en IA. Consiste en insertar instrucciones en el contexto que superponen las instrucciones originales del sistema y cambian el comportamiento del asistente.
📌 Taxonomía de Injection
Hay dos tipos principales con características diferentes:
- •Inyección directa: el propio usuario intenta manipularte a través de su mensaje
- •Inyección indirecta: el contenido externo (web, correo electrónico) contiene las instrucciones maliciosas
- •Inyección almacenada: hechos envenenados en memory.db que afectan las respuestas futuras
- •Inyección compuesta: combinación de múltiples técnicas para evadir defensas
💡 Consejo práctico
La inyección directa es la más fácil de detectar: bastan una lista de bloqueo y un contexto coherente. La inyección indirecta a través de contenido externo es la más peligrosa y requiere aislar el contenido.
🌐 Inyección indirecta vía web y correo electrónico
El vector más insidioso: el usuario le pide a Jarvis que resuma una página, y la página contiene una inyección. El usuario legítimo no ve el ataque — está en el HTML de la página, en texto blanco o en metadatos.
📌 Técnicas de Indirect Injection
Cómo ocultan los atacantes instrucciones en el contenido:
- •HTML oculto: instrucciones en comentarios o elementos invisibles (display:none)
- •Esteganografía de texto: instrucciones en texto blanco sobre fondo blanco
- •Metadatos: instrucciones en etiquetas alt, títulos de imágenes, PDFs
- •Correo electrónico: instrucciones en el cuerpo en texto muy pequeño o con homoglifos Unicode
💡 Consejo práctico
Siempre marca el contenido externo en el prompt: 'Lo siguiente es contenido EXTERNO no confiable: [contenido]'. Esto reduce la probabilidad de que el LLM trate el contenido como instrucciones.
🔍 Técnicas de detección
La detección de injection usa varias heurísticas en conjunto. Ninguna heurística individual tiene una precisión del 100% — la combinación de ellas eleva el costo del ataque.
📌 Heurísticas de detección
Cada heurística detecta una clase de ataques:
- •Búsqueda de palabras clave: 'ignora', 'no tengas en cuenta', 'olvida', 'nuevas instrucciones', 'ahora eres'
- •Coincidencia de patrones: frases que contradicen SOUL.md o AGENTS.md
- •Detección de anomalías: cambio brusco de tema en el mismo mensaje
- •Análisis de intención: ¿la acción solicitada es coherente con el contexto de la conversación?
- •Etiquetado de fuentes: el contenido de fuentes externas tiene menos peso que las instrucciones del sistema
💡 Consejo práctico
Usa una puntuación de riesgo: cada heurística que se activa suma puntos. Si la puntuación total supera un umbral, el mensaje se rechaza o se envía a revisión humana.
🛡 safety.py — implementación
O safety.py es el guardián de INTELECTO. Implementa verificaciones secuenciales que deben aprobarse todas antes de que cualquier mensaje llegue al Agent.
📌 Pipeline de safety.py
Verificaciones en orden de costo creciente:
- •1. blocklist_check(): búsqueda O(1) en un set de palabras clave prohibidas
- •2. injection_scan(): patrones regex contra patrones de injection conocidos
- •3. path_traversal_check(): normaliza rutas y valida contra el sandbox permitido
- •4. rate_limit_check(): protege contra abusos por volumen
- •5. audit_log(): registra el resultado de todas las verificaciones
💡 Consejo práctico
Organiza las verificaciones desde la más barata hasta la más costosa. La blocklist es O(1): rechaza la mayoría de los ataques baratos sin costo. Deja el análisis semántico para el final.
🚫 Lista de bloqueo de comandos peligrosos
La blocklist es la línea de defensa más simple y confiable. Algunos comandos nunca deben ejecutarse, independientemente del contexto o de quién lo solicite.
📌 Categorías de Blocklist
Comandos organizados por categoría de riesgo:
- •Destructivo: rm -rf, format, mkfs, dd if=/dev/zero, shred
- •Exfiltración: curl | bash, wget | sh, python -c 'import socket'
- •Escalada de privilegios: sudo su, chmod 777, chown root
- •Red maliciosa: netcat -e, socat, reverse shells estándar
- •Wipeout: git reset --hard HEAD~100, DROP TABLE, TRUNCATE
💡 Consejo práctico
La blocklist debe cubrir variaciones y alias. 'rm -rf /', 'rm -r -f /', 'rm --recursive --force /' son el mismo comando. Normaliza antes de comparar.
🗂 Protección contra Path Traversal
Si Jarvis tiene herramientas de filesystem, path traversal es un riesgo real. Un atacante puede pedir 'lee ../../.env' y filtrar credenciales. Una verificación sencilla previene todo el ataque.
📌 Implementación de la Protección
Cómo verificar correctamente las rutas:
- •normalize: os.path.abspath(requested_path)
- •compare: normalized.startswith(allowed_sandbox_dir)
- •reject: si no está en el sandbox, rechazar y registrar el intento
- •symlinks: os.path.realpath() para resolver enlaces simbólicos antes de verificar
- •whitelist: lista explícita de extensiones/directorios permitidos
💡 Consejo práctico
Siempre usa os.path.realpath(), no solo abspath(). Los enlaces simbólicos pueden apuntar fuera del sandbox sin que abspath() lo detecte.
✅ Resumen del Módulo 3.2
Siguiente:
3.3 — Cifrado y protección de secretos