CUTSIGNcutting for sign — daily OSINT threat read
AI-generated verdict card, published automatically by the pipeline on day one because the brief rated the story P1. Version 1, as of 2026-11-04; hype score 3 (below the usual publish bar: early read from few sources, revised as the story develops). Written by a model from the stored public sources and not reviewed by a person; re-issued in place when the evidence changes (the URL stays). The detection-coverage table below is checked automatically from public sources and re-checked daily. All cards

OpsShield cPGuard update channel hijacked; malicious 5.88.12–5.88.19 updates ran as root on customer servers

Hunt / IR + PatchP1confidence: mediumP1 +23 publishers +1P1: card on day one (score below the publish bar; revised as the story develops)

A fake cPGuard update reached customer servers for about 70 minutes, ran a root script, planted a hidden root shell and temp files, and sent data out. Today, find every cPGuard host and every hosting provider that runs cPGuard. Image any host that ran 5.88.12–5.88.19 before moving it to 5.88.25 or later.

Triage: Vendor-stated root execution of attacker code on customer servers through a trusted update channel [S1].

Three reputable secondary outlets report the incident and quote OpsShield's statements. No OpsShield advisory is in the source set.

What happened

Timeline

2026-11-04Public reporting of the cPGuard update-channel compromise. Malicious versions 5.88.12–5.88.19 identified; fix in 5.88.25+. S1

Detect

cPGuard hosts that received 5.88.12–5.88.19 · Linux package/update logs or software inventory

index=* "cpguard" ("5.88.12" OR "5.88.13" OR "5.88.14" OR "5.88.15" OR "5.88.16" OR "5.88.17" OR "5.88.18" OR "5.88.19") | stats earliest(_time) as first_seen latest(_time) as last_seen values(source) as sources by host
FROM logs-* | WHERE message LIKE "*cpguard*" AND (message LIKE "*5.88.12*" OR message LIKE "*5.88.13*" OR message LIKE "*5.88.14*" OR message LIKE "*5.88.15*" OR message LIKE "*5.88.16*" OR message LIKE "*5.88.17*" OR message LIKE "*5.88.18*" OR message LIKE "*5.88.19*") | STATS first_seen = MIN(@timestamp), last_seen = MAX(@timestamp), sources = VALUES(log.file.path) BY host.name

A hit means: The host recorded a malicious cPGuard version. Treat it as root-compromised until its artifacts are reviewed [S1].

Shell spawned by the cPGuard update process · Linux auditd or EDR process events

index=* (parent_process_name="*cpguard*" OR parent_process="*cpguard*") (process_name="sh" OR process_name="bash" OR process_name="dash") | stats count values(process) as cmdlines values(user) as users by host parent_process_name
FROM logs-* | WHERE (process.parent.name LIKE "*cpguard*" OR process.parent.command_line LIKE "*cpguard*") AND process.name IN ("sh", "bash", "dash") | STATS count = COUNT(*), cmdlines = VALUES(process.command_line), users = VALUES(user.name) BY host.name, process.parent.name

A hit means: The cPGuard updater launched a shell. Because the malicious update ran as root, review the command lines for script execution or data collection [S1].

Temp-folder and hidden files written by cPGuard · Linux file integrity or EDR file events

index=* (process_name="*cpguard*" OR parent_process_name="*cpguard*") (file_path="/tmp/*" OR file_path="/var/tmp/*" OR file_name=".*") | stats count values(file_path) as paths values(file_name) as files by host
FROM logs-* | WHERE (process.name LIKE "*cpguard*" OR process.parent.name LIKE "*cpguard*") AND (file.path LIKE "/tmp/*" OR file.path LIKE "/var/tmp/*" OR file.name LIKE ".*") | STATS count = COUNT(*), paths = VALUES(file.path), files = VALUES(file.name) BY host.name

A hit means: A possible match for the hidden root shell and temp-folder files OpsShield described [S1]. Preserve the files before upgrading.

SSH authorized_keys changes on cPGuard hosts · Linux file integrity, auditd or EDR file events

index=* file_name="authorized_keys*" (action="created" OR action="modified" OR action="write") | stats count values(file_path) as paths values(process_name) as writers values(user) as users by host
FROM logs-* | WHERE file.name LIKE "authorized_keys*" AND event.action IN ("created", "modified", "write") | STATS count = COUNT(*), paths = VALUES(file.path), writers = VALUES(process.name), users = VALUES(user.name) BY host.name

