
Высокоточный сканер для CVE-2026-41940 (cPanel & WHM обход аутентификации)
Высокоточный сканер для обхода аутентификации cPanel/WHM, отслеживаемого как CVE-2026-41940. Он выявляет уязвимые хосты без ложных отрицательных результатов, характерных для публичных PoC и детектов, и без срабатывания механизмов блокировки учётных записей и белого списка IP-адресов root, которые мешают наивному сканированию.
Инструмент также включает в себя отдельную, опциональную цепочку эксплуатации
для баги обхода пути CalDAV того же семейства на cpdavd (порты 2079 plain / 2080 TLS) —
CVE-2026-29205 —
которая позволяет удалённому атакующему читать произвольные файлы от root,
как только выполнится небольшой шаг настройки через SMTP. cPanel 11.134.0.26
исправляет базовую ошибку времени жизни RAII, так что чтение теперь выполняется
от непривилегированного владельца учётной записи; обход по-прежнему достигает
cpdavd, но не может выйти за пределы того, что уже может прочитать эта учётная
запись. Цепочка CalDAV включается флагом --exploit и по умолчанию отключена,
поскольку она отправляет настоящие письма и читает файлы с подтверждённых целей —
см. раздел Режим эксплуатации (активный).
У большинства публичных детектов для CVE-2026-41940 есть три проблемы. Этот сканер решает каждую из них.
Вы можете прочитать нашу статью об этой технике обнаружения здесь: https://slcyber.io/research-center/high-fidelity-check-for-the-cpanel-authentication-bypass-cve-2026-41940/
Per-vhost конфигурация Apache от cPanel устанавливает ProxyPass, который
направляет /___proxy_subdomain_whm на 127.0.0.1:2086 и /___proxy_subdomain_cpanel
на 127.0.0.1:2080 независимо от заголовка Host запроса.
RewriteCond ограничивает только перезапись, которая сопоставляет поддомен управления
с путём прокси; сам ProxyPass безусловен. Обращение к этим путям на любом
vhost, обслуживаемом управляемым cPanel Apache, достигает того же уязвимого
бэкенда, что и порты управления.
Сканеры, которые проверяют только порты 2082/2083/2086/2087, сообщат, что хост не уязвим, когда эти порты закрыты брандмауэром, хотя ошибка полностью доступна через 443. Этот сканер по умолчанию проверяет 2087, 2083 и два прокси-пути на 443.
cPanel поставляется с cphulkd, который блокирует учётные записи после
небольшого числа неудачных попыток входа, и authorized_whm_root_ips, который
ограничивает входы root настроенным списком исходных адресов. Сканер, который
эксплуатирует обход путём попытки внедрить сессию для root, будет:
Этот сканер избегает обеих проблем на стороне WHM, внедряя expired=1 в
полезную нагрузку сессии под случайно сгенерированным именем пользователя.
Внедрение сессии проверяется посещением полученного URL с cpsessXXXX и
поиском msg_code:[expired_session] в теле ответа, который присутствует только
при успешном внедрении. Никакая реальная учётная запись не является целью,
поэтому ни одна реальная учётная запись не может быть заблокирована, а белый
список root не имеет значения, поскольку попытка входа от root не производится.
Демон cPanel (cpaneld, порты 2083 и путь /___proxy_subdomain_cpanel)
требует, чтобы предоставленное имя пользователя соответствовало существующей
учётной записи cPanel на диске (-f /var/cpanel/users/$user). Имя root
никогда не пройдёт эту проверку, потому что root — системный пользователь, а не
пользователь cPanel. Детекты, которые пробуют только root, дают ложные
отрицательные результаты на этой поверхности. Этот сканер использует настраиваемый
список распространённых имён пользователей cPanel для поверхности cPanel и
возвращается к пути со случайным именем на поверхности WHM, где такого
ограничения нет.
Для каждой цели сканер выполняет следующие шаги для каждой поверхности:
GET /login и читает заголовок Set-Cookie для
whostmgrsession (WHM) или cpsession (cPanel). Куки содержит
компонент имени сессии, разделённый запятыми.GET / с заголовком Authorization: Basic, декодированное
значение которого равно <user>:\xff\nexpired=1. Завершающее
\nexpired=1 — это полезная нагрузка для внедрения сессии. Куки сессии
из шага 1 воспроизводится без изменений.Location из ответа и извлекает токен cpsessXXXX.GET /<cpsessXXXX>/ с исходной куки и ищет
msg_code:[expired_session] в теле. Его наличие доказывает, что внедрение
сессии прошло успешно и хост уязвим.На WHM (порт 2087 и путь /___proxy_subdomain_whm на 443) имя пользователя —
это случайное u, за которым следуют десять шестнадцатеричных символов. На
cPanel (порт 2083 и путь /___proxy_subdomain_cpanel на 443) сканер проходит
по списку имён пользователей и останавливается на первом совпадении.
По умолчанию сканер проверяет 2087, 2083 и 443 в указанном порядке и останавливается, как только любая поверхность подтвердит уязвимость.
--exploit)CVE-2026-29205 — cPanel/WHM WP2 Security Update, 13 мая 2026. Исправлено в cPanel 11.134.0.26. В уведомлении отслеживается та же регрессия понижения привилегий
cpdavd, которую использует эта цепочка эксплуатации.
Полное описание ошибки и цепочки эксплуатации: https://slcyber.io/research-center/new-age-of-collisions-reading-arbitrary-files-pre-auth-as-root-in-cpanel-cve-2026-29205
cpdavd на портах 2079 (plain HTTP) и 2080 (TLS) доверяет пути
<principal>/<collection>/..., который он строит при обслуживании ресурсов
CalDAV/CardDAV. Создав запрос, компонент пути которого кодирует сегменты ..,
и направив его на папку maildir, имя которой на диске также кодирует обход
(x-attachment-1-y), можно заставить cpdavd прочитать любой файл на диске
от root, независимо от владельца или прав доступа — включая /etc/shadow,
/etc/passwd и пользовательские почтовые ящики.
Защита в глубине, которая должна была понизить привилегии до владельца учётной
записи перед чтением, молчаливо не сработала: объект
Cpanel::AccessIds::ReducedPrivileges был создан в void-контексте, поэтому его
деструктор восстанавливал привилегии root до того, как выполнялось чтение.
cPanel 11.134.0.26 привязывает объект к лексической переменной my $privs,
чтобы он жил на протяжении всей цепочки -f / stat / open / read; на
исправленных хостах чтение поэтому выполняется от непривилегированного
владельца учётной записи вместо root.
Уязвимая папка должна существовать на диске до того, как чтение сработает.
cPanel автоматически создаёт папку с именем .x-attachment-1-y для получателя
<user>+x-attachment-1-y@<domain> при первом поступлении письма на этот
субадрес. Таким образом, цепочка выглядит так: