GoldenEyeDog / CylindricalCanine — DigiCert EV Code-Signing Certificate Theft
Executive Summary
The attacker's objective was trust, not data. CylindricalCanine — a subgroup of the Chinese cybercrime group GoldenEyeDog (APT-Q-27 / Dragon Breath / Miuuti Group, active since at least 2015) — did not breach DigiCert to steal customer records. They breached it to obtain the ability to sign malware as somebody else.
On 2026-04-02 the actor opened a customer-support chat with DigiCert and delivered a ZIP disguised as a customer screenshot; inside was a .scr executable. Two support-analyst workstations were compromised. The actor then abused a legitimate support-portal function that lets an authenticated analyst view an account "as the customer," and used it to read EV Code Signing initialization codes for orders that were approved but not yet delivered. An initialization code plus an approved order was functionally sufficient to obtain the certificate. DigiCert revoked 60 fraudulently obtained certificates across four issuing CAs; 27 were explicitly tied to the actor.
The malware is a modular, heavily modified Gh0st RAT (the family also tracked as Farfli, and reported by ANY.RUN as "Zhong Stealer") which Expel names Golden Gh0st RAT, delivered by Golden Gh0st Loader. It carries plugins for browser credential theft, keylogging, screenshot capture, SOCKS/TCP proxying, shell execution, event-log wiping, and a plugin32.dll module that installs a hidden local admin account and an RDP backdoor. A sibling cluster inside GoldenEyeDog uses RONINGLOADER, which disables Defender via PPL abuse and a signed kernel driver before dropping the same Gh0st variant.
Why this pack leads with the downstream angle. Most organisations were not DigiCert support analysts. But every organisation runs software-allowlisting and reputation logic that says "signed by a valid DigiCert EV cert = trusted." That assumption is what was stolen. Since 2024, Expel's Cert Graveyard has catalogued 75 unique code-signing certificates used by this loader, and the published IOC set contains 1,925 signed files. The highest-value hunt in your environment is therefore not "did we get phished" — it is "is a validly signed binary doing something a validly signed binary should not do?"
Defender priority: a valid Authenticode signature is now an attribute, not a verdict. Rank signed-binary executions from user-writable paths, first-seen-rare signed images, and signed PEs with screenshot-style filenames (image2026041168.com) above unsigned equivalents in triage — the signature is exactly what the actor paid to acquire.
Source Review & Web Hunter Notes
| Source | Tier | What it supplied |
|---|---|---|
| Expel — Introducing CylindricalCanine | PRIMARY | Full malware analysis, C2 domains + ports, second-stage hashes, plugin/dispatch tables, hardcoded keys, RDP-backdoor mechanics, Suricata rules |
| The Hacker News, 2026-07-17 | CORROBORATING | DigiCert incident timeline and quotes, revoked-CA list, 60/27 certificate counts, Web3 support-chat campaign, RONINGLOADER attribution nuance |
| GBHackers, 2026-07-20 | CORROBORATING | Independent restatement of the intrusion path; SmartScreen-bypass motive |
Expel expel-intel GitHub IOC CSV (1,925 rows) | PRIMARY | Per-sample SHA256/SHA1/MD5, signer organisation + certificate serial, first-seen dates — the basis of the stolen-cert hunt |
| Elastic Security Labs — RONINGLOADER | PRIMARY | RONINGLOADER stage names, service names, registry keys, Defender/PPL abuse chain, final-stage C2 |
| The Hacker News, 2025-11 | CORROBORATING | RONINGLOADER summary, EDR-killer tooling context |
Web-hunter decisions
- Certificate serials were treated as first-class atomic IOCs. They come from the Expel
expel-intelIOC CSV, not from prose, and are the only indicator class that survives recompilation of the payload. - Signer organisations named in this pack are victims, not perpetrators. Their certificates were obtained fraudulently through DigiCert's support portal. Treat a match as "this cert is burned," never as "this vendor is malicious."
- Two legitimate Microsoft runtimes (
vcruntime140.dll,msvcp140.dll) appear in the delivery bundle and were deliberately excluded from the IOC set — blocking them would be self-inflicted damage. - secnews.gr was dropped. The fetch returned a bot-check interstitial with no article body; a source that cannot be snapshotted cannot back an indicator, so it is not cited.
- No certificate thumbprints were published, only serials. The pack does not invent them; thumbprint-based blocking is left as a labelled placeholder.
Hunt Brief & Attack Chain
Hypotheses
- H1 (highest value). A binary in our estate carries a valid Authenticode signature from a certificate in the burned set, or behaves like one: signed, rare, and running from a user-writable directory.
- H2. A support / customer-facing / ticketing-adjacent user executed an archive attachment containing a
.scr,.comor double-extension "screenshot," delivered via chat or a ticketing system rather than ordinary email. - H3. A legitimate signed EXE side-loaded a malicious DLL from the same directory, alongside an encrypted blob masquerading as
.log. - H4. A host is beaconing plaintext WebSocket to a low-numbered port (5188 / 5198) or resolving the published C2 domains.
- H5. RDP was silently enabled and a hidden local administrator created with automatic logon configured.
- H6. Defender was neutered via service/driver abuse or PPL abuse (RONINGLOADER branch) shortly before an unexplained signed binary appeared.
Attack chain
| Stage | Behavior | Artifact / telemetry |
|---|---|---|
| 1 · Initial access | Malicious link or ZIP delivered through a customer-support chat or ticketing system, disguised as a customer screenshot; contains a .scr or .com executable | Archive-extraction parent, browser/ticketing-client parent process, screenshot-style filename |
| 2 · Stage-1 loader | Golden Gh0st Loader fetches a plaintext index (uu.txt / as.txt) from a CDN, then pulls a legitimate EXE + malicious DLL + encrypted .log | Outbound to CDN object storage; multiple files written to one directory |
| 3 · Side-load | Legitimate EXE loads the attacker DLL (crashreport.dll, TASLoginBase.dll, DataPlugin.dll); DLL decrypts the .log into an RWX buffer (ADD 0x77 / XOR 0x62) | Module load from user-writable path; no disk artifact for the implant |
| 4 · Implant | Golden Gh0st RAT: plaintext WebSocket to C2 on 5188 / 5198, 12-byte custom header, payload encrypted with hardcoded keys | Non-TLS WebSocket to a low port; regular zero-length heartbeats |
| 5 · Plugins | Browser credential sweep (Chrome / Firefox / Skype / QQ / 360), keylogger, screenshot, SOCKS proxy, shell, process kill, IE-history wipe, event-log wipe | Browser process killed then profile files read; ClearMyTracksByProcess 255 |
| 6 · Persistence | Randomly named .BAT watchdog that restarts the implant; Windows service; scheduled task named "Windos Defende" | Service/task creation; cmd.exe launching a random-named batch file |
| 7 · RDP backdoor | plugin32.dll pushed over C2, UPX-packed, decrypted in memory: creates a hardcoded local account, adds it to Administrators, edits Winlogon for automatic logon | Account creation + Winlogon registry writes with no corresponding installer |
| R · RONINGLOADER branch | NSIS installers posing as Chrome / Teams / VPN software; signed driver ollama.sys kills AV; ClipUp.exe -ppl overwrites MsMpEng.exe; WDAC policy dropped; goldendays.dll injects into TrustedInstaller | Service names xererre1 / ollama / MicrosoftSoftware2ShadowCop4yProvider; C:\ProgramData\Roning |
Consolidated IOC Table
Read the signer column as "victim." Every organisation named below is a legitimate company whose EV code-signing certificate was obtained fraudulently through the DigiCert support portal. A hit means the certificate is burned.
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| Domain | uu[.]goldeyeuu[.]io:5188 | HIGH | Block | Golden Gh0st RAT C2, Dec 2025 – Jun 2026 |
| Domain | wk[.]goldeyeuu[.]io:5188 | HIGH | Block | Golden Gh0st RAT C2, Jan – Jun 2026 |
| Domain | api[.]keensie[.]com:5198 | HIGH | Block | Golden Gh0st RAT C2, Jun 2026 – current |
| Domain | qaqkongtiao[.]com | HIGH | Block | RONINGLOADER final-payload C2 |
| URL host | kkuu[.]oss-cn-hongkong[.]aliyuncs[.]com | MEDIUM | Detect | Stage-2 CDN staging (2024/2025 campaign) — shared-hosting, do not blanket-block |
| URL host | storage[.]googleapis[.]com/kiki001/ | MEDIUM | Detect | Stage-2 CDN staging (Jun 2026) — path-scoped detect only |
| Cert serial | 0D2AD57B10B7472BAE03D3DEFF05F54F | HIGH | Distrust | Signer: LENOVO (UNITED STATES) INC. — signed crashreport.dll, DataPlugin.dll |
| Cert serial | 0654CDA3DEFAF29DC152EF189C11E337 | HIGH | Distrust | Signer: Shuttle Inc. |
| Cert serial | 0AF316CB4E5D9BAF35B35E85677B17EE | HIGH | Distrust | Signer: PALIT MICROSYSTEMS LTD. TAIWAN BRANCH (BELIZE) |
| Cert serial | 0AE04FFA7B23CC3F7395B25F41255157 | HIGH | Distrust | Signer: Luxvisions Innovation Technology Corp. Limited |
| Cert serial | 049209454DB22190C7697285C3D5AD9B | HIGH | Distrust | Signer: DigiFors GmbH |
| Cert serial | 0CAE428F1BDCBEBAF284EEE9A643B1D8 | HIGH | Distrust | Signer: Brunner Informatik AG |
| Cert serial | 09186DCA3667374ADBD63A2F4FD96365 | HIGH | Distrust | Signer: BlockCerts Blockchain Canada, Inc. |
| Cert serial | 02ED93FDB6CFB33A477E218531F32922 | HIGH | Distrust | Signer: MobSoft Co., Ltd |
| Cert serial | 03A4E330B16DED8C61AD0FB23ECB2E1A | HIGH | Distrust | Signer: Beijing 263 Enterprise Correspondence Co., Ltd. |
| Cert serial | 06500EE65FFBFB6EA4F4B16AB6F910C6 | HIGH | Distrust | Signer: INNOVATIVE CONNECTING PTE. LIMITED — signed fake TurboVPN.exe |
| Cert serial | 0E53B99068FF7BF9C1BBBB025ECEDB58 | HIGH | Distrust | Signer: SoftStory G.Zielinski, K.Jez s.c. |
| SHA256 | 81e276aaa3eb9b3f595663c316b3c6414cc3dde5e6cc3a82856b7276acabb7de | HIGH | Block | Golden Gh0st RAT implant analysed 2026-04-12 |
| SHA256 | d1b1938963037aa332591a4c999523a05886d1f62d80e03f0adc22630b8671c4 | HIGH | Block | plugin32.dll RDP-backdoor plugin (decrypted, unpacked) |
| SHA256 | 27b722c66f69e360c4da106daacf3b9eeaabd20634d7e5eff45a28bd70ebfd65 | HIGH | Block | crashreport.dll side-load DLL — signed with the Lenovo-issued serial |
| SHA256 | 1abffe97aafe9916b366da57458a78338598cab9742c2d9e03e4ad0ba11f29bf | HIGH | Block | TASLoginBase.dll side-load DLL |
| SHA256 | 2515b546125d20013237aeadec5873e6438ada611347035358059a77a32c54f5 | HIGH | Block | ollama.sys — signed driver used for AV process termination (RONINGLOADER) |
| Behavior | Plaintext WebSocket to TCP 5188 / 5198, 12-byte header, zero-length heartbeats | HIGH | Detect | Survives every hash and domain rotation — the most durable signal in this pack |
| Behavior | Signed PE named image<date>.com / photo<date>.com | HIGH | Detect | The "screenshot" lure, consistently reused since 2024 |
| Registry | HKCU\offlinekey (values open, clipboard, charac, newcharac) | HIGH | Detect | RONINGLOADER keylogger + clipboard-hijacker config |
| File path | %ProgramData%\microsoft.dotnet.common.log | HIGH | Detect | Keystroke / clipboard / window-title log, self-deletes above 50 MB |
| Service | xererre1, ollama, MicrosoftSoftware2ShadowCop4yProvider | HIGH | Detect | RONINGLOADER driver-load and stage-3 services |
| Task | Scheduled task named Windos Defende (sic) | HIGH | Detect | Removed by the implant's self-destruct routine — a deletion is as interesting as a creation |
Affected Surface & Telemetry Matrix
| Surface | Telemetry needed | Priority | Common gap |
|---|---|---|---|
| Windows endpoints (all) | ProcessRollup2 with AuthenticodeHashData / SignInfoFlags populated | P1 | Signature fields dropped by ingest field-filtering — verify before trusting Q2 |
| Support / helpdesk / CX workstations | Process + file-write events, archive extraction, browser child processes | P1 | These users are the target set and are often the least restricted by app control |
| Web3 / crypto customer-support teams | Same, plus chat-client download paths | P1 | Links arrive via support chat, bypassing mail-gateway detonation entirely |
| Egress / proxy | DNS, NetworkConnectIP4 with RemotePort, TLS-vs-plaintext classification | P1 | Non-TLS WebSocket on 5188/5198 often unclassified and unlogged |
| Registry | RegObjectName / RegValueName for Winlogon, TermService, offlinekey | P2 | Registry telemetry frequently sampled or scoped to a small key allowlist |
| Local accounts & RDP | Account creation, group membership, fDenyTSConnections | P2 | Local (non-domain) account creation rarely alerted on servers |
| Code-signing trust stores | WDAC / AppLocker publisher rules, Windows CTL, internal allowlists keyed on publisher | P1 | Publisher-based allowlists have no revocation feedback loop — this is the core exposure |
| Defender / EDR integrity | Service state, driver loads, PPL launches, WDAC policy writes | P2 | Tamper events not forwarded to the SIEM |
MITRE ATT&CK Mapping
| Tactic | Technique | Behavior in this campaign | Query / control |
|---|---|---|---|
| Initial Access | T1566.002 Spearphishing Link | Malicious link delivered via customer-support chat / ticketing system | Q3, native hunt N1 |
| Execution | T1204.002 Malicious File | .scr / .com "screenshot" run by a support analyst | Q3 |
| Defense Evasion | T1553.002 Code Signing | Fraudulently obtained EV certificates sign the loader to defeat SmartScreen | Q1, Q2 |
| Defense Evasion | T1574.001 DLL Search Order Hijacking | Legit EXE side-loads crashreport.dll / TASLoginBase.dll | Q4 |
| Defense Evasion | T1562.001 Disable or Modify Tools | ollama.sys driver kills AV; ClipUp.exe -ppl overwrites MsMpEng.exe; WDAC policy dropped | Q9 |
| Defense Evasion | T1070.001 Clear Windows Event Logs | Command 0x158c clears Application / Security / System logs | Q8 |
| Defense Evasion | T1070.004 File Deletion | Self-destruct routine deletes payloads, task and service | Q8 |
| Privilege Escalation | T1548.002 Bypass UAC | Command 0x0c8f relaunches self via ShellExecuteExA("runas") | Q7 |
| Persistence | T1543.003 Windows Service | Service persistence plus a random-named .BAT watchdog | Q10 |
| Persistence | T1136.001 Local Account | plugin32.dll creates a hardcoded local admin | Q6 |
| Persistence | T1547 Winlogon Autologon | Winlogon edited for automatic logon of the backdoor account | Q6 |
| Credential Access | T1555.003 Credentials from Web Browsers | Chrome / Firefox / Skype / QQ / 360 profile sweep after killing the browser | Q7 |
| Collection | T1056.001 Keylogging | DllKeyboard plugin; log at %ProgramData%\microsoft.dotnet.common.log | Q7 |
| Collection | T1113 Screen Capture | Command 0x1565 screenshot capture | Q7 (behavioral) |
| Command and Control | T1071.001 Web Protocols | Plaintext WebSocket, custom 12-byte header, hardcoded keys | Q5 |
| Command and Control | T1090 Proxy | fnProxy plugin opens a SOCKS/TCP tunnel; C2 can re-target the SOCKS port live | Q5, Q10 |
| Lateral Movement | T1021.001 Remote Desktop Protocol | RDP backdoor enabled by plugin32.dll | Q6 |
| Impact / Supply Chain | T1195.003 Compromise Hardware/Software Supply Chain | Theft of certificates intended for third-party customers | S12 hardening |
Native Audit-Log Hunts (non-CQL)
N1 · Support-channel delivery (ticketing / chat platforms)
- Export inbound attachments and links from the last 120 days on every customer-facing queue. Filter for archives whose contents include
.scr,.com,.pif, or a double extension ending in an executable type. - Zendesk / Salesforce / Intercom / Freshdesk: look for a first-contact ticket from an unknown requester whose only content is an attached "screenshot" and a request to view it.
- Check whether your ticketing platform detonates attachments at all. In the DigiCert case delivery was via chat, which typically bypasses the mail gateway entirely.
N2 · Sysmon — the certificate half Falcon does not expose
Falcon's process events do not publish the signer common name or certificate serial. Sysmon EventID 1 does. Run this on any host that returns a hit from Q1–Q4:
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; Id=1} |
ForEach-Object { [xml]$_.ToXml() } |
ForEach-Object {
$d = @{}; $_.Event.EventData.Data | ForEach-Object { $d[$_.Name] = $_.'#text' }
[pscustomobject]$d
} |
Where-Object { $_.Signature -match 'Lenovo|Shuttle|PALIT|Luxvisions|DigiFors|Brunner|BlockCerts|MobSoft|INNOVATIVE CONNECTING|SoftStory' } |
Select-Object UtcTime, Image, Signature, SignatureStatus, Hashes
N3 · Verify serials on a suspect file
$sig = Get-AuthenticodeSignature 'C:\path\to\suspect.exe' $sig.Status $sig.SignerCertificate.Subject $sig.SignerCertificate.SerialNumber # compare against the burned-serial list in S10 $sig.SignerCertificate.Issuer # DigiCert Trusted G4 Code Signing RSA4096 SHA256/SHA384 2021 CA1, GoGetSSL G4 CS RSA4096 SHA256 2022 CA-1, Verokey High Assurance Secure Code EV
N4 · Certificate-inventory audit (do this even with zero endpoint hits)
- If you hold DigiCert EV code-signing certificates, confirm with DigiCert whether any order of yours was in the affected window (approved but pending delivery, spring 2026), and whether your certificate was among the 60 revoked.
- Inventory every WDAC / AppLocker publisher rule. Any rule that trusts a subject name rather than a specific signing cert is now a standing risk.
- Confirm CRL / OCSP checking is actually reachable from endpoints. Revocation is the only control that makes a stolen certificate stop working, and it fails open on air-gapped or proxy-blocked hosts.
N5 · Network — plaintext WebSocket on low ports
On the proxy/firewall, hunt outbound TCP to ports 5188 and 5198 where the session is not TLS. Expel published Suricata coverage with Proofpoint (ETPro/ETOpen) keyed on the 12-byte header bytes; if you run Suricata, confirm the ET MALWARE GoldenGh0stLoader rules are enabled rather than writing your own.
CrowdStrike LogScale CQL Hunt Queries
Field note. Falcon publishes AuthenticodeHashData and SignInfoFlags on process and PE-write events, but it does not publish the signer common name or the certificate serial. Q1 and Q2 therefore hunt the signed-binary behaviour and known hashes; the subject/serial half is covered by the Sysmon and PowerShell hunts in Section 7. Baseline the values SignInfoFlags takes in your own tenant before filtering on a specific one.
Looks for: exact SHA256 matches on Golden Gh0st Loader / RAT samples signed with certificates obtained through the DigiCert support-portal abuse (April 2026 window) plus the analysed implant and RDP plugin. FP: effectively zero — any hit is an incident.
// HUNT: Golden Gh0st samples signed with fraudulently obtained DigiCert EV certs // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2, PeFileWritten #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | in(SHA256HashData, values=[ "81e276aaa3eb9b3f595663c316b3c6414cc3dde5e6cc3a82856b7276acabb7de", "d1b1938963037aa332591a4c999523a05886d1f62d80e03f0adc22630b8671c4", "27b722c66f69e360c4da106daacf3b9eeaabd20634d7e5eff45a28bd70ebfd65", "b48349b0454e0c1ee61990c85ee07c8c68397acc9e5fe980fbb930fc97d3f765", "411ea623229d591865748ad00c5f0d98eadeb711b9737584fc10d093be52de5a", "1abffe97aafe9916b366da57458a78338598cab9742c2d9e03e4ad0ba11f29bf", "4eaebd93e23be3427d4c1349d64bef4b5fc455c93aebb9b5b752981e9266488e", "2b0071007c3f5fa8e949a8de53be03e97901dd505694ca939b575a49e4fdbdbb", "c85911c6b8fa64bb84fe9a46c6f61e45c5aa8e47c73dfa839445a5037b1b43f9", "5e841260983954da60716b99306a410898bca4d30c14626553205753f60a6d2f", "55ce327ac004ed006bd7f11a3da301e9e5a853f79b2d5bad9ea9c83845d406af", "ba4de3c93d319523ab95cf3b724e6cef636e3890746c60067fd70b6f7792e428", "61b82798d812b2d4702dc1468fbada46e2f72e4d5b2598533ddbc33ac2fc843d", "36d22778dda953d192e7fd910faab2f4012421efbb35360ec7fe3e1c5109f1aa", "da2c58308e860e57df4c46465fd1cfc68d41e8699b4871e9a9be3c434283d50b", "82794015e2b40cc6e02d3c1d50241465c0cf2c2e4f0a7a2a8f880edaee203724", "c65170be2bf4f0bd71b9044592c063eaa82f3d43fcbd8a81e30a959bcaad8ae5", "2515b546125d20013237aeadec5873e6438ada611347035358059a77a32c54f5", "33b494eaaa6d7ed75eec74f8c8c866b6c42f59ca72b8517b3d4752c3313e617c" ]) | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, TargetFileName, SHA256HashData, AuthenticodeHashData, CommandLine], limit=max) | sort(@timestamp, order=desc)
Looks for: the whole point of stealing a certificate — a signed PE running from Users, ProgramData, Public, PerfLogs or a temp directory, seen on only a handful of hosts. This is the query that catches the next stolen certificate, not just the ones already published. FP: medium — legitimate signed installers, updaters, Teams/Slack/Chrome auto-update stubs and IT tooling live in these paths. Tune with the exclusion list, then baseline the survivors once and re-run weekly.
// HUNT: signed-but-rare PE from a user-writable path (stolen code-signing cert abuse) // CONF: high FP: med COST: med | REQUIRES: ProcessRollup2 with AuthenticodeHashData populated // NOTE: AuthenticodeHashData is only populated for signed images - its presence IS the signed test #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | AuthenticodeHashData = * | ImageFileName = /\\(Users|ProgramData|PerfLogs|Windows\\Temp|Windows\\Tasks)\\/i | ImageFileName != /\\(Program Files|Program Files \(x86\)|Windows\\System32|Windows\\SysWOW64|Windows\\WinSxS)\\/i // TUNING: drop your own signed updaters / management agents here, then baseline the // TUNING: survivors once and re-run weekly - only new AuthenticodeHashData values matter | FileName != /^(Teams|Update|SlackSetup|OneDriveSetup|GoogleUpdate|MicrosoftEdgeUpdate|setup|msedgewebview2|ninjarmm-cli)(\.exe)?$/i | groupBy([AuthenticodeHashData, FileName, SHA256HashData], function=[count(as=Execs), count(ComputerName, distinct=true, as=Hosts), collect(ImageFileName, limit=4), collect(ComputerName, limit=8)], limit=5000) // rarity gate: a stolen cert signs a payload that shows up on very few hosts | Hosts < 4 | sort(Hosts, order=asc)
Looks for: the delivery artifact that compromised DigiCert. The actor has reused image<yyyymmdd>nn.com / photo<yyyymmdd>nn.com naming continuously since 2024, and the DigiCert ZIP contained a .scr. Also catches any .scr/.com/.pif executed with a browser, archive tool or chat client as parent. FP: low — .scr and .com executions are rare in modern estates; legacy .com tools are the main noise source.
// HUNT: screenshot-lure executable delivered via support chat / ticketing // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName = /^((image|photo|screenshot|img|pic)[-_]?\d{4,14}\.(com|exe|scr|pif))|(.+\.(scr|pif))$/i | ParentBaseFileName = /^(7zFM|7zG|WinRAR|Explorer|chrome|msedge|firefox|Teams|Slack|Discord|Telegram|outlook|zendesk|salesforce)(\.exe)?$/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, ParentBaseFileName, ParentCommandLine, SHA256HashData, AuthenticodeHashData, CommandLine], limit=200) | sort(@timestamp, order=desc)
Looks for: the named side-load DLLs written outside their legitimate install directory, and the encrypted second-stage blob dropped beside them under a .log extension. crashreport.dll in %PUBLIC%\videos\ is a published observation from the June 2026 campaign. FP: low, provided the path exclusion for real install directories is kept.
// HUNT: DLL side-load pair + encrypted .log payload (Golden Gh0st Loader) // CONF: high FP: low COST: low | REQUIRES: PeFileWritten / NewExecutableWritten / file-write telemetry #event_simpleName=/^(PeFileWritten|NewExecutableWritten|ClassifiedModuleLoad|ImageHash)$/ | TargetFileName = /\\(crashreport|TASLoginBase|DataPlugin|Snieoatwtregoable|goldendays|plugin32|plug32)\.dll$/i or TargetFileName = /\\(updat|TASLogin|as|uu)\.log$/i | TargetFileName != /\\(Program Files|Program Files \(x86\))\\/i | table([@timestamp, ComputerName, UserName, TargetFileName, TargetDirectoryName, SHA256HashData, ContextBaseFileName, ImageFileName], limit=200) | sort(@timestamp, order=desc)
Looks for: DNS resolution of the published C2 domains, plus the durable behavioural half — repeated outbound TCP to 5188 or 5198 from a process that is not a known messaging/game client. The implant supports live C2 and SOCKS-port re-targeting, so the port pattern outlives the domains. FP: medium on the port half; some Chinese-market applications and game clients legitimately use these ports. Baseline first, then alert on new (process, port) pairs only.
// HUNT: Golden Gh0st RAT C2 - named domains OR plaintext WebSocket to 5188/5198 // CONF: high FP: med COST: low | REQUIRES: DnsRequest, NetworkConnectIP4 #event_simpleName=/^(DnsRequest|NetworkConnectIP4|NetworkConnectIP6)$/ | DomainName = /(^|\.)(goldeyeuu\.io|keensie\.com|qaqkongtiao\.com)$/i or RemotePort = 5188 or RemotePort = 5198 // TUNING: exclude known-good clients that use these ports in your estate; after the // TUNING: first baseline, alert only on new (ContextBaseFileName, RemotePort) pairs | ContextBaseFileName != /^(steam|WeChat|QQ|DingTalk)(\.exe)?$/i | groupBy([ComputerName, ContextBaseFileName, DomainName, RemoteAddressIP4, RemotePort], function=[count(as=Hits), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=5000) | sort(Hits, order=desc)
Looks for: the three moves plugin32.dll makes to open its RDP backdoor — create a local account, add it to Administrators, and edit Winlogon for automatic logon with suppressed credential prompts — plus the classic fDenyTSConnections flip and TermService start-type tampering. FP: low; legitimate hits come from imaging/provisioning tooling and kiosk builds, which should be a short, known list.
// HUNT: RDP backdoor enablement (Golden Gh0st plugin32.dll) // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 + registry telemetry #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|RegSystemConfigValueUpdate|AsepValueUpdate|RegGenericValueUpdate)$/ | CommandLine = /net(1)?\s+(user\s+\S+\s+\S+\s+\/add|localgroup\s+(administrators|administradores)\s+\S+\s+\/add)/i or CommandLine = /reg(\.exe)?\s+add.+(fDenyTSConnections|AutoAdminLogon|DefaultUserName|DefaultPassword)/i or CommandLine = /(sc|net)(\.exe)?\s+(config|start)\s+TermService/i or RegObjectName = /\\Control\\Terminal Server$/i or RegObjectName = /\\Windows NT\\CurrentVersion\\Winlogon$/i | RegValueName != /^(Shell|Userinit|LastUsedUsername)$/i | table([@timestamp, ComputerName, UserName, FileName, CommandLine, RegObjectName, RegValueName, RegStringValue, ParentBaseFileName], limit=200) | sort(@timestamp, order=desc)
Looks for: the RAT's credential dispatch handlers in action — the implant kills a browser or Skype first, then reads the profile store, which produces a distinctive "taskkill browser then touch Login Data" sequence. Also covers the RONINGLOADER keylog/clipboard configuration keys and log file. FP: medium — legitimate password-manager imports and browser-migration tools also read these stores; the taskkill-then-read ordering and the offlinekey registry path are the discriminators.
// HUNT: Gh0st plugin credential sweep + keylogger/clipboard config // CONF: med FP: med COST: low | REQUIRES: ProcessRollup2 + registry + file telemetry // FALSE POSITIVES: password-manager imports and browser-migration tools also read these stores // TUNING: exclude your approved password manager and profile-migration tooling below; // TUNING: the taskkill-then-read ordering and the \offlinekey path are the real discriminators, // TUNING: so triage those two branches first before working the file-artifact branch #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|RegGenericValueUpdate|AsepValueUpdate|PeFileWritten|NewExecutableWritten)$/ | ContextBaseFileName != /^(1Password|KeePass|KeePassXC|Bitwarden|LastPass|dashlane|BrowserMigration)(\.exe)?$/i | CommandLine = /taskkill.+\/im\s+(chrome|firefox|skype|360se|360chrome|QQBrowser|msedge)\.exe/i or RegObjectName = /\\offlinekey/i or RegValueName = /^(newcharac|characLen|charac|clipboard)$/i or TargetFileName = /\\microsoft\.dotnet\.common\.log$/i or TargetFileName = /\\(avBackup\.dat|FormData3\.dat|historyUrl3\.db|history3\.db)$/i | table([@timestamp, ComputerName, UserName, FileName, CommandLine, RegObjectName, RegValueName, TargetFileName, ParentBaseFileName], limit=200) | sort(@timestamp, order=desc)
Looks for: the implant's clean-up commands — RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255 (command 0x0c9b), Application/Security/System log clearing (0x158c), and the self-destruct routine that deletes the misspelled Windos Defende scheduled task and its own service. FP: low; wevtutil cl on a workstation is almost never legitimate.
// HUNT: Golden Gh0st RAT anti-forensic commands // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine = /InetCpl\.cpl,\s*ClearMyTracksByProcess/i or CommandLine = /wevtutil(\.exe)?\s+cl\s+(Application|Security|System)/i or CommandLine = /Clear-EventLog/i or CommandLine = /schtasks(\.exe)?\s+\/delete.+Windos\s*Defende/i or CommandLine = /(sc|net)(\.exe)?\s+(delete|stop)\s+.*(Windos|Defende)/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, ParentCommandLine], limit=200) | sort(@timestamp, order=desc)
Looks for: the RONINGLOADER chain that delivers the same Gh0st variant — the transient driver services (xererre1, ollama), the stage-3 service MicrosoftSoftware2ShadowCop4yProvider loading goldendays.dll via regsvr32, the mklink-plus-ClipUp.exe -ppl trick that overwrites MsMpEng.exe, and the phantom Wow64Log.dll plant. FP: low — none of these strings have a benign analogue. ClipUp.exe outside of a Windows setup context is the strongest single signal.
// HUNT: RONINGLOADER - PPL abuse, driver-based AV kill, TrustedInstaller injection // CONF: high FP: low COST: med | REQUIRES: ProcessRollup2, service + file telemetry #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|ServiceStarted|PeFileWritten|NewExecutableWritten)$/ | CommandLine = /ClipUp(\.exe)?\s+-ppl/i or CommandLine = /mklink\s+\/D\s+.*ProgramData\\roming/i or CommandLine = /regsvr32(\.exe)?\s+\/S\s+.*ProgramData\\Roning\\goldendays\.dll/i or ServiceName = /^(xererre1|ollama|MicrosoftSoftware2ShadowCop4yProvider)$/i or ServiceImagePath = /\\(ollama|inject)\.sys$/i or TargetFileName = /\\Wow64\\Wow64Log\.dll$/i or TargetFileName = /\\drivers\\\d{6,8}\.temp$/i or TargetFileName = /\\ProgramData\\(Roning|lnk)\\/i or TargetFileName = /\\CiPolicies\\Active\\\{31351756-3F24-4963-8380-4E7602335AAE\}\.cip$/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, ServiceName, ServiceImagePath, TargetFileName, ParentBaseFileName], limit=200) | sort(@timestamp, order=desc)
Looks for: command 0x0c97's randomly-named batch watchdog (RONINGLOADER writes it directly into C:\Windows\, e.g. KPeYvogsPm.bat) and the loop that restarts the malicious service, plus process-level indicators of the fnProxy SOCKS tunnel — a non-browser process listening locally and relaying outbound. FP: medium — legitimate batch scripts exist, so the discriminators are the write location (C:\Windows\ root), the random 8–12 character mixed-case stem, and the timeout/tasklist loop body.
// HUNT: random-named .BAT watchdog in C:\Windows + SOCKS relay behaviour // CONF: med FP: med COST: low | REQUIRES: ProcessRollup2 + file-write telemetry // FALSE POSITIVES: legitimate admin batch scripts; portproxy used by real remote-access setups // TUNING: exclude your deployment/RMM writer processes below; the discriminators are the // TUNING: write location (C:\Windows\ root, not System32), the random mixed-case 8-12 char // TUNING: stem, and the timeout/tasklist loop body - a named .bat in C:\Windows is usually IT #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|NewExecutableWritten|PeFileWritten)$/ | ContextBaseFileName != /^(ninjarmm-cli|TaniumClient|ccmexec|msiexec|SCNotification)(\.exe)?$/i | TargetFileName = /\\Windows\\[A-Za-z]{8,12}\.bat$/ or CommandLine = /cmd(\.exe)?\s+\/c\s+.*\\Windows\\[A-Za-z]{8,12}\.bat/ or CommandLine = /tasklist.+(findstr|find)\s+.*\s+timeout\s+\/t\s+10/i or CommandLine = /netsh\s+interface\s+portproxy\s+add/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, TargetFileName, ParentBaseFileName, ParentCommandLine], limit=200) | sort(@timestamp, order=desc)
Custom IOA Recommendations
| IOA name | Type | Pattern | Exclusions | Action |
|---|---|---|---|---|
| GoldenEyeDog · Screenshot-lure executable | Process Creation | Image filename regex ^(image|photo|screenshot)[-_]?\d{4,14}\.(com|exe|scr)$ | None expected | Block / Detect (Critical) |
| GoldenEyeDog · SCR from archive or chat client | Process Creation | Image name ends .scr; parent in {7zFM, 7zG, WinRAR, explorer, chrome, msedge, Teams, Slack, Telegram} | Legacy screensaver deployment tooling | Block (High) |
| GoldenEyeDog · Side-load DLL basename | File Write | Written filename matches (crashreport|TASLoginBase|DataPlugin|goldendays|plugin32)\.dll outside Program Files | Vendor install paths for genuine crash-reporting SDKs | Detect (High) → Block after 14 days clean |
| GoldenEyeDog · RDP backdoor account | Process Creation | net user … /add followed within 60s by net localgroup administrators … /add on the same host | Provisioning / imaging service accounts (allowlist by parent) | Block (Critical) |
| GoldenEyeDog · Winlogon autologon write | Registry | Write to Winlogon\AutoAdminLogon or DefaultPassword by a process not on the management-tool allowlist | Kiosk/lab build automation | Detect (Critical) |
| RONINGLOADER · ClipUp PPL abuse | Process Creation | ClipUp.exe with -ppl argument | None — no benign use outside OOBE | Block (Critical) |
| RONINGLOADER · Transient driver service | Service | Service created and deleted within 5 minutes whose image path ends .sys in a temp or user path | Legitimate driver installers (allowlist by publisher) | Detect (Critical) |
| Golden Gh0st · Plaintext WebSocket beacon | Network | Repeated outbound TCP to 5188/5198 with regular short-interval keepalives from a non-allowlisted process | Baseline first — some CN-market apps use these ports | Detect (High) |
Deployment path: Endpoint security → Custom IOA rule groups → assign to a pilot host group first, run 7 days in Detect, then promote the Block-rated rules. The screenshot-lure and ClipUp rules are safe to deploy directly to Block; everything else should serve a detect-only tour first.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,81e276aaa3eb9b3f595663c316b3c6414cc3dde5e6cc3a82856b7276acabb7de,prevent,critical,2027-07-20,Golden Gh0st RAT implant,campaign:CylindricalCanine sha256,d1b1938963037aa332591a4c999523a05886d1f62d80e03f0adc22630b8671c4,prevent,critical,2027-07-20,plugin32.dll RDP backdoor plugin,campaign:CylindricalCanine sha256,27b722c66f69e360c4da106daacf3b9eeaabd20634d7e5eff45a28bd70ebfd65,prevent,critical,2027-07-20,crashreport.dll side-load DLL,campaign:CylindricalCanine sha256,b48349b0454e0c1ee61990c85ee07c8c68397acc9e5fe980fbb930fc97d3f765,prevent,critical,2027-07-20,crashreport.dll signed with stolen cert,campaign:CylindricalCanine sha256,411ea623229d591865748ad00c5f0d98eadeb711b9737584fc10d093be52de5a,prevent,critical,2027-07-20,DataPlugin.dll signed with stolen cert,campaign:CylindricalCanine sha256,1abffe97aafe9916b366da57458a78338598cab9742c2d9e03e4ad0ba11f29bf,prevent,critical,2027-07-20,TASLoginBase.dll side-load DLL,campaign:CylindricalCanine sha256,4eaebd93e23be3427d4c1349d64bef4b5fc455c93aebb9b5b752981e9266488e,prevent,critical,2027-07-20,down.exe stage-1 loader,campaign:CylindricalCanine sha256,2b0071007c3f5fa8e949a8de53be03e97901dd505694ca939b575a49e4fdbdbb,detect,high,2027-07-20,updat.exe sideload host binary,campaign:CylindricalCanine sha256,3313f347e83aaf48ea31fb1d49fc37452f48f81d20a1b93009e2e78385ff4bba,prevent,critical,2027-07-20,updat.log encrypted stage-2 blob,campaign:CylindricalCanine sha256,dd44dabff536a1aa9b845dd891ad483162d4f28913344c93e5d59f648a186098,prevent,critical,2027-07-20,TASLogin.log encrypted stage-2 blob,campaign:CylindricalCanine sha256,c85911c6b8fa64bb84fe9a46c6f61e45c5aa8e47c73dfa839445a5037b1b43f9,prevent,critical,2027-07-20,image2026040568.com screenshot lure,campaign:CylindricalCanine sha256,5e841260983954da60716b99306a410898bca4d30c14626553205753f60a6d2f,prevent,critical,2027-07-20,fake TurboVPN.exe signed with stolen cert,campaign:CylindricalCanine sha256,55ce327ac004ed006bd7f11a3da301e9e5a853f79b2d5bad9ea9c83845d406af,prevent,critical,2027-07-20,wss.exe signed with stolen cert,campaign:CylindricalCanine sha256,ba4de3c93d319523ab95cf3b724e6cef636e3890746c60067fd70b6f7792e428,prevent,critical,2027-07-20,image20260412689.com screenshot lure,campaign:CylindricalCanine sha256,61b82798d812b2d4702dc1468fbada46e2f72e4d5b2598533ddbc33ac2fc843d,prevent,critical,2027-07-20,fake TurboVPN.exe signed with stolen cert,campaign:CylindricalCanine sha256,36d22778dda953d192e7fd910faab2f4012421efbb35360ec7fe3e1c5109f1aa,prevent,critical,2027-07-20,masquerading java.exe signed with stolen cert,campaign:CylindricalCanine sha256,da2c58308e860e57df4c46465fd1cfc68d41e8699b4871e9a9be3c434283d50b,prevent,critical,2027-07-20,RONINGLOADER initial installer,campaign:GoldenEyeDog sha256,82794015e2b40cc6e02d3c1d50241465c0cf2c2e4f0a7a2a8f880edaee203724,prevent,critical,2027-07-20,RONINGLOADER malicious NSIS installer,campaign:GoldenEyeDog sha256,c65170be2bf4f0bd71b9044592c063eaa82f3d43fcbd8a81e30a959bcaad8ae5,prevent,critical,2027-07-20,RONINGLOADER stage-1 loader DLL,campaign:GoldenEyeDog sha256,2515b546125d20013237aeadec5873e6438ada611347035358059a77a32c54f5,prevent,critical,2027-07-20,ollama.sys AV-killer driver,campaign:GoldenEyeDog sha256,33b494eaaa6d7ed75eec74f8c8c866b6c42f59ca72b8517b3d4752c3313e617c,prevent,critical,2027-07-20,goldendays.dll stage-3 entry point,campaign:GoldenEyeDog md5,54def291b6bd573186734895b7ed03b6,detect,high,2027-07-20,Golden Gh0st related sample,campaign:CylindricalCanine domain,uu.goldeyeuu.io,prevent,critical,2027-07-20,Golden Gh0st RAT C2 port 5188,campaign:CylindricalCanine domain,wk.goldeyeuu.io,prevent,critical,2027-07-20,Golden Gh0st RAT C2 port 5188,campaign:CylindricalCanine domain,api.keensie.com,prevent,critical,2027-07-20,Golden Gh0st RAT C2 port 5198,campaign:CylindricalCanine domain,qaqkongtiao.com,prevent,critical,2027-07-20,RONINGLOADER final payload C2,campaign:GoldenEyeDog # CDN staging hosts are shared infrastructure - DETECT on the full path, never block the domain: # kkuu[.]oss-cn-hongkong[.]aliyuncs[.]com/ss/ and storage[.]googleapis[.]com/kiki001/ # Certificate thumbprints were not published by any source. Use serials (block below) or: sha256,REPLACE_WITH_THUMBPRINT_IF_YOUR_CA_PUBLISHES_ONE,detect,high,2027-07-20,placeholder - do not import as-is,campaign:CylindricalCanine
# Serials of code-signing certificates abused by GoldenEyeDog in the April 2026 # DigiCert theft window. The named organisations are VICTIMS - their certificates # were fraudulently obtained. Distrust the serial, not the company. 0D2AD57B10B7472BAE03D3DEFF05F54F LENOVO (UNITED STATES) INC. 0654CDA3DEFAF29DC152EF189C11E337 Shuttle Inc. 0AF316CB4E5D9BAF35B35E85677B17EE PALIT MICROSYSTEMS LTD. TAIWAN BRANCH (BELIZE) 0AE04FFA7B23CC3F7395B25F41255157 Luxvisions Innovation Technology Corp. Limited 049209454DB22190C7697285C3D5AD9B DigiFors GmbH 0CAE428F1BDCBEBAF284EEE9A643B1D8 Brunner Informatik AG 09186DCA3667374ADBD63A2F4FD96365 BlockCerts Blockchain Canada, Inc. 02ED93FDB6CFB33A477E218531F32922 MobSoft Co., Ltd 03A4E330B16DED8C61AD0FB23ECB2E1A Beijing 263 Enterprise Correspondence Co., Ltd. 06500EE65FFBFB6EA4F4B16AB6F910C6 INNOVATIVE CONNECTING PTE. LIMITED 0E53B99068FF7BF9C1BBBB025ECEDB58 SoftStory G.Zielinski, K.Jez s.c. # Issuing CAs from which DigiCert revoked 60 fraudulently obtained certificates # (27 explicitly linked to this actor): DigiCert Trusted G4 Code Signing RSA4096 SHA256 2021 CA1 DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1 GoGetSSL G4 CS RSA4096 SHA256 2022 CA-1 Verokey High Assurance Secure Code EV
# These outlive every hash, domain and certificate in this pack.
NET plaintext (non-TLS) WebSocket to TCP 5188 or 5198, 12-byte custom header,
zero-length heartbeat frames at a regular interval
PROC signed PE executing from \Users\, \ProgramData\, \Public\, \PerfLogs\ or a
temp directory, seen on fewer than 4 hosts in the estate
PROC image<date>.com / photo<date>.com / *.scr launched by an archive tool,
browser, or chat/ticketing client
LOAD legitimate signed EXE loading a DLL from the same user-writable directory,
with an adjacent oversized ".log" file (encrypted stage 2)
REG HKLM\...\Windows NT\CurrentVersion\Winlogon AutoAdminLogon / DefaultPassword
written with no matching provisioning job
ACCT local account created and added to Administrators within the same minute
REG HKCU\offlinekey values: open, clipboard, charac, characLen, newcharac
FILE %ProgramData%\microsoft.dotnet.common.log (keystroke/clipboard log)
PROC RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255
PROC ClipUp.exe -ppl (any argument form) outside of Windows OOBE
SVC service created and deleted within minutes, image path a .sys in a temp path
FILE C:\Windows\<8-12 random mixed-case chars>.bat watchdog script
TASK scheduled task literally named "Windos Defende" (misspelled)
Actor GoldenEyeDog = APT-Q-27 = Dragon Breath = Miuuti Group (Chinese cybercrime, active since ~2015)
Subgroup CylindricalCanine = Expel-TA-0002 (the DigiCert intrusion cluster)
Malware Golden Gh0st Loader (first stage, side-loading)
Malware Golden Gh0st RAT (modified Gh0st RAT / Farfli lineage)
Alias Zhong Stealer (ANY.RUN naming - Expel assesses it is a full RAT, not just a stealer)
Malware RONINGLOADER (sibling cluster loader, NSIS + PPL abuse)
Module plugin32.dll (RDP-backdoor persistence plugin, UPX packed)
Keys REGISTER_KEY 8A913610E905C3DD1F657811EA3B1933471B230F88E1C155616099A03AB0ABC0
MODULE_KEY 2031A71C399563ADAF1572E10ABB395387EB132208A001C5E140496D7A3E0B26
Crypto stage-2 .log decryption: CIPHER_ADD 0x77, CIPHER_XOR 0x62
Network Suricata: "ET MALWARE GoldenGh0stLoader Websocket Checkin - C2 Response"
Suricata: "ET MALWARE GoldenGh0stLoader Directory Listing Command From C2"
(both shipped in Proofpoint ETPro and ETOpen - enable rather than rewrite)
[ ] Do we hold DigiCert EV code-signing certificates? Was any order of ours
approved-but-undelivered in spring 2026? Ask DigiCert directly.
[ ] Was any certificate of ours among the 60 revoked? If yes: re-key, re-sign,
and audit every artifact signed in the exposure window.
[ ] Are CRL/OCSP endpoints reachable from every endpoint and build agent?
Revocation is the only control that turns a stolen cert off.
[ ] Enumerate every WDAC / AppLocker PUBLISHER rule. Replace subject-name trust
with specific-certificate trust, or add a file-hash constraint.
[ ] Do our signing keys live in an HSM or hardware token, with a signing service
in front, so an initialization code alone cannot yield a usable certificate?
[ ] Does our own support portal have an "act as customer" / impersonation view?
What secrets are visible through it, and are they masked for proxied users?
[ ] Is impersonation-mode use logged, alerted on, and reviewed?
[ ] Do our support and CX staff run with application control enforced? They are
the target set in this campaign, and are usually the least restricted.
Detection Validation Gates
| Gate | Check | Pass criterion |
|---|---|---|
| G1 · Telemetry ready | Run #event_simpleName=ProcessRollup2 | AuthenticodeHashData = * | head(20) | Returns rows. If empty, AuthenticodeHashData is not populated in your tenant and Q2 is blind — fix ingest before trusting the result. |
| G2 · Signature-flag baseline | #event_simpleName=ProcessRollup2 | groupBy([SignInfoFlags], function=count(as=n), limit=50) | You can enumerate the distinct values and know which mean "trusted chain" in your sensor version, before filtering on any of them. |
| G3 · Benign baseline | Run Q2 across 30 days on a known-clean host group | Result set is small enough to review by hand (target: under 50 rows). If not, extend the exclusion regex before promoting. |
| G4 · Positive test — screenshot lure | In a lab, copy a signed benign EXE to %TEMP%\image20260720.com and launch it from 7-Zip | Q3 fires within the search window. |
| G5 · Positive test — RDP backdoor | In a lab, run net user hunttest … /add then net localgroup administrators hunttest /add, then write an AutoAdminLogon value | Q6 fires on both the process and registry legs. Remove the account afterwards. |
| G6 · Positive test — network | From a lab host, open a plaintext TCP connection to a sinkhole on 5188 | Q5 returns the connection with the initiating process attributed. |
| G7 · Negative control | Confirm Q1 returns zero on a known-clean estate | Any hit is an incident, not a tuning problem — escalate immediately. |
| G8 · Promotion | Q1, Q3, Q4, Q6, Q8, Q9 clean for 7 consecutive days at detect-only | Promote to scheduled search with alerting. Q2, Q5, Q7, Q10 stay analyst-run until their baselines settle. |
Hardening — Tiered
- Block executable content in support channels. Strip or quarantine
.scr,.com,.pif,.exe,.js,.lnkand password-protected archives arriving through ticketing and live-chat platforms, not just email. This is the exact control whose absence caused the DigiCert compromise. (MITRE M1049, M1040) - Turn off screensaver-executable association for standard users, and add an ASR-equivalent rule blocking
.screxecution from user-writable paths. - Block the published C2 domains at DNS and egress:
uu[.]goldeyeuu[.]io,wk[.]goldeyeuu[.]io,api[.]keensie[.]com,qaqkongtiao[.]com. Detect-only on the CDN staging paths — those hosts are shared and must not be blanket-blocked. - Import the burned certificate serials into a WDAC deny policy (see S13 playbook 1). Do not wait for CRL propagation to reach every endpoint.
- Verify CRL/OCSP reachability from endpoints and build agents. A revoked certificate that cannot be checked is an accepted certificate.
- Deploy the ClipUp
-ppland screenshot-lure IOAs in Block mode — neither has a benign analogue.
- Replace publisher-name trust with certificate-specific trust in WDAC and AppLocker. A rule that says "trust anything signed by Vendor X" now grants an attacker with any Vendor X certificate full execution. Pin to the specific signing certificate, or pair publisher rules with file-hash or version constraints. (MITRE M1045, M1038)
- Application control for support / CX / helpdesk staff. They are this actor's target set across both the DigiCert and Web3 campaigns, and are typically the least restricted population in the estate. Move them to enforced WDAC or AppLocker.
- Harden RDP. Enforce NLA, disable local-account RDP logon via
DenyRDPLogonfor local accounts, and alert on anyfDenyTSConnectionschange. (MITRE M1042, M1035) - Alert on local administrator creation on every workstation and server. The
plugin32.dllbackdoor account is otherwise invisible. - Enable Defender tamper protection and forward tamper/PPL events to the SIEM. RONINGLOADER's whole first act is turning the EDR off.
- Enable Microsoft vulnerable-driver blocklist / HVCI to blunt the signed-driver AV-kill technique.
- Audit your own impersonation features. If any internal tool has a "view as customer" mode, mask secrets for proxied users, log every use, and alert on volume anomalies. DigiCert's own remediation was exactly this: masking initialization codes from proxied users on both UI and API.
- Treat code-signing material as tier-0 secrets. Keys in an HSM, signing behind a service that enforces approval and produces an immutable log, no path where possession of a single code alone yields a usable certificate.
- Build a signing-artifact inventory. You should be able to answer "what did we sign, when, with which certificate" within an hour. Without it, a revocation event becomes an open-ended incident.
- Adopt reproducible builds and transparency logging for released binaries so a fraudulently signed artifact is detectable as "not from our build system" regardless of signature validity.
- Add a supply-chain clause to vendor reviews covering the vendor's own support-portal impersonation controls and their revocation SLA.
- Shift detection weight from reputation to behaviour. This campaign is the proof that publisher reputation is purchasable. Any control whose logic terminates at "signature valid → allow" needs a behavioural second stage.
Deployable Playbooks
1 · WDAC deny rules for the burned certificate serials
Generate a deny-by-serial supplemental policy. Run on a management host with the WDAC cmdlets available, then merge into your base policy and deploy in Audit mode first.
# Requires: Windows 11 / Server 2022+ management host, ConfigCI module
$serials = @(
'0D2AD57B10B7472BAE03D3DEFF05F54F','0654CDA3DEFAF29DC152EF189C11E337',
'0AF316CB4E5D9BAF35B35E85677B17EE','0AE04FFA7B23CC3F7395B25F41255157',
'049209454DB22190C7697285C3D5AD9B','0CAE428F1BDCBEBAF284EEE9A643B1D8',
'09186DCA3667374ADBD63A2F4FD96365','02ED93FDB6CFB33A477E218531F32922',
'03A4E330B16DED8C61AD0FB23ECB2E1A','06500EE65FFBFB6EA4F4B16AB6F910C6',
'0E53B99068FF7BF9C1BBBB025ECEDB58'
)
# Emit the serial list for your policy authoring tool / MDM console.
# WDAC deny-by-signer requires the signing cert; where you have a sample signed
# by one of these serials, extract the cert and build a Deny rule from it:
# $c = (Get-AuthenticodeSignature .\sample.exe).SignerCertificate
# $c | Export-Certificate -FilePath .\burned.cer
# New-CIPolicyRule -DriverFilePath .\sample.exe -Level Publisher -Deny
# Then: Merge-CIPolicy, Set-RuleOption -Option 3 -Delete (leave Audit ON first),
# ConvertFrom-CIPolicy, and deploy via MDM/GPO.
$serials | ForEach-Object { "DENY_SERIAL,$_" }
2 · Sweep the estate for the burned serials (agentless, via WinRM)
$burned = @(
'0D2AD57B10B7472BAE03D3DEFF05F54F','0654CDA3DEFAF29DC152EF189C11E337',
'0AF316CB4E5D9BAF35B35E85677B17EE','0AE04FFA7B23CC3F7395B25F41255157',
'049209454DB22190C7697285C3D5AD9B','0CAE428F1BDCBEBAF284EEE9A643B1D8',
'09186DCA3667374ADBD63A2F4FD96365','02ED93FDB6CFB33A477E218531F32922',
'03A4E330B16DED8C61AD0FB23ECB2E1A','06500EE65FFBFB6EA4F4B16AB6F910C6',
'0E53B99068FF7BF9C1BBBB025ECEDB58'
)
$paths = @("$env:PUBLIC","$env:ProgramData","$env:LOCALAPPDATA","$env:TEMP","C:\PerfLogs")
foreach ($p in $paths) {
Get-ChildItem -Path $p -Recurse -Include *.exe,*.dll,*.sys,*.com,*.scr -ErrorAction SilentlyContinue |
ForEach-Object {
$s = Get-AuthenticodeSignature $_.FullName -ErrorAction SilentlyContinue
if ($s.SignerCertificate -and $burned -contains $s.SignerCertificate.SerialNumber) {
[pscustomobject]@{
Host = $env:COMPUTERNAME
File = $_.FullName
Serial = $s.SignerCertificate.SerialNumber
Subject= $s.SignerCertificate.Subject
Status = $s.Status
SHA256 = (Get-FileHash $_.FullName -Algorithm SHA256).Hash
}
}
}
}
3 · Block executable content from support channels (mail/gateway policy shape)
# Transport / chat DLP rule intent (translate to your platform):
BLOCK attachment extension in { scr, pif, com, exe, msi, js, jse, vbs, lnk, hta, cpl }
BLOCK archive containing any of the above, at any nesting depth
QUARANTINE password-protected archive from an external, first-contact sender
APPLY TO every customer-facing queue AND the live-chat/file-upload path,
not just SMTP. The DigiCert delivery was a chat upload.
NOTIFY the agent with a plain-language reason so they do not seek a workaround
4 · RDP backdoor hardening (GPO / registry)
# Deny RDP to local accounts (blocks the plugin32.dll backdoor account path) # Computer Config > Policies > Windows Settings > Security Settings > # Local Policies > User Rights Assignment > # "Deny log on through Remote Desktop Services" -> add: Local account # PowerShell (run elevated). Each reg add is one line on purpose -- a CMD caret (^) # continuation does not work in PowerShell, and this block previously mixed the two. # Require Network Level Authentication reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 1 /f # Ensure RDP stays disabled where it is not required # WARNING: this disables inbound RDP on the host. Confirm out-of-band access # (console/iLO/DRAC) before running it on a remote server. reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 1 /f # Verify: # reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication # Rollback: # reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f # Block autologon abuse - these values should never be set on a managed endpoint # Audit: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon # AutoAdminLogon, DefaultUserName, DefaultPassword, DefaultDomainName
5 · Defender / EDR tamper resistance (RONINGLOADER branch)
# PowerShell (run elevated). Each reg add is one line on purpose -- a CMD caret (^) # continuation does not work in PowerShell, and this block previously mixed the two. # Tamper Protection is NOT settable from here. When it is on, Set-MpPreference calls # that alter protection settings are blocked by design; the old line in this block # (Set-MpPreference -DisableTamperProtection $false) was decorative at best and threw # access-denied at worst. Set it in Intune / the Defender portal, then confirm locally: Get-MpComputerStatus | Select-Object IsTamperProtected, AMRunningMode # Microsoft Vulnerable Driver Blocklist. Independent of HVCI -- this works on its own # and is what actually blunts an ollama.sys-style AV-kill driver. reg add "HKLM\SYSTEM\CurrentControlSet\Control\CI\Config" /v VulnerableDriverBlocklistEnable /t REG_DWORD /d 1 /f # HVCI. The scenario key ALONE does not enable it -- VBS must be enabled as well, or # the control silently never activates. All three values are required. reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1 /f reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v RequirePlatformSecurityFeatures /t REG_DWORD /d 1 /f reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v Enabled /t REG_DWORD /d 1 /f # Prerequisites: UEFI + Secure Boot + virtualization extensions. Reboot required. # PILOT FIRST -- incompatible legacy drivers can block boot under HVCI. # Verify AFTER reboot (must contain 2 for HVCI): # (Get-CimInstance Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning # Rollback: # reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v Enabled /t REG_DWORD /d 0 /f # reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 0 /f # (then reboot; if the host will not boot, use Safe Mode or WinRE to revert) # Alert on any write to the active WDAC policy directory - RONINGLOADER drops its own # C:\Windows\System32\CodeIntegrity\CiPolicies\Active\*.cip
Containment Runbook
| Phase | Actions | Owner | Evidence to capture |
|---|---|---|---|
| 0 · Trigger | Any hit on Q1, or a Q2/Q3 hit that survives triage | SOC L1 | Query output, host, user, full process tree |
| 1 · Isolate | Network-contain the host in Falcon. Do not power off — the implant runs in memory after decrypting the .log blob, and a reboot destroys the best evidence. | SOC L2 | Containment timestamp, memory image if capability exists |
| 2 · Scope the certificate | Extract the signature from the sample: subject, serial, issuer, timestamp. Compare against the burned-serial list. If the serial is new, you have found an unpublished stolen certificate — notify the issuing CA and the named organisation. | Threat intel | Get-AuthenticodeSignature output, sample hash |
| 3 · Scope the estate | Run playbook 2 fleet-wide. Run Q1 and Q4 across the full retention window, not just 7 days — the loader has been active since 2023. | Hunt team | Host list, first-seen timestamps per host |
| 4 · Persistence sweep | Check for: unexpected local admins, Winlogon autologon values, services with temp-path images, C:\Windows\*.bat watchdogs, a "Windos Defende" task, HKCU\offlinekey, %ProgramData%\microsoft.dotnet.common.log | IR | Registry exports, service list, task list, account audit |
| 5 · Credential response | Assume every browser-stored credential and session token on the host is compromised. Force password reset and session revocation for the user across SSO, mail, VPN, and any customer-support platform they can access. | IAM | Reset log, token-revocation confirmation |
| 6 · Egress review | Pull full connection history for the host: 5188/5198, the C2 domains, and any SOCKS-style relay pattern. The proxy plugin means this host may have been a pivot for others. | Network | Flow logs, proxy logs, DNS logs |
| 7 · Support-channel review | If the user is support/CX, pull every ticket and chat they handled in the 30 days before and after. Identify the delivery ticket and check whether the same requester touched other agents. | IR + Support lead | Ticket IDs, requester identity, attachment hashes |
| 8 · Rebuild | Reimage. Do not clean in place — the implant has an event-log wiper, a self-destruct routine, and can re-target its C2 live, so "no further beaconing" proves nothing. | IT ops | Rebuild ticket, restored-from-known-good confirmation |
| 9 · Notify | If any of your own code-signing certificates are implicated, notify your CA immediately and initiate revocation and re-key. If a customer-facing artifact was signed in the window, prepare customer comms. | Security leadership | CA case number, revocation confirmation, comms record |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1553.002 Code Signing | Known stolen-cert-signed samples | Q1 | — | GOOD |
| T1553.002 Code Signing | Unpublished stolen cert (signed + rare + user-writable path) | Q2 | — | PARTIAL |
| T1553.002 Code Signing | Signer subject / certificate serial match | — | — | GAP — Falcon does not publish signer CN or serial; covered only by Sysmon N2 / PowerShell N3 |
| T1566.002 / T1204.002 | Screenshot-lure executable from chat or archive | Q3 | Screenshot-lure, SCR-from-archive | GOOD |
| T1574.001 DLL Side-Loading | Named side-load DLL + .log blob | Q4 | Side-load DLL basename | GOOD |
| T1071.001 / T1090 | Plaintext WebSocket C2 on 5188/5198 | Q5 | WebSocket beacon | PARTIAL — port heuristic needs a tenant baseline |
| T1021.001 / T1136.001 / T1547 | RDP backdoor account + autologon | Q6 | Backdoor account, Winlogon write | GOOD |
| T1555.003 / T1056.001 | Browser credential sweep, keylogger, clipboard hijack | Q7 | — | PARTIAL — kill-then-read ordering not enforced in-query |
| T1113 Screen Capture | Screenshot plugin (command 0x1565) | — | — | GAP — in-process API activity, no distinct host artifact; rely on C2 detection |
| T1070.001 / T1070.004 | Event-log wipe, IE history purge, self-destruct | Q8 | — | GOOD |
| T1562.001 Impair Defenses | PPL abuse, signed-driver AV kill, WDAC policy drop | Q9 | ClipUp PPL, transient driver service | GOOD |
| T1543.003 Service Persistence | Random .BAT watchdog, service restart loop | Q10 | — | PARTIAL — random-name regex will miss non-alpha stems |
| T1548.002 UAC Bypass | ShellExecuteExA("runas") self-relaunch | — | — | GAP — no distinctive command line; detect via elevation-without-consent-prompt IOAs if available |
| T1195.003 Supply Chain | Certificate theft at the CA | — | — | GAP — not detectable from your endpoints; addressed by S12 hardening and the S10 audit checklist |
Validation. Coverage above is claimed only after the Section 11 gates pass: G1 proves AuthenticodeHashData is actually populated (without it Q2's "PARTIAL" is really a GAP), G3 proves Q2 is reviewable rather than a wall of installers, and G4–G6 prove Q3, Q5 and Q6 fire on real activity. Re-run G1 after any ingest or field-filtering change — the signature fields are the first thing a bandwidth-trimming exercise removes, and their loss is silent.
Hunt Summary Ticket
TITLE GoldenEyeDog / CylindricalCanine - stolen DigiCert EV code-signing certificate abuse
SEVERITY Critical (trust-chain compromise; active since April 2026, C2 live as of July 2026)
SCOPE All Windows endpoints. Priority: customer-support, CX, helpdesk and Web3/crypto
support staff; any host running publisher-based application allowlisting.
HYPOTHESIS A validly signed binary in our estate is malicious - signed with a certificate
obtained through the DigiCert support-portal compromise, or with the next one
the actor steals. Signature validity is an attribute, not a verdict.
QUERIES Q1 known stolen-cert-signed sample hashes (run first, zero-tolerance)
Q2 signed + rare + user-writable path (the generalising hunt)
Q3 screenshot-lure .com/.scr from chat or archive (the delivery artifact)
Q4 side-load DLL + encrypted .log blob
Q5 C2 domains and plaintext WebSocket 5188/5198
Q6 RDP backdoor: local admin + Winlogon autologon
Q7 browser credential sweep / keylog / clipboard config
Q8 anti-forensics: log wipe, ClearMyTracksByProcess, self-destruct
Q9 RONINGLOADER: ClipUp -ppl, driver services, TrustedInstaller injection
Q10 random-named .BAT watchdog + SOCKS relay
DO FIRST 1. Run Q1 across full retention. Any hit is an incident, not a tuning task.
2. Run gate G1 - if AuthenticodeHashData is empty, Q2 is blind. Fix ingest.
3. Block uu[.]goldeyeuu[.]io, wk[.]goldeyeuu[.]io, api[.]keensie[.]com and
qaqkongtiao[.]com at DNS and egress.
4. Run the S10 certificate-trust audit checklist even with zero endpoint hits.
FINDINGS (record hosts, users, sample hashes, and any NEW certificate serial observed)
GAPS - Falcon does not expose signer CN or certificate serial; the subject/serial
half of this hunt requires Sysmon EventID 1 or Get-AuthenticodeSignature.
- No certificate thumbprints were published by any source; serials only.
- Screenshot plugin and UAC-bypass command have no distinct host artifact.
- Certificate theft at the CA is not detectable from our endpoints at all.
ACTIONS - Replace publisher-name WDAC/AppLocker trust with certificate-specific trust.
- Enforce application control for support / CX staff.
- Block executable content in ticketing AND live-chat upload paths.
- Confirm CRL/OCSP reachability from every endpoint and build agent.
- Audit any internal "view as customer" impersonation feature for exposed secrets.
OWNER REPLACE_WITH_HUNT_OWNER
VERSION v0.1 - 2026-07-20
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.// TUNING: exclusion blocks to all four FP-medium hunts (Q2, Q5, Q7, Q10); Q7 and Q10 previously carried their false-positive discriminators only in prose.References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| PRIMARY | Expel — Introducing CylindricalCanine: the GoldenEyeDog subgroup responsible for the April DigiCert incident | Malware analysis, C2 infrastructure, plugin/dispatch tables, hardcoded keys, RDP-backdoor mechanics, Suricata coverage | 2026-07-20 |
| PRIMARY | Expel — Golden_Gh0st_IOCs.csv (expel-intel) | Per-sample hashes, signer organisations and certificate serials | 2026-07-20 |
| CORROBORATING | The Hacker News — GoldenEyeDog Subgroup Linked to DigiCert Breach and Code-Signing Certificate Theft | Incident timeline, revoked-CA list, certificate counts, Web3 support-chat campaign | 2026-07-20 |
| CORROBORATING | GBHackers — GoldenEyeDog Threat Group Behind DigiCert Code-Signing Certificate Attack | Independent confirmation of the intrusion path and SmartScreen-bypass motive | 2026-07-20 |
| PRIMARY | Elastic Security Labs — RONINGLOADER: DragonBreath's New Path to PPL Abuse | RONINGLOADER stages, service and registry artifacts, Defender/PPL abuse chain | 2026-07-20 |
| CORROBORATING | The Hacker News — Dragon Breath Uses RONINGLOADER to Disable Security Tools and Deploy Gh0st RAT | RONINGLOADER context and EDR-killer tooling | 2026-07-20 |
Every atomic indicator in this pack was traced back to one of the cited sources above at build time; nothing is included that a source does not state.
Generated 2026-07-20 · HuntPack pipeline (huntpack-agent-v2 → review-v2). Defensive content only.