
Scanner haute fidélité pour CVE-2026-41940 (contournement d'authentification cPanel & WHM)
Un scanner haute-fidélité pour le contournement d'authentification cPanel/WHM référencé sous le nom CVE-2026-41940. Il identifie les hôtes vulnérables sans produire les faux négatifs courants dans les preuves de concept et détections publiques, et sans déclencher les mécanismes de verrouillage de compte et de liste blanche d'IP root qui interfèrent avec un scan naïf.
L'outil intègre également une chaîne d'exploitation distincte, activable sur option, pour un bogue de traversée de chemin CalDAV de la même famille sur cpdavd (ports 2079 en clair / 2080 TLS) — CVE-2026-29205 — qui permet à un attaquant distant de lire des fichiers arbitraires en tant que root une fois qu'une petite étape de configuration SMTP réussit. cPanel 11.134.0.26 corrige le bogue de durée de vie RAII sous-jacent, de sorte que la lecture s'exécute désormais sous l'identité du propriétaire du compte non privilégié ; la traversée elle-même atteint toujours cpdavd mais ne peut pas escalader au-delà de ce que ce compte peut déjà lire. La chaîne CalDAV est activée par --exploit et est désactivée par défaut car elle envoie de vrais emails et lit des fichiers sur des cibles confirmées — voir la section Mode exploit (actif).
La plupart des détections publiques de CVE-2026-41940 partagent trois problèmes. Ce scanner les aborde tous.
Vous pouvez lire notre article de blog sur cette technique de détection ici : https://slcyber.io/research-center/high-fidelity-check-for-the-cpanel-authentication-bypass-cve-2026-41940/
La configuration Apache par vhost de cPanel installe un ProxyPass qui transmet /___proxy_subdomain_whm à 127.0.0.1:2086 et /___proxy_subdomain_cpanel à 127.0.0.1:2080 indépendamment de l'en-tête Host de la requête. Le RewriteCond ne contraint que la réécriture qui mappe le sous-domaine d'administration sur le chemin proxy ; le ProxyPass lui-même est inconditionnel. Atteindre ces chemins sur n'importe quel vhost servi par un Apache géré par cPanel atteint le même backend vulnérable que les ports d'administration.
Les scanners qui ne sondent que les ports 2082/2083/2086/2087 signaleront un hôte comme non vulnérable lorsque ces ports sont pare-feu, alors que le bogue est entièrement accessible via le port 443. Ce scanner sonde les ports 2087, 2083 et les deux chemins proxy sur le port 443 par défaut.
cPanel fournit cphulkd, qui verrouille les comptes après un petit nombre de tentatives de mot de passe échouées, et authorized_whm_root_ips, qui restreint les connexions root à une liste configurée d'adresses sources. Un scanner qui exploite le contournement en tentant d'injecter une session pour root :
Ce scanner évite ces deux problèmes côté WHM en injectant expired=1 dans la charge utile de la session sous un nom d'utilisateur généré aléatoirement. L'injection de session est vérifiée en visitant l'URL cpsessXXXX résultante et en recherchant msg_code:[expired_session] dans le corps de la réponse, qui n'est présent que lorsque l'injection a réussi. Aucun compte réel n'est ciblé, donc aucun compte réel ne peut être verrouillé, et la liste blanche root est sans importance car aucune tentative de connexion root n'est effectuée.
Le démon cPanel (cpaneld, ports 2083 et le chemin /___proxy_subdomain_cpanel) exige que le nom d'utilisateur fourni corresponde à un compte cPanel existant sur le disque (-f /var/cpanel/users/$user). Un nom d'utilisateur root ne satisfera jamais cette vérification car root est un utilisateur système, pas un utilisateur cPanel. Les détections qui n'essaient que root produisent des faux négatifs sur cette surface. Ce scanner utilise une liste configurable de noms d'utilisateur cPanel courants contre la surface cPanel et revient au chemin du nom d'utilisateur aléatoire sur la surface WHM, qui n'a pas une telle restriction.
Pour chaque cible, le scanner effectue les étapes suivantes par surface :
GET /login et lit l'en-tête Set-Cookie pour soit whostmgrsession (WHM) soit cpsession (cPanel). Le cookie contient un composant de nom de session séparé par des virgules.GET / avec un en-tête Authorization: Basic dont la valeur décodée est <user>:\xff\nexpired=1. Le \nexpired=1 final est la charge utile d'injection de session. Le cookie de session de l'étape 1 est renvoyé inchangé.Location de la réponse et extrait le jeton cpsessXXXX.GET /<cpsessXXXX>/ avec le cookie d'origine et recherche msg_code:[expired_session] dans le corps. Sa présence prouve que l'injection de session a réussi et que l'hôte est vulnérable.Sur WHM (port 2087 et le chemin /___proxy_subdomain_whm sur le port 443), le nom d'utilisateur est un u aléatoire suivi de dix caractères hexadécimaux. Sur cPanel (port 2083 et le chemin /___proxy_subdomain_cpanel sur le port 443), le scanner parcourt sa liste de noms d'utilisateur et s'arrête au premier correspondant.
Par défaut, le scanner sonde les ports 2087, 2083 et 443 dans cet ordre et s'arrête dès qu'une surface confirme la vulnérabilité.
--exploit)CVE-2026-29205 — Mise à jour de sécurité cPanel/WHM WP2, 13 mai 2026. Correction dans cPanel 11.134.0.26. L'avis suit la même régression de baisse de privilèges
cpdavdque cette chaîne d'exploitation utilise.
Article complet sur le bogue et la chaîne d'exploitation : https://slcyber.io/research-center/new-age-of-collisions-reading-arbitrary-files-pre-auth-as-root-in-cpanel-cve-2026-29205
cpdavd sur les ports 2079 (HTTP en clair) et 2080 (TLS) fait confiance au chemin <principal>/<collection>/... qu'il construit lors du traitement des ressources CalDAV/CardDAV. En forgeant une requête dont le composant de chemin encode des segments .. et en la pointant vers un dossier maildir dont le nom sur le disque encode également une traversée (x-attachment-1-y), cpdavd peut être contraint de lire n'importe quel fichier sur le disque en tant que root, indépendamment de la propriété ou des permissions — y compris /etc/shadow, /etc/passwd et les spools de messagerie par utilisateur.
La défense en profondeur qui était censée réduire les privilèges au propriétaire du compte avant la lecture a silencieusement échoué : l'objet Cpanel::AccessIds::ReducedPrivileges était construit dans un contexte vide, donc son destructeur a restauré les privilèges root avant que la lecture ne s'exécute. cPanel 11.134.0.26 lie l'objet à une variable lexicale my $privs afin qu'il survive à la chaîne -f / stat / open / read ; sur les hôtes corrigés, la lecture s'exécute donc sous l'identité du propriétaire du compte non privilégié au lieu de root.
Le dossier vulnérable doit exister sur le disque avant que la lecture ne fonctionne. cPanel crée automatiquement un dossier nommé .x-attachment-1-y pour le destinataire <user>+x-attachment-1-y@<domain> la première fois qu'un email arrive à cette sous-adresse. La chaîne est donc :