cPGuard update channel hijacked to backdoor Linux servers
An attacker breached cPGuard's update CDN on November 2, pushed a backdoor script to servers running 5.88.12–5.88.19, and stole password hashes and SSH keys. Fix is in 5.88.25.
An attacker compromised the update channel of cPGuard, a Linux server security tool from OPSSHIELD, and used it to push a malicious script to customer servers. The script installed a backdoor and collected password hashes, database credentials, and SSH keys. Per the vendor's advisory, the intrusion began November 2 at 02:06 UTC using compromised credentials to reach the update CDN. The fix is in cPGuard 5.88.25.
What's affected
The malicious update shipped in cPGuard 5.88.12 through 5.88.19. OPSSHIELD says it detected the compromise within about 12 hours of those versions going out. It has not said how many servers installed an affected version or ran the script.
Running an affected version means the script was delivered. Whether it executed is a separate question — see detection below.
What the script did
On servers that ran it, the script collected:
/etc/shadowand/etc/passwd- root's MariaDB/MySQL config (
my.cnf) - root's shell history
- root's SSH
authorized_keysandknown_hosts
It uploaded the data to an OPSSHIELD licensing server through a compromised account. OPSSHIELD estimates the attacker retrieved 32 files, each tied to one customer server — a preliminary count of confirmed retrievals, not the total exposure. It notes it may not have collected every file from every server.
Indicators of compromise
OPSSHIELD published these artifacts (quoted verbatim from the advisory):
cpguard-v58812-i91511.sh malicious script
/var/tmp/.cpg91511_sh backdoor shell (removed by the update)
/var/tmp/.cpg91511 collection directory (removed by the update)
/var/tmp/.cpg91511/loot.tgz staged archive of collected data
The absence of these files after the 5.88.25 cleanup does not prove the script never ran. To check the update history:
grep 'Successfully updated' /opt/cpguard/logs/install_log
Any entry for 5.88.12 through 5.88.19 means the server installed an affected update.
Action checklist
- Run
cpgcli update --starton every cPGuard server, then confirmcpgcli --versionreports 5.88.25 or later. - If the script ran or may have run, treat the host as compromised: reset root and all password-enabled local account passwords from a trusted recovery environment.
- Rotate database passwords, S3 access keys, DigitalOcean tokens, and any secret that appeared in root's shell history.
- Replace SSH private keys under
/root/.sshand remove the old public keys from every system that trusts them. The update removes the backdoor, not credentials the attacker already copied.
Context
This is the same failure mode that keeps recurring: a vendor's own update or release channel becomes the delivery mechanism. We covered it when AOMEI's update server was used to push a signed backdoor (AOMEI Backupper, UNC7017). The uncomfortable part of cPGuard is the product category — a tool bought to harden servers ran as root everywhere and became the single point that collected every box's secrets at once. OPSSHIELD is also pushing a precautionary update to remove its support-access keys from servers where they were added; it has not said whether the matching private key was exposed.