
CVE-2026-41940 scanner IOC per bypass dell'autenticazione cPanel/WHM — corregge i falsi positivi nello script di rilevamento upstream, aggiunge la cross-correlazione dei log
Script di rilevamento per il bypass di autenticazione cPanel/WHM (CVE-2026-41940) che interessa tutte le versioni di cPanel successive alla 11.40.
Questa è una riscrittura dello script di rilevamento cPanel upstream con correzioni per i falsi positivi e correlazione dei log aggiunta.
Analizza /var/cpanel/sessions/raw/ alla ricerca di file di sessione che mostrano segni di sfruttamento tramite iniezione di newline, quindi incrocia gli IP sospetti e i token di sessione con i log di accesso/login/errore di cPanel. Analizza anche l'access_log per individuare sfruttamenti storici in cui il file di sessione è nel frattempo scaduto o è stato eliminato.
pass difettosa che genera falsi positivi su ogni sessione autenticata in produzione (la regex corrisponde a qualsiasi campo pass= seguito da un'altra riga, cioè ogni file di sessione).method=badpass origin + QUALSIASI attributo post-autenticazione invece di richiedere la combinazione ristretta token_denied + cp_security_token. Rileva le varianti PoC che omettono token_denied.POST /login/?login_only=1 -> 401) con il successivo utilizzo di un token cpsess valido dallo stesso IP.--extended per un'analisi più approfondita dei log da fonti aggiuntive.# Bash — funziona ovunque, nessuna dipendenza
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh)
# Python — più veloce su directory di sessione grandi, supporta --json
curl -fsSLo /tmp/ioc.py https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.py
python3 /tmp/ioc.py
# Scansione estesa (entrambe le varianti)
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh) --extended
python3 /tmp/ioc.py --extended
# Controlla il codice di uscita dopo l'esecuzione ($? = 0 pulito, 1 IOC trovati, 2 errore ambiente)
echo $?
Flag curl:
-ffallisce sugli errori HTTP invece di reindirizzare una pagina di errore in bash,-ssilenzioso (nessuna barra di avanzamento),-Smostra comunque gli errori nonostante-s,-Lsegue i reindirizzamenti.
La variante Python supporta --json per un output strutturato che puoi reindirizzare a jq, inviare a un SIEM o elaborare programmaticamente.
# Output JSON completo
python3 ioc.py --json
# Solo i conteggi di riepilogo
python3 ioc.py --json | jq '.counts'
# Elenca tutti i risultati CRITICI
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL")]'
# Estrai gli IP attaccanti univoci
python3 ioc.py --json | jq '.suspect_ips[]'
# Mostra i risultati con i loro IP sorgente (per le blocklist del firewall)
python3 ioc.py --json | jq '[.findings[] | {severity, source_ip, token: .cp_security_token}]'
# Ottieni tutti gli IP che hanno avuto un utilizzo riuscito del token (per blocco immediato)
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL") | .source_ip] | unique'
# Fornisci i dati di cross-reference per un IP specifico
python3 ioc.py --json | jq '.cross_ref[.suspect_ips[0]]'
Esempio di struttura 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 # predefinito (CRITICO/ALTO espansi, MEDIO/AVVISO solo conteggi)
bash ioc.sh -v # verbose (espandi tutti i risultati)
bash ioc.sh --extended # verbose + log più approfonditi + tutti gli IP nel cross-ref
# Variante Python (stessa logica di rilevamento, più veloce, output strutturato)
python3 ioc.py # predefinito (stesso comportamento di collasso di bash)
python3 ioc.py -v # verbose
python3 ioc.py --extended # verbose + log più approfonditi
python3 ioc.py --json # JSON strutturato (include sempre tutti i risultati)
Deve essere eseguito come root sul server cPanel di destinazione. La variante Python richiede Python 3.6+ (incluso con CentOS 7 / CloudLinux 7+).
| Codice | Significato |
|---|---|
| 0 | Nessun indicatore trovato |
| 1 | IOC rilevati |
| 2 | Errore ambiente (non è un server cPanel) |
MIT