A hit means: An SSH key changed and may be attacker persistence. Unexpected SSH keys appear in the story summary but not in the quoted vendor text [S1]. Validate against change records.

Verify

Scope

Affected

Only if

Not affected if

Fixed in: 5.88.25

Enumerate

Contain

Eradicate

Recover

Re-enter the loop when

Debrief

Detection coverage — checked automatically

CategorySourceStatus
VendorImpacted vendor / CERT advisorynothing found — no vendor or CERT page among the thread sources; secondary reporting only
GovernmentCISA KEVnot checkable — no CVE: the catalog is keyed by CVE
EDR / endpoint VMCrowdStrike blognothing found — no post names it among the feed's 10 newest items
EDR / endpoint VMMicrosoft Security blognothing found — no post names it among the feed's 10 newest items
EDR / endpoint VMSentinelOne blognothing found — no post names it among the feed's 10 newest items
EDR / endpoint VMSentinelOne Labsnothing found — no post names it among the feed's 10 newest items
WAF / edgeAkamai blognothing found — no post names it among the feed's 1183 newest items
WAF / edgeCloudflare WAF managed-ruleset changelognothing found — no post names it among the feed's 139 newest items
Cloud / containerWiz blognothing found — no post names it among the feed's 717 newest items
IDS / researchCisco Talos blognothing found — no post names it among the feed's 15 newest items
Detection contentElastic detection rulesnothing found — no rule file names OpsShield
Detection contentElastic Security Labsnothing found — no post names it among the feed's 102 newest items
Detection contentSigmaHQ rulesnothing found — no rule file names OpsShield
Detection contentSplunk ESCUnothing found — no rule file names OpsShield
MSSP / IR firmsArctic Wolf blognothing found — no post names it among the feed's 10 newest items
MSSP / IR firmsHuntress blognothing found — no post names it among the feed's 754 newest items
MSSP / IR firmsRapid7 blognothing found — no post names it among the feed's 20 newest items
MSSP / IR firmsSophos threat researchnothing found — no post names it among the feed's 15 newest items
ResearchUnit 42nothing found — no post names it among the feed's 15 newest items

Checked automatically 2026-11-10 11:17Z from public sources: 0 published, 18 nothing found, 1 not machine-checkable, 0 failed. "Nothing found" means the public source answered and had nothing, as of that moment; a feed covers only its newest posts. Re-checked daily.

What a person would still look up (4)
Linux EDRCan it show child processes of the cPGuard updater, and does it keep that history past the window?
File integrity monitoringDoes it watch temp folders, hidden files and authorized_keys on hosting servers?
Asset/software inventoryDoes it record cPGuard versions and update times?
Third-party riskWhich hosting providers run cPGuard, and what is their notification path?

Exposure queries — generated automatically

shodan · alias · card

http.title:"cPGuard"

open · Banner spelling suggested by the model from the card text (product name of OpsShield's server security agent, shown as the console title); counted against Shodan before it was shown.

1services internet-wide on Shodan · 2026-11-10▬ 1 on 2026-11-04 (+0 +0%) · 1 on 2026-11-09 (+0 +0%)

Internet-wide count, trend

QueryFirstLatestChange
http.title:"cPGuard"1 2026-11-041 2026-11-10+0 (+0%) over 7 days

Shodan's count of matching services on the whole internet, one point a day; the scope (your ranges) is never part of it. A count moves with Shodan's crawl as much as with patching, so read the direction, not the digit.

No CVE in this campaign: nothing an internet scanner keys on. Scope by product in your own tool.

Banner spellings: a model read 2 from the NVD names and this card's text (former and marketing names, console titles); 1 matched something on Shodan and is shown above, the rest was dropped.

Scope every query in your own tool, never in a shared document: Shodan `net:<your_ranges>`, `org:"<your_org>"` or `hostname:<your_domain>` (or a Shodan Monitor network alert, which applies the scope for you); Censys `host.ip: <your_ranges>` or `host.dns.names: <your_domain>`. Then compare the banner version with the affected range. Generated automatically 2026-11-10 11:17Z from the CVE ids and NVD's CPE configurations, each Shodan query counted against Shodan itself; re-built daily with the coverage check.

Open questions

Sources

Public OSINT only. AI-generated by the pipeline; structure follows the DAIR model from Dynamic Incident Response (Joshua Wright). Published automatically; a dismissed draft unpublishes it.

One mail per new card, after you confirm by link; an unsubscribe link in every mail. The address is used for nothing else.