CVE advisories make great post-mortems because they teach attackers' patterns in concrete terms. This is what a real cPanel/WHM compromise looks like — the attack vector, the exploitation, the cleanup, and the hardening that would have prevented it.
I run incident response for hosting clients regularly. The patterns are remarkably consistent across CVEs and across years. The names change; the exploitation chain doesn't.
The class of CVEs we're talking about
Two families dominate cPanel/WHM compromises:
- Authentication bypass / privilege escalation in WHM. A bug lets an attacker reach root-level functions without root credentials.
- Remote code execution in cPanel — a customer-area bug that escapes the cPanel chroot and runs code as root.
Either ends the same way: root shell, all customer accounts compromised, often persistent backdoor installed.
The attack chain — typical pattern
Stage 1: Recon
Attacker scans the internet for cPanel/WHM ports (2087, 2086, 2083, 2082). Tools like Shodan have catalogued these by version banner. Servers running outdated cPanel versions stand out.
Defensive value: if your WHM is internet-exposed on 2087 without IP allowlisting, you're in the recon set. Almost every compromise I investigate started here.
Stage 2: Vulnerability check
Attacker probes the WHM with a request matching the known CVE's pattern. If the server responds in the vulnerable way, they have a target.
Defensive value: WAF or rate-limiting at this stage usually blocks the probe pattern (the CVE PoCs go public quickly; signature-based detection catches them).
Stage 3: Exploitation
Attacker fires the actual exploit. Outcomes depend on the CVE:
- Authentication bypass: attacker now has WHM admin access without root password.
- RCE: attacker has shell as root (or a low-privilege user they then escalate from).
Time from probe to exploit is often seconds. Automated mass-exploitation tooling exists for known CVEs within hours of public disclosure.
Stage 4: Persistence
Almost every compromise I've seen installs persistence before doing anything else:
- Backdoor PHP web shell in
/usr/local/cpanel/whostmgr/docroot/cgi/or similar. - SSH key added to root's
authorized_keys. - Cron job added to root or a low-privilege user that re-establishes the backdoor periodically.
- Kernel module or systemd service installed for deeper persistence.
Attackers want to come back even after you patch.
Stage 5: Monetization
- Mass email spam from all hosted accounts.
- Cryptominer dropped on the server (most common).
- Customer credit card details exfiltrated from WHMCS database (if compromised box also hosts WHMCS).
- Customer FTP credentials harvested for further attacks.
- Ransomware against the hosting business's own infrastructure.
Detection — how you find out
In order of how I've seen incidents discovered:
- Server gets blacklisted for spam — your hosting provider or a third party notices outbound abuse first.
- CPU goes to 100% — cryptominer eating cycles.
topshows the process. - Customer notices — their site has unfamiliar content, or their email password no longer works.
- You're proactive — file integrity monitoring (AIDE, Tripwire, Wazuh) alerts on unexpected file changes.
- Security audit — quarterly review catches it.
The proactive path is rare. Most operators discover after the damage.
Step-by-step incident response
Phase 1: Contain (first 30 minutes)
# 1. Disconnect from the internet — block all inbound except your IP
csf -d 0.0.0.0/0 # if using CSF
# OR
iptables -P INPUT DROP
iptables -A INPUT -s YOUR-IP -j ACCEPT
# 2. Kill any obviously hostile processes
top # find unfamiliar high-CPU processes
ps auxf # full process tree
# Kill suspicious processes by PID, then by parent
# 3. Disable outbound email immediately
systemctl stop exim # or postfix, sendmail
# This stops spam from making the situation worse
# 4. Disable cron temporarily — attackers often hide reactivation in cron
mv /etc/crontab /etc/crontab.frozen
mv /var/spool/cron/root /var/spool/cron/root.frozen
Phase 2: Triage (next 1-2 hours)
# 1. Identify the attack vector
last -F # who logged in recently?
grep "Accepted" /var/log/secure | tail -50 # SSH access
grep -i "WHM" /usr/local/cpanel/logs/access_log # WHM access patterns
journalctl --since "24 hours ago" | grep -i "fail\|error\|root"
# 2. Find persistence mechanisms
find / -name "*.php" -mmin -1440 2>/dev/null | head -50 # PHP files changed in last 24h
ls -la /tmp /var/tmp /dev/shm | head -40 # writable directories
crontab -l -u root # root cron jobs
for u in $(cut -d: -f1 /etc/passwd); do crontab -l -u $u 2>/dev/null; done
# 3. Check for unexpected SSH keys
cat /root/.ssh/authorized_keys
for u in $(cut -d: -f1 /etc/passwd); do
if [ -f /home/$u/.ssh/authorized_keys ]; then
echo "=== $u ==="; cat /home/$u/.ssh/authorized_keys
fi
done
# 4. Check for new users
awk -F: '$3 == 0 {print $1}' /etc/passwd # any UID 0 users besides root?
awk -F: '$3 >= 1000 {print $1, $3}' /etc/passwd | head -20 # recently added?
Phase 3: Recover (next 4-24 hours)
The honest truth: a compromised server is best rebuilt, not cleaned. You will miss something. The attacker may have persistence you don't find.
Procedure:
- Snapshot the compromised server (for forensics later).
- Provision a new clean server.
- Migrate customer data, file by file, after verifying integrity.
- Reset every customer password.
- Reset every SSH key.
- Reset every API token (gateways, registrars, third-party services).
- Notify customers (legally required in most jurisdictions; ethically required everywhere).
Prevention — what would have stopped this
Defenses in priority order:
1. Keep cPanel/WHM up to date — automatically
The single highest-value defense. Enable automatic updates:
WHM → Update Preferences → Daily Updates: STABLE tier minimum
For security patches, set to LTS or EDGE only if you can validate; STABLE is the right balance for most.
2. IP-restrict the WHM ports
WHM (2087) should never be open to the world. Restrict to your office / admin VPN IPs:
# Via CSF
csf -a 1.2.3.4 "Admin access"
# Then in /etc/csf/csf.conf restrict TCP_IN:
# TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995" # NO 2086, 2087
Customers can still access cPanel (2083) without restriction; only the admin panel is locked down.
3. Install ConfigServer Security Firewall (CSF) + LFD
Free, well-maintained. Provides:
- Application-aware firewall.
- Login failure detection (auto-bans brute-forcers).
- Real-time scanning of suspicious files.
- Daily summary email.
4. Enable two-factor on root WHM
WHM → Two-Factor Authentication → enable. Pair with Google Authenticator or similar.
5. Run Imunify360 (paid)
WAF + malware scanning + intrusion detection. Worth the cost on multi-tenant servers. Catches mass-exploitation tooling before it lands.
6. File integrity monitoring
AIDE, Wazuh, or even aide --check as a daily cron. Tells you when critical files change unexpectedly.
7. Outbound SMTP rate limiting
Stops a compromised account from sending 1 million spam messages before you notice. cPanel has built-in support — configure per-account limits in WHM → SMTP Restrictions.
8. KernelCare for live kernel patching
See my CloudLinux kernel guide. Kernel CVEs are exploited routinely; live-patching closes the window between disclosure and reboot.
How to verify your defenses are real
- External port scan: from outside,
nmap -p 2087,2086,2083,22 your-server. WHM should not respond from arbitrary IPs. - cPanel update timestamp: WHM → Server Configuration → Server Status → cPanel version + last update.
- CSF status:
csf -lshows active rules;csf -tshows banned IPs. - Imunify360 dashboard (if installed): malware scans clean, threat feed up-to-date.
- Test a backup restore quarterly. If you can't recover from backup, your incident response options are zero.
My take — what I'd tell my younger self
- Most compromises are preventable. They're usually opportunistic, not targeted. Basic hygiene blocks 95%.
- "It hasn't happened yet" is not a security posture. Treat it as if it will happen this year, because at scale it will.
- Document your incident response runbook now. The middle of an incident is not the time to figure out who to call.
- Pay for security tools. Imunify360, CSF Pro, KernelCare — much cheaper than one incident.
- Test your backups monthly. Untested backups are not backups.
Going further
I do security hardening and incident response for cPanel/WHM hosting servers. Whether you want a proactive audit or you're in the middle of an incident, tell me what's happening and I'll respond within 24 hours.