
CVE-2026-41940 scanner de IOC de bypass de autenticação cPanel/WHM — corrige falsos positivos no script de detecção upstream, adiciona correlação cruzada de logs
Script de detecção para a bypass de autenticação do cPanel/WHM (CVE-2026-41940) que afeta todas as versões do cPanel posteriores à 11.40.
Esta é uma reescrita do script de detecção upstream do cPanel com correções para falsos positivos e correlação de logs adicionada.
Verifica /var/cpanel/sessions/raw/ em busca de arquivos de sessão que apresentem sinais de exploração por injeção de nova linha e, em seguida, cruza IPs suspeitos e tokens de sessão com os logs de acesso/login/erro do cPanel. Também verifica o access_log em busca de exploração histórica quando o arquivo de sessão já expirou ou foi removido.
pass defeituosa que gera falsos positivos em toda sessão autenticada em produção (a regex corresponde a qualquer campo pass= seguido de outra linha, o que ocorre em todo arquivo de sessão).origin method=badpass + QUALQUER atributo pós-autenticação em vez de exigir a combinação restrita . Captura variantes de PoC que omitem .token_denied + cp_security_tokentoken_deniedPOST /login/?login_only=1 -> 401) com uso subsequente bem-sucedido do token cpsess a partir do mesmo IP.--extended para varredura mais profunda de logs em fontes adicionais.# Bash — funciona em qualquer lugar, sem dependências
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh)
# Python — mais rápido em diretórios de sessão grandes, suporta --json
curl -fsSLo /tmp/ioc.py https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.py
python3 /tmp/ioc.py
# Varredura estendida (qualquer variante)
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh) --extended
python3 /tmp/ioc.py --extended
# Verifique o código de saída após a execução ($? = 0 limpo, 1 IOCs encontrados, 2 erro de ambiente)
echo $?
Flags do curl:
-ffalha em erros HTTP em vez de enviar uma página de erro para o bash,-ssilencioso (sem barra de progresso),-Sainda mostra erros apesar de-s,-Lsegue redirecionamentos.
A variante Python suporta --json para saída estruturada que você pode canalizar para jq, alimentar um SIEM ou processar programaticamente.
# Saída JSON completa
python3 ioc.py --json
# Apenas os resumos de contagem
python3 ioc.py --json | jq '.counts'
# Liste todos os achados CRITICAL
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL")]'
# Extraia IPs de atacantes únicos
python3 ioc.py --json | jq '.suspect_ips[]'
# Mostre achados com seus IPs de origem (para listas de bloqueio de firewall)
python3 ioc.py --json | jq '[.findings[] | {severity, source_ip, token: .cp_security_token}]'
# Obtenha todos os IPs que tiveram uso bem-sucedido de token (para bloqueio imediato)
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL") | .source_ip] | unique'
# Alimente dados de referência cruzada para um IP específico
python3 ioc.py --json | jq '.cross_ref[.suspect_ips[0]]'
Exemplo de estrutura JSON:
{
"findings": [
{
"severity": "CRITICAL",
"file": "/var/cpanel/sessions/raw/:Q3f8Ag2epeBuTaIZ",
"verdict": "Injected token used successfully (2xx/3xx in access_log)",
"origin": "address=203.0.113.50,app=whostmgrd,method=badpass",
"source_ip": "203.0.113.50",
"user": "root",
"hasroot": "1",
"tfa_verified": "0",
"cp_security_token": "/cpsess04396539398",
"token_denied": "1",
"successful_internal_auth_with_timestamp": "9999999999",
"token_hits": [
"203.0.113.50 - root [04/30/2026:12:12:01 -0000] \"GET /cpsess04396539398/json-api/version HTTP/1.1\" 200 0 ..."
]
},
{
"severity": "MEDIUM",
"file": "/var/cpanel/sessions/raw/:2TDiaHwh_r8qOH5y",
"verdict": "Injection landed; token was tried but BLOCKED (all 4xx/5xx)",
"source_ip": "198.51.100.23",
"cp_security_token": "/cpsess5637704041",
"token_hits": [
"198.51.100.23 - root [04/30/2026:04:08:09 -0000] \"GET /cpsess5637704041/json-api/version HTTP/1.1\" 403 0 ..."
]
},
{
"severity": "CRITICAL",
"file": null,
"verdict": "Injected cpsess token used with 2xx/3xx after failed login; session expired or purged",
"source_ip": "203.0.113.99",
"cp_security_token": "/cpsess8705792557",
"token_hits": ["..."]
}
],
"counts": {"critical": 2, "high": 15, "medium": 71, "warning": 0},
"suspect_ips": ["203.0.113.50", "198.51.100.23", "203.0.113.99"],
"suspect_ips_omitted": 0,
"cross_ref": {
"203.0.113.50": {
"cpanel_access_log": ["...last 5 lines..."],
"cpanel_login_log": ["..."]
}
},
"advisory": "https://support.cpanel.net/hc/en-us/articles/40073787579671"
}
git clone https://github.com/AndreiG6/cpanel-cve-2026-41940-ioc.git
cd cpanel-cve-2026-41940-ioc
# Variante Bash
bash ioc.sh # padrão (CRITICAL/HIGH expandidos, apenas contagens de MEDIUM/WARNING)
bash ioc.sh -v # verboso (expande todos os achados)
bash ioc.sh --extended # verboso + logs mais profundos + todos os IPs na referência cruzada
# Variante Python (mesma lógica de detecção, mais rápida, saída estruturada)
python3 ioc.py # padrão (mesmo comportamento de colapso do bash)
python3 ioc.py -v # verboso
python3 ioc.py --extended # verboso + logs mais profundos
python3 ioc.py --json # JSON estruturado (sempre inclui todos os achados)
Deve ser executado como root no servidor cPanel de destino. A variante Python requer Python 3.6+ (incluído no CentOS 7 / CloudLinux 7+).
| Código | Significado |
|---|---|
| 0 | Nenhum indicador encontrado |
| 1 | IOCs detectados |
| 2 | Erro de ambiente (não é um servidor cPanel) |
MIT