Daily Top · Supply chain / Hosting / Identity

cPGuard ran as root. 5.88.26 is not the hashes.

OPSSHIELD confirmed a 70-minute poisoned update on 2 November. About 2,950 Linux hosting servers executed it. The clean agent removes the shell. It does not change /etc/shadow.

RWP Ventures · 2026-11-05 · event 2026-11-02 · 14 min read · priority 9.0

Bottom line up front

CONFIRMED On 3 November 2026 OPSSHIELD published that an unidentified attacker used a stolen update-storage key to push malicious cPGuard 5.88.12 through 5.88.19 through the product’s own update channel. The upload window is 2 November, 02:04–02:09 UTC. Agents that checked for updates between 02:08 and 03:20 UTC installed the fake package and ran it as root. OPSSHIELD’s incident disclosure puts that set at about 2,950 Linux hosting servers. A short script collected local secrets and staged them for later pickup. 5.88.25 or later removes the known backdoor and the files the script left. It does not invalidate the hashes, SSH keys, or MySQL root passwords the script already copied.

Do not collapse five facts.

  1. The overnight increment is the vendor’s public incident, not a CVE. There is no CVE ID and no KEV row. Live CISA catalog this run is 2026.11.04 / 1768, dateReleased 2026-11-04T20:00:05Z. The one new KEV row is CVE-2024-27834 (Apple WebKit Pointer Authentication bypass, patched May 2024, forensic triage No, due 18 November). That is a two-year-old PAC bypass that already requires arbitrary read/write. It is not 2,950 hosting servers that just ran a hostile update as root.
  2. The clean agent is not the close. OPSSHIELD: if any Successfully updated line in /opt/cpguard/logs/install_log shows 5.88.12–5.88.19, treat the server as potentially compromised even if it now runs 5.88.25 or later. Absence of /var/tmp/.cpg91511_sh after cleanup does not establish whether the script previously ran.
  3. Two different copies happened. On customer servers the script targeted /etc/shadow, /etc/passwd, root my.cnf, root shell history, and root SSH files. On OPSSHIELD’s side the attacker copied about 7,900 billing-portal accounts (name, company, postal address, email, bcrypt-hashed password) and, in a 3 November investigation update, OPSSHIELD estimates the attacker retrieved 32 collected files from its licensing server — one per customer server in that retrieved set, not the 2,950 that ran the update. Do not upgrade 32 into 2,950, or 2,950 into a named tenant census.
  4. This is not Gheist and not LiteLLM. [Gheist](/posts/2026-10-26-gheist-github-sync-check/) planted GitHub Actions. [LiteLLM 1.107.0](/posts/2026-10-25-litellm-11070-cook-pth/) was a poisoned Python wheel. This is a signed-looking product update on Linux web-hosting boxes, running as root, with the loot channel being OPSSHIELD’s own licensing server. Same class (trusted updater), different vendor, different payload, different blast radius.
  5. This is not yesterday’s WordPress race, and it is not a PLC. [CVE-2026-119977](/posts/2026-11-04-wordpress-cve-2026-119977-kev/) is still due tomorrow, 6 November, forensic triage Yes. Sites on those ~2,950 hosts may also be WordPress. Do not close a WordPress hunt on a cPGuard version string, or a cPGuard hunt on wp-includes/version.php. No OT/ICS process impact is in the vendor record.

The operator sentence: if a Linux host ran cPGuard and was online between 02:08 and 03:20 UTC on 2 November, assume root-level secrets left. Confirm 5.88.26 or later, then rotate every local password, SSH key, database password, and token that lived on that box. A clean cpgcli --version is not a rotation.

What happened

OPSSHIELD makes cPGuard, a malware scanner / WAF / firewall suite aimed at Linux web-hosting servers. Two vendor notices on 3 November are the primary record: a product advisory for the update channel, and an incident disclosure for manage.opsshield.com.

The attacker’s path, as OPSSHIELD reconstructed it (all times UTC):

When (UTC)What OPSSHIELD says happened
1 Nov, 15:38Probing of the billing portal (manage.opsshield.com)
1 Nov, 16:34Registers a customer account under a false identity; orders a free cPGuard trial
1 Nov, 21:17Installs the trial on their own server to watch how the agent talks to licensing
1 Nov, 21:40–21:51cPGuard flags and bans the attacker twice
1 Nov, 22:50Crafted requests to billing-portal callback pages
1 Nov, 22:58Command execution on the billing and licensing server; data collection starts
2 Nov, 02:04–02:09Fake cPGuard update uploaded to update storage with a stolen access key
2 Nov, 02:08–03:20Agents install the fake update; it runs as root and copies files
2 Nov, 02:13Attacker copies three of OPSSHIELD’s cloud servers
2 NovStolen update key revoked; clean 5.88.26 published
3 NovEntry point traced; both notices published

OPSSHIELD has not named the exact request that produced command execution on the billing server. It says it ruled out SSH, the control panel, FTP, and API tokens, patched two possible entry points, and is still reviewing vendor components. Do not invent a CVE for that gap.

Help Net Security (4 November) and SecurityWeek (4 November) independently paraphrase the same two notices. They add no second victim census.

CISA’s 4 November KEV alert is one row, Apple CVE-2024-27834. It does not mention cPGuard.

Why it matters

Three operational reasons this is the daily.

First: the updater is the implant. cPGuard is the box that is supposed to catch malware on a hosting node. For about 70 minutes it was the malware, running as root, on every agent that polled in the window. Shared hosting means the blast is not “one company’s laptop.” It is every site whose database password, SSH hop, or panel credential lived on that node.

Second: the cleanup OPSSHIELD shipped is file removal, not secret invalidation. 5.88.25/5.88.26 delete the known setuid shell and staged archive. Follow-up work removes /etc/cron.d/i93677. Stolen /etc/shadow hashes, root SSH private keys, and MySQL root passwords remain valid until an administrator changes them. OPSSHIELD’s own provisional guidance: it is not recommending a routine OS rebuild. That is a vendor assessment, not a hunt finding. If OPSSHIELD told a customer the attacker logged in by hand, the same notice says rebuild from a backup taken before 1 November.

Third: the exfil path was the vendor. Collected files went to OPSSHIELD’s licensing server under a compromised account. Network controls that “only talk to the vendor” did not help. Detection is the install log, the leftover paths, and whether secrets still work — not an odd ASN on egress.

Who / what is affected

Confirmed in scope (OPSSHIELD primaries):

Confirmed not a substitute for rotation:

Confirmed not this incident:

UNKNOWN / not validated:

Technical context

High level. This is not a how-to.

cPGuard agents periodically pull updates. For ~70 minutes on 2 November the object they pulled was attacker-controlled. OPSSHIELD describes the payload as a short script, not a long-term implant: collect, archive, upload, leave a hidden root shell and a scheduled task.

Hunt seeds from the vendor (not a closed set, not a PoC):

TypeIndicatorContext
Install logSuccessfully updated to 5.88.1[2-9] in /opt/cpguard/logs/install_logConfirms an affected update landed
Filecpguard-v58812-i91511.sh and b/c/d variantsFake update scripts
SHA-2562c2acd988da531d133d0e17f245c49bf15781278f837543d18c95e8410eabd38cpguard-v58812-i91511.sh
SHA-256ffd7a47f65fa1244429baa936ae94be54676b53d2f88bc39564f24e22011de8a…i91511b.sh
SHA-256d73919af84bf46de941db85e27fd1abc65701ef9ce6cf33bb27c5397f4a41c26…i91511c.sh
SHA-2566add0201e9a3d02de772d561d05e0da86eb1c538686753b7adcc3aedf7366f77…i91511d.sh
File/var/tmp/.cpg91511_shSetuid-root shell; 5.88.26 removes it
File/var/tmp/.cpg91511/ and loot.tgzCollection directory / archive
File/etc/cron.d/i93677, /var/tmp/.i93677/Scheduled task left by the fake update
IP94.183.188.91Vendor: main attacker operator address; sometimes a fake cPGuard/5.88.11 user-agent
Path*_rx.php; web-root i9xxxx probe/shell namesVendor: receive endpoints and probe files

OPSSHIELD separately lists implants found on its internal server (defunct.service, /etc/profile.d/gateway.sh hiding ps/netstat/ls/find). Treat those as vendor-infrastructure IoCs unless you have independent evidence they were pushed to customers. Because those implants hide from standard tools, OPSSHIELD says check from a trusted boot environment or a known-good static binary — on their box, not as a default customer rebuild order.

ATT&CK mapping (assessed from the vendor record, not a CISA assignment): T1195.002 Compromise Software Supply Chain; T1078.003 Local Accounts (root); T1552.001 / T1552.004 Credentials in Files / Private Keys; T1053.003 Cron; T1036 masquerading as a product update. T1588.002 (tooling) is not evidenced beyond OPSSHIELD’s own comment that attackers now use AI to move faster; that sentence is vendor color, not a finding.

Threat / exploitation status

ClaimStatusConfidence
Malicious cPGuard 5.88.12–5.88.19 served 2 Nov 02:04–03:20 UTC; ran as rootCONFIRMEDHigh (OPSSHIELD 3 Nov primaries)
~2,950 customer servers executed the fake updateCONFIRMEDHigh (incident disclosure; Help Net Security / SecurityWeek paraphrase)
~7,900 billing-portal records copied (bcrypt hashes)CONFIRMEDHigh (incident disclosure)
Script targeted shadow/passwd, root my.cnf, SSH files, shell historyCONFIRMEDHigh (both vendor notices)
Attacker retrieved 32 collected files from the licensing serverREPORTEDModerate (OPSSHIELD 3 Nov investigation update; preliminary)
5.88.25/5.88.26 remove known backdoor files; follow-up removes i93677CONFIRMEDHigh (vendor)
Exact billing-server RCE request / CVEUNKNOWNVendor: logs do not record it
Attacker identity / nation-stateUNKNOWNNo evidence offered
Customer-server gsocket / Go implantUNKNOWNVendor attributes those IoCs to its own internal server
Ransomware overlayUNKNOWNNo claim
cPGuard on CISA KEVCONFIRMED absentHigh (live JSON 2026.11.04 / 1768; newest row is CVE-2024-27834)
OT/ICS process impactCONFIRMED absentHigh (no such claim in primaries)

What defenders should do

  1. Inventory cPGuard, not the ticket. On every Linux host that ever ran it: grep 'Successfully updated' /opt/cpguard/logs/install_log and cpgcli --version. Any 5.88.12–5.88.19 line is in scope even if the current string is 5.88.26.
  2. Update, then prove the leftovers are gone. cpgcli update --start. Confirm 5.88.26 or later. Then confirm /etc/cron.d/i93677, /var/tmp/.i93677/, /var/tmp/.cpg91511_sh, and /var/tmp/.cpg91511/ are absent; delete them if not. Absence after cleanup is not a negative on prior execution.
  3. Rotate from a trusted path. Reset root and every password-enabled local account. Replace root SSH key pairs and remove the old public keys from every system that trusted them. Change MySQL/MariaDB root and any password in /root/.my.cnf. Rotate tokens in root history and /root/.s3cfg. Treat lateral SSH from this host as exposed until those keys are dead.
  4. Reset the billing portal. New manage.opsshield.com password, 2FA on. OPSSHIELD is re-issuing license key pairs; expect agents to re-license. Do not skip the host rotation because the portal was reset.
  5. Hunt the hosting tenants. Sites on an affected node may have had database passwords in my.cnf or panel configs. That is a customer-notification and credential-rotation problem for the host, not a WordPress Core bump. Keep [CVE-2026-119977](/posts/2026-11-04-wordpress-cve-2026-119977-kev/) on its own ticket: due tomorrow.
  6. Rebuild only where the vendor said someone logged in by hand, from a backup taken before 1 November, or where you cannot establish integrity. OPSSHIELD’s current default is not a fleet rebuild. If you find extra users, extra keys, extra services, or outbound you did not design, stop treating it as “update and rotate.”
  7. Keep the Apple KEV and the Airbyte JVN on separate queues. CVE-2024-27834 due 18 November, forensic triage No, already patched in Safari 17.5 / iOS 17.5 / macOS 14.5 (May 2024). Airbyte self-managed before 2.2.0: JPCERT/CC says exploitation confirmed; Cloud is out of scope; 1.x has no fix. Neither is this updater.

RWP assessment

This is the daily because it is the largest confirmed, vendor-primary compromise in the window, it runs as root on hosting servers, and the operator error it invites — “we updated cPGuard” — leaves every copied secret live. Evidence quality is high on the update window, the version range, the ~2,950 execution count, the ~7,900 billing copy, the file types, and the cleanup builds (two OPSSHIELD notices, same-day). Evidence quality is moderate on how many of those 2,950 had data retrieved (32 is a preliminary pickup count). Evidence quality is low on attribution, the billing RCE primitive, and whether vendor-internal implants replicated to customers. We are not putting this on KEV, not inventing a CVE, not folding it into yesterday’s WordPress race, not treating Apple’s 2024 PAC bypass as the more urgent estate, and not calling OT impact.

Score 9.0. It outranks CISA’s 4 November KEV add of CVE-2024-27834 (real catalog increment, low operational urgency: 2024 patch, PAC bypass after existing R/W, forensic triage No, due 18 Nov), JVN#12040144 Airbyte (JPCERT/CC exploitation confirmed 4 Nov, CVSS 9.9, Cloud out of scope, no CVE, smaller confirmed blast), repeating WordPress 119977 (yesterday’s daily; clock hits tomorrow, no new catalog fact), Subnet PowerSYSTEM Center ICSA-26-307-01 (adjacent, no exploitation), and remaining Ivanti 118527 / Brotli / Adobe Commerce due-date clocks.

What we are watching

Sources

Sources

  1. OPSSHIELD — cPGuard security advisory: Update channel compromise, 3 Nov 2026
  2. OPSSHIELD — Security Incident Disclosure: manage.opsshield.com, 3 Nov 2026
  3. Help Net Security — Poisoned cPGuard update hits thousands of web hosting servers, 4 Nov 2026
  4. SecurityWeek — Malicious cPGuard Updates Served in OpsShield Supply Chain Attack, 4 Nov 2026
  5. CISA — Adds One Known Exploited Vulnerability to Catalog, 4 Nov 2026
  6. CISA — KEV JSON feed catalog 2026.11.04
  7. Apple — About the security content of iOS 17.5 and iPadOS 17.5
  8. JPCERT/CC — JVN#12040144 Airbyte arbitrary code execution, 4 Nov 2026
  9. Airbyte — GHSA-g35w-6r6v-h4r7, 17 Oct 2026
  10. CISA — ICSA-26-307-01 Subnet Solutions PowerSYSTEM Center, 3 Nov 2026
  11. RWP Ventures — WordPress CVE-2026-119977 KEV Daily Top 2026-11-04
  12. RWP Ventures — Gheist Daily Top 2026-10-26
  13. RWP Ventures — LiteLLM Daily Top 2026-10-25