flawopen.com/Teardowns/cve-2026-105697-langflow-mcp-stdio-command-injection
CVE-2026-105697: inyección de comandos MCP en Langflow
Antes de la versión 1.10.3, Langflow enviaba la configuración MCP stdio a un proceso iniciado mediante un shell. En una instancia expuesta con LANGFLOW_AUTO_LOGIN=true, un atacante podía obtener un token sin credenciales; con el inicio automático desactivado, un usuario autenticado que no fuera administrador aún podía alcanzar la ejecución de comandos en el host. La versión 1.10.3 valida todas las rutas, incluso justo antes de iniciar el proceso, y lo ejecuta sin shell.[1], [2], [3]
Imagina a un empleado que recibe una frase cuya puntuación puede cambiar la tarea: un signo puede convertir una instrucción de entrega en una segunda orden. Langflow enviaba el comando configurado a un shell que interpreta esa sintaxis como control, en vez de tratar el ejecutable y los argumentos como datos separados. La corrección valida el comando permitido e inicia el programa directamente, sin shell.[1], [2]
Conceptos Clave y Términos
Transporte MCP stdio- Inicia un servidor MCP como proceso hijo local e intercambia mensajes por la entrada y salida estándar.[1], [2]
Inyección de comandos (CWE-78)- Texto influido externamente altera el comando del sistema operativo enviado al shell o al lanzador de procesos.[1], [5]
Mapeos de marcos
- Referencia CWE para la debilidad descrita en esta guía: CWE-78
Análisis de Causa Raíz
Antes de la versión 1.10.3, la configuración MCP stdio unía el comando y sus argumentos en una cadena y ejecutaba bash -c con ella. La API de configuración obtuvo una lista permitida y controles de argumentos y entorno en la versión 1.9.0, pero las configuraciones MCP Tools incrustadas en flujos o tweaks podían eludir la validación del modelo porque el punto de ejecución no aplicaba una política común. Langflow 1.10.3 centraliza la validación en lfx.base.mcp.security.validate_mcp_stdio_config, la aplica a la API, flujos, tweaks, el componente heredado y justo antes de crear el proceso, y elimina el shell intermedio. CVE-2026-105697 es CWE-78, CVSS 3.1 9.9. Con el inicio de sesión automático desactivado, sigue haciendo falta un usuario autenticado que no sea administrador y pueda configurar o ejecutar la ruta MCP; el inicio automático predeterminado puede dejar instancias de desarrollo expuestas sin credenciales.[1], [2], [4], [5]
Flujo de Ataque Paso a Paso
El usuario alcanza una ruta de configuración MCP
El aviso describe el acceso mediante los ajustes del servidor MCP o un flow que utiliza el componente MCP Tools. En una instancia expuesta con el valor predeterminado de desarrollo LANGFLOW_AUTO_LOGIN=true, un atacante podía obtener un token sin credenciales. Con el inicio automático desactivado, aún podía bastar un usuario autenticado que no fuera administrador.[1]
La configuración llega a la preparación del proceso
El comando y los argumentos forman command_str mientras Langflow prepara una conexión MCP stdio.[1]
El shell interpreta la cadena
Antes de 1.10.3, la ruta usaba bash -c; la ejecución ocurría al intentar conectar, antes de completar el handshake MCP.[1]
Las comprobaciones de entrada son incompletas
La versión 1.9.0 valida los ajustes REST, pero los flow y tweaks pueden eludir esa validación del modelo.[1]
El proceso del host usa los privilegios de Langflow
El comando se ejecuta como usuario del servicio Langflow. La interfaz aún puede indicar que el servidor MCP no se inició.[1]
Código Fuente: Vulnerable vs. Seguro
El fragmento vulnerable muestra el patrón de inicio mediante shell documentado en el aviso; no es un exploit ejecutable. El fragmento corregido resume el diseño de 1.10.3: una política común valida la configuración en cada entrada y de nuevo justo antes de crear el proceso, mientras la API recibe el ejecutable y los argumentos por separado. El inicio directo elimina la interpretación del shell, pero no hace que todo ejecutable o paquete permitido sea seguro por sí solo; los operadores también deben aplicar controles de origen de paquetes y aislamiento adecuados.[1], [2]
Fragmento de origen: lfx/base/mcp/util.py — fragmentos de código específicos
# Forma de inicio afectada según el aviso (fragmento específico):
server_params = StdioServerParameters(
command="bash",
args=["-c", f"exec {command_str}"],
env=env_data,
)
# Reducción basada en el código de 1.10.3: valida la política y crea el proceso directamente.
command_parts = shlex.split(command_str)
if not command_parts:
raise ValueError("MCP stdio command is required")
command, args = command_parts[0], command_parts[1:]
validate_mcp_stdio_config(command, args, env_data) # Repeat at the execution boundary.
server_params = StdioServerParameters(
command=command,
args=args,
env=env_data,
) # No shell wrapper. The shared validator rejects disallowed configurations.
Lista de Verificación de Seguridad para Ingeniería
- ✓Actualiza
langflowa 1.10.3+,langflow-basea 0.10.3+ ylfxa 1.10.3+; verifica las versiones desplegadas.[1], [3] - ✓No consideres que las comprobaciones REST de 1.9.0 sean una corrección completa; revisa configuraciones MCP incrustadas en flow y tweak en versiones antiguas.[1]
- ✓Valida comando, argumentos, entorno, origen del paquete y aislamiento en cada entrada y justo antes de crear el proceso.[1], [2]
- ✓Pasa el ejecutable y el vector de argumentos por separado a la API de procesos; evita construir cadenas para el shell.[2]
- ✓En despliegues multiusuario, fija los paquetes permitidos de
npx/uvxy activa las opciones documentadas de endurecimiento del intérprete y Docker.[1] - ✓Recomendación de respuesta a incidentes de FlawOpen: Revisa quién podía configurar o ejecutar conexiones MCP stdio durante la exposición; busca procesos hijos inesperados de Langflow en la telemetría del host.[1]
- ✓Añade pruebas para API REST, flow, tweak, componente heredado y preinicio; confirma que las configuraciones rechazadas nunca crean procesos.[2]