OfferLoader | CL-CRI-1171 — Pay-Per-Install Malware Distribution Network
Executive Summary
CL-CRI-1171 is a pay-per-install (PPI) cybercrime distribution network that Unit 42 (Palo Alto Networks) has tracked for at least two years. The operator sells infection access to independent buyers, each of whom deploys their own payload through the same disposable, generic Inno Setup loader, which Unit 42 named OfferLoader after the offer_execution / offer_execution_fail / offer_exists variable names found in its C2 traffic. Victims are funneled in through two channels: SEO-poisoned search results promoting trojanized versions of legitimate utilities (WinDirStat, Bluetooth drivers), and at least 11 YouTube gaming-optimization channels with hundreds of thousands of subscribers. Unit 42 has identified more than 10,000 distinct loader samples and over 200 rotating two-word-compound C2 domains across the .xyz, .cfd, .space, and .info TLDs.
Once installed, OfferLoader beacons for an install verdict and then spawns three child processes, eld0.exe, eld1.exe, and eld2.exe, each an independent malware campaign with its own C2 and objective. The April 2026 intrusion set Unit 42 documented in depth delivered three payloads: Insomnia RAT (a dual Node.js/Python cross-platform backdoor, user-agent insomnia/2023.4.0 Windows), ARKTunnel (a previously undocumented WebSocket tunneling RAT extracted from a bitmap image via LSB steganography), and Docro Hijacker (a Chrome browser hijacker that forges valid HMAC signatures to bypass Chrome's Secure Preferences integrity check and sideload a search-hijacking extension). A separate June 2026 intrusion delivered two different payloads (GCleaner, Socks5Systemz) through the same loader, confirming the payload slots are interchangeable and not fixed to this campaign's three headline families.
Defender priority: the distinctive, low-noise signal in this pack is the eld0.exe/eld1.exe/eld2.exe child-process fan-out and the exact hashes of the documented samples (Q1, Q3). The rotating two-word-compound domain infrastructure (>200 hostnames observed, expected to keep rotating) is inherently high-false-positive as a standalone signal and is shipped as a low-priority triage feed only (Q10), never a block list. The in-memory BMP steganographic extraction and the in-browser SERP script injection are both invisible to endpoint telemetry by design; see Section 15 for the honest coverage picture.
Source Review & Web Hunter Notes
Four sources were fetched and saved verbatim as plain-text snapshots before any content in this pack was written. No fetched source contained text directed at an automated reader (no instructions to change tooling, fetch further URLs, skip steps, or claim prior authorization); all four were treated strictly as data to analyze, per standing security policy.
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| Tier 1 — primary investigation | Unit 42 (Palo Alto Networks), Rem Dudas, 2026-09-09 | Full technical breakdown: OfferLoader chain, all three payload families, every hash and domain in this pack's IOC table, the >200-domain rotational infrastructure appendix, YouTube channel list | Yes |
| Tier 2 — security press, corroborating | Cyber Security News (Tushar Subhra Dutta), 2026-09-14 | Independently republishes 5 of the same hashes and 4 of the same domains (stryper.info, crowdstri.com, reg.pcsdkflyer.ca, mqsearch.com), citing Unit 42 as its source | Context only |
| Tier 2 — security press, corroborating | GBHackers on Security (Mayura Kathir), 2026-09-11 | Independently republishes the windirstat.exe hash and campaign overview, citing Unit 42 as its source | Context only |
| Tier 3 — historical technique precedent | Malwarebytes Labs (Joshua Cannell), 2015-05-13 | Describes the original 2015 "WinYahoo" PUP technique for forging Chrome Secure Preferences MACs, cited by Unit 42 as the technique Docro Hijacker revives; unrelated indicators (WinYahoo's own md5/domain) are NOT shipped in this pack | Context only, no atomics |
Provenance decisions
- Every atomic indicator in this pack traces to a single underlying investigation. The two press write-ups (Cyber Security News, GBHackers) both explicitly cite Unit 42 as their source rather than presenting independent research; they are treated as re-publication of the same investigation, not a second independent source. Per standing policy that action=prevent or critical severity requires two independent sources, every hash and domain in this pack ships at action=detect or action=hunt, severity high or medium — never prevent, never critical.
- All 16 file hashes and 15 domains in the IOC Appendix (Section 10) were verified present in the saved Unit 42 snapshot (
01-unit42-cl-cri-1171.txt) before being included; nothing was invented or carried over from an unrelated cluster. - Unit 42's sanitized victim-IP examples (e.g.
5.xxx.xx.xxx) are illustrative fragments, not real addresses, and are not shippable IOCs; no IPv4/IPv6 indicator appears in this pack. - The three "gate/landing" domains carried into the CSV (
bubbleslip.xyz,churchpail.xyz,dinosaursjam.cfd) are Unit 42's own worked examples of the >200-domain rotation pattern, shipped at low confidence/short expiry explicitly labeled illustrative — they are pattern samples, not a live blocklist, since the full rotation is expected to have moved on by the time this pack is read. - The Malwarebytes 2015 article is cited only for the Secure-Preferences-tampering technique lineage; none of its own indicators (unrelated to CL-CRI-1171) are shipped here.
Hunt Brief & Attack Chain
Hunt hypotheses
- H1 (high confidence). Any host spawning processes named
eld0.exe,eld1.exe, oreld2.exehas run the OfferLoader chain; the naming is unique to this loader family. MITRE T1204.002/T1027. Telemetry:ProcessRollup2. FP: low. → Q1. - H2 (medium confidence). A trojanized installer masquerading as
windirstat.exeor a Bluetooth-driver installer, executing from a Downloads/Temp path, precedes the eld0-2 fan-out. MITRE T1204.002/T1036.005. Telemetry:ProcessRollup2. FP: medium (legitimate installers also run from these paths). → Q2. - H3 (high confidence). Exact-hash matches against the 16 published samples confirm this specific, already-analyzed campaign wave. MITRE T1204.002. Telemetry:
ProcessRollup2(SHA256HashData). FP: low. → Q3. - H4 (high confidence). Insomnia RAT's installer disables Defender and excludes the entire C:\ drive before deploying its Node.js/Python agents — a distinctive, rarely-legitimate command-line pattern. MITRE T1562.001. Telemetry:
ProcessRollup2(CommandLine). FP: medium. → Q4. - H5 (high confidence). Insomnia RAT persists via two masquerading scheduled tasks with non-Microsoft naming under Microsoft-owned task paths. MITRE T1053.005. Telemetry:
ScheduledTaskRegistered. FP: low. → Q5. - H6 (medium confidence). Node.js is hidden from Add/Remove Programs via a SystemComponent=1 registry write, correlating with the Insomnia install chain. MITRE T1112. Telemetry:
RegGenericValueUpdate. FP: medium. → Q6. - H7 (high confidence). ARKTunnel's dropped ZIP (
procorTrex.zip), executable (wscl.exe), and Windows service (wscl-13/msvcsrvc) are all distinctively named and not used by legitimate software. MITRE T1027.003/T1543.003. Telemetry:ZipFileWritten,NewExecutableWritten,CreateService. FP: low. → Q7. - H8 (medium confidence). Docro Hijacker's Chrome Secure Preferences tamper and
docroextension drop underC:\ProgramData\DocsHelper\are visible as file-write events even though the HMAC-bypass logic itself is not. MITRE T1176/T1112. Telemetry:CriticalFileModified,NewExecutableWritten. FP: medium. → Q8. - H9 (high confidence). DNS resolution to any of the 10 confirmed second-stage/C2 domains is a strong, campaign-specific signal, including the
crowdstri.comCrowdStrike typosquat. MITRE T1071.001/T1583.001. Telemetry:DnsRequest. FP: low. → Q9. - H10 (low confidence, explicit triage-only). The two-word-compound domain naming shape (six-to-eighteen lowercase letters, no digits or hyphens, over .xyz/.cfd/.space/.info) can be pattern-matched, but the shape alone is common to a lot of benign and parked domains. MITRE T1583.001. Telemetry:
DnsRequest. FP: high. → Q10. - H11 (medium confidence). Insomnia RAT's C2 traffic carries the literal HTTP User-Agent
insomnia/2023.4.0 Windows, visible only in ingested web-proxy/NGSIEM logs, not native EDR telemetry. MITRE T1071.001/T1036.005. Telemetry: NGSIEM proxy log fields. FP: low, but shares its UA with the legitimate Insomnia REST client. → Q11.
Two attack-chain steps have no mappable Falcon telemetry and are carried forward as explicit gaps rather than silently dropped: the in-memory LSB steganographic extraction of ARKTunnel's payload from a BMP resource, and the in-browser SERP script injection Docro Hijacker uses to monetize search results. Both are addressed in Section 15.
Attack chain
| # | Step | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | User searches for a legitimate utility (WinDirStat, Bluetooth driver) and lands on an SEO-poisoned result, or watches a gaming-optimization YouTube video and clicks a description link to a Blogspot intermediary | None (pre-execution, web/DNS layer) | Section 12 hardening |
| 2 | Victim downloads a ZIP archive (often bundled with a legitimate WinRAR copy renamed to .store) and runs the trojanized Inno Setup installer (e.g. windirstat.exe) from Downloads/Temp | ProcessRollup2, ZipFileWritten, NewExecutableWritten | Q2, Q3 |
| 3 | Compiled Pascal [Code] section in the installer unpacks a .tmp stage, which beacons to a gate/tracker domain (e.g. voyagemist.space) for an "ok"/"no" verdict | ProcessRollup2, DnsRequest | Q3, Q9 |
| 4 | On "ok", the loader spawns three children — eld0.exe, eld1.exe, eld2.exe — each an independent malware campaign with affiliate-tracking command-line parameters | ProcessRollup2 (parent-child) | Q1 (core signature) |
| 5a | eld0.exe drops a.dll, spawns hidden PowerShell running t.ps1: disables Defender, excludes C:\, installs Python + Node.js, hides Node.js via SystemComponent=1, deploys a Node.js agent (aa.js from stryper.info) and a Python agent (from aa.amazingshield.xyz); persistence via "Maps Performance Task" / "OOBETaskScheduler"; C2 uses UA insomnia/2023.4.0 Windows, POST /d and /e; the Python variant's C2 is the crowdstri.com typosquat | ProcessRollup2, ScheduledTaskRegistered, RegGenericValueUpdate, DnsRequest | Q4, Q5, Q6, Q9, Q11 |
| 5b | eld1.exe extracts a ZIP from an embedded BMP resource via LSB steganography (in-memory, no read of a source image file on disk), drops wscl.exe to C:\Users\Public\procorTrex.zip, installs it as service wscl-13/msvcsrvc; C2 (reg.pcsdkflyer.ca) decoded from a 39-byte Base64+XOR blob | ZipFileWritten, NewExecutableWritten, CreateService, DnsRequest | Q7, Q9; GAP — in-memory LSB decode |
| 5c | eld2.exe unpacks eld2.tmp, which drops Adblock.dll; the DLL extracts Chrome's HMAC key from resources.pak, recomputes valid MACs, and rewrites Chrome's Secure Preferences to set the default search provider to mqsearch.com and sideload the docro Manifest V3 extension at C:\ProgramData\DocsHelper\docro\ | File-write telemetry on Secure Preferences and the DocsHelper path | Q8, Q9 |
| 6 | The docro extension calls vendralo.info for a per-victim UUID and hourly rewrite rules, injects a script from drelto.info/farlix into Google SERPs across 190+ country-code domains to hijack/monetize search results; install telemetry reports to finersto.com/extentrack.com | DnsRequest, browser-scoped network | Q9; GAP — in-browser script injection content |
Consolidated IOC Table
Every row below traces to the primary Unit 42 investigation (Section 2). Because that investigation is the sole underlying source for every atomic indicator in this pack, no row ships at action=prevent or severity=critical, regardless of how corroborated its republication in secondary press was — per standing two-source policy. Action follows the pack's standard vocabulary (detect = alert/import as IOC, hunt = investigate, enrich = context only).
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| SHA-256 | 7f792c45de1e28fd42ac44c9444f157a2161742d130bac336c0e991aabbb112c | High (2 sources cite) | detect | Trojanized windirstat.exe, Inno Setup 6.7.1, initial access | 2026-12-25 |
| SHA-256 | fc485882626512e7ff82a1d7cd8e8fb3e9751b026d97e682d6908aefff1f2d73 | Medium (single-source) | hunt | windirstat.tmp, unpacked stage | 2026-11-10 |
| SHA-256 | 3052bd320a34e12ee694811ed0578797477dfd480c664491e509ed15ce1a6961 | High (2 sources cite) | detect | eld0.exe, Insomnia RAT initial loader (Inno Setup 6.3.0 SetupLdr) | 2026-12-25 |
| SHA-256 | 25558ea78c4aa0fdd0f45fafcaa546d3115dc5806809d144a5801a40e48fd4c5 | Medium (single-source) | hunt | eld0.tmp, unpacked loader stage | 2026-11-10 |
| SHA-256 | 9b0d9cbc0fd4a7bae8b78a15dfbe63052779414ad725845732c4a0083008da69 | Medium (single-source) | detect | a.dll, executes the PowerShell downloader for Node.js/Python stages | 2026-12-25 |
| SHA-256 | ceb30a5eb9ad9d9c6712c80726df16f96f99d9fc0753be241b00b4d636eb576e | Medium (single-source) | detect | t.ps1, Insomnia RAT PowerShell installer (disables Defender, excludes C:\) | 2026-12-25 |
| SHA-256 | cf184d04ca31fb2b6b7efd85399c29c1136b539153e137ceb3877b1b905791de | Medium (single-source) | detect | GUID-named Python component of the Insomnia dual payload (filename randomized per build; do not filter on a literal filename) | 2026-12-25 |
| SHA-256 | 62d49d0c78207ec2452cc8a30501db771c9edbae89889e41a7dd227551243e8e | Medium (single-source) | detect | aa.js, Node.js component of the Insomnia dual payload | 2026-12-25 |
| SHA-256 | aaebc8c07de485be6d1bfa956668c5e18aa1ff5588dfe84672e20ae90b4560f1 | High (2 sources cite) | detect | eld1.exe, ARKTunnel LSB-steganography dropper | 2026-12-25 |
| SHA-256 | e05bc22afbc5ddd50b49c85ee169dd13318000d38286de2b8bcff98217256a8d | Medium (single-source) | hunt | procorTrex.zip, carved from eld1.exe's BMP steganography payload; dropped at C:\Users\Public\ | 2026-11-10 |
| SHA-256 | b367762140ae7f5098230b8a5da738c9241f286281ec9439dd6ca581fc87989c | High (2 sources cite) | detect | wscl.exe, ARKTunnel WebSocket tunneling RAT | 2026-12-25 |
| SHA-256 | d8d783f8e050a6e394f3c0aa5e2bc73a38d822e55fbc39c0648cbff566de3cdf | Medium (single-source) | hunt | Resource icon shared across ARKTunnel samples; not computed by default sensor telemetry, useful for retro-hunting via IOC search only | 2026-11-10 |
| SHA-256 | 06e0afd01bbc6c9d5dc16c3165089b233dc071e1f251abd06235d1b9166cdac5 | Medium (single-source) | hunt | Second resource icon shared across ARKTunnel samples | 2026-11-10 |
| SHA-256 | 2c6e11027b011042c9a118fc20728f8f4ebb6be8795cc84cc9a45622c297d354 | High (2 sources cite) | detect | eld2.exe, Docro Hijacker installer (drops Adblock.dll + docro extension) | 2026-12-25 |
| SHA-256 | 553ce594c9c6afdd4794fddc28c194e3bc3c1b052310e5099c58ac15bab72104 | Medium (single-source) | hunt | eld2.tmp, unpacked stage | 2026-11-10 |
| SHA-256 | fdcc95b7791c0d6590dcf1a412dc9fcc92ad2095818d1b78368b31efad012007 | Medium (single-source) | detect | Adblock.dll, Chrome Secure Preferences HMAC-bypass DLL at %TEMP% | 2026-12-25 |
| Domain | stryper[.]info | High (2 sources) | detect | Insomnia RAT Node.js agent host (serves aa.js, POST /d /e) | 2026-12-25 |
| Domain | aa[.]amazingshield[.]xyz | Medium (single-source) | detect | Insomnia RAT Python agent host | 2026-12-25 |
| Domain | crowdstri[.]com | High (2 sources) | detect | CrowdStrike-typosquat C2 for the Insomnia RAT Python agent | 2026-12-25 |
| Domain | reg[.]pcsdkflyer[.]ca | High (2 sources) | detect | ARKTunnel (wscl.exe) WebSocket C2 | 2026-12-25 |
| Domain | vendralo[.]info | Medium (single-source) | detect | Docro Hijacker: per-victim UUID and hourly rewrite-rule delivery | 2026-12-25 |
| Domain | finersto[.]com | Medium (single-source) | hunt | Docro Hijacker: extension install/start telemetry | 2026-11-10 |
| Domain | drelto[.]info | Medium (single-source) | detect | Docro Hijacker: SERP-injection script host (/farlix) | 2026-12-25 |
| Domain | mqsearch[.]com | High (2 sources) | detect | Docro Hijacker: hijacked default search provider endpoint | 2026-12-25 |
| Domain | extentrack[.]com | Medium (single-source) | hunt | Docro Hijacker: install-success/failure callback (also contacted by eld2.tmp) | 2026-11-10 |
| Domain | voyagemist[.]space | Medium (single-source) | hunt | OfferLoader initial tracking beacon / install-verdict gate (observed in both documented intrusion sets) | 2026-11-10 |
| Domain | noiseship[.]cfd | Medium (single-source) | hunt | SEO-poison lure domain, registered 39 days before observed use — perishable | 2026-10-10 |
| Domain | atthelake[.]info | Medium (single-source) | hunt | Top referring SEO-poison domain — perishable | 2026-10-10 |
| Domain (illustrative) | bubbleslip[.]xyz | Low (pattern example) | hunt | Worked example of the >200-domain two-word-compound rotation; NOT a live blocklist entry, expect rotation | 2026-10-10 |
| Domain (illustrative) | churchpail[.]xyz | Low (pattern example) | hunt | Worked example of the rotation pattern; expect rotation | 2026-10-10 |
| Domain (illustrative) | dinosaursjam[.]cfd | Low (pattern example) | hunt | Worked example of the rotation pattern; expect rotation | 2026-10-10 |
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Managed Windows endpoints (any user who can download and run software) | ProcessRollup2, DnsRequest, ZipFileWritten, NewExecutableWritten, CreateService, ScheduledTaskRegistered, RegGenericValueUpdate (default sensor policy covers all of these) | High | The compiled Pascal [Code] section inside the Inno Setup installer, and the in-memory BMP LSB extraction, are both opaque to file/process telemetry until they write a resulting artifact to disk |
| Chrome/Chromium browser processes on managed endpoints | File-write telemetry on Secure Preferences and C:\ProgramData\DocsHelper\; Falcon has no native browser-extension-inventory event type | High | RTR spot-checks are point-in-time, not continuous; the SERP-injection script itself runs inside the browser's TLS session and is not visible to EDR |
| Perimeter DNS / secure web gateway | DNS/SWG logs (non-Falcon: Umbrella, Zscaler, firewall) | Medium | Requires separate tooling and manual correlation with EDR hits; the only layer that can confirm URL paths (e.g. /api/v1/proxies-style config endpoints) actually fired |
| Web-proxy / NGSIEM-ingested HTTP logs | Parser-dependent http_user_agent/url fields (see Q11) | Medium | Only source that can see the insomnia/2023.4.0 Windows User-Agent string; not available unless a proxy/SWG log source is already ingested into NG-SIEM |
ATT&CK Mapping
| Tactic | Technique ID | Technique name | Observed behavior |
|---|---|---|---|
| Initial Access / Execution | T1204.002 | User Execution: Malicious File | Victim downloads and runs a trojanized Inno Setup installer masquerading as WinDirStat or a Bluetooth driver |
| Defense Evasion | T1036.005 | Masquerading: Match Legitimate Name or Location | windirstat.exe / Bluetooth Driver for Windows 10.exe naming; Insomnia RAT's disguised User-Agent string |
| Defense Evasion | T1027 | Obfuscated Files or Information | All malicious logic hidden inside the Inno Setup compiled Pascal [Code] section; no embedded application files |
| Defense Evasion | T1027.003 | Steganography | ARKTunnel's payload archive (procorTrex.zip) extracted from a BMP image resource via LSB steganography |
| Defense Evasion | T1140 | Deobfuscate/Decode Files or Information | ARKTunnel's C2 address decoded from a 39-byte config blob via Base64 + XOR |
| Persistence | T1053.005 | Scheduled Task | "Maps Performance Task" and "OOBETaskScheduler" masquerading scheduled tasks for Insomnia RAT |
| Persistence | T1543.003 | Create or Modify System Process: Windows Service | ARKTunnel installed as a delayed-autostart Windows service (wscl-13 / msvcsrvc) |
| Persistence | T1176 | Browser Extensions | Docro Hijacker sideloads a Manifest V3 Chrome extension at C:\ProgramData\DocsHelper\docro\ |
| Defense Evasion | T1562.001 | Impair Defenses: Disable or Modify Tools | t.ps1 disables Windows Defender, excludes the entire C:\ drive, and suppresses security notifications |
| Defense Evasion | T1112 | Modify Registry | Node.js hidden from Add/Remove Programs via SystemComponent=1; Chrome Secure Preferences MAC values recomputed and rewritten |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | HTTPS POST to /d (tasking) and /e (error reporting) using the insomnia/2023.4.0 Windows User-Agent; ARKTunnel's WebSocket tunnel |
| Command and Control | T1105 | Ingress Tool Transfer | t.ps1 downloads and installs Python and Node.js runtimes plus the aa.js/Python agents from attacker infrastructure |
| Resource Development | T1583.001 | Acquire Infrastructure: Domains | Over 200 rotating two-word-compound C2/gate domains across .xyz/.cfd/.space/.info registered by the operator |
Native Audit-Log Hunts
These checks require no CQL and directly cover the extension-governance and dropped-artifact gaps noted in Section 15.
RTR one-time fleet sweep (read-only, point-in-time)
Run via Falcon Real Time Response across the fleet to confirm on-disk/service/task presence. See the Fleet Audit Commands quick-copy block in Section 10 for the exact commands (ARKTunnel service check, scheduled-task check, docro extension path check, Secure Preferences modification time check).
Chrome / Edge (Chromium) — managed browser extension inventory
- Google Admin console → Chrome browser cloud management → Apps & extensions → Users & Browsers report — the sideloaded
docroextension has no fixed Chrome Web Store ID (it is sideloaded from disk, not installed from the store), so hunt by installed-extension name/path rather than a store ID. - Microsoft Intune / Edge Business inventory — same approach if Edge extension reporting is configured.
Windows Service Control Manager
sc query wscl-13/sc query msvcsrvcacross the fleet (or the RTR batch equivalent in Section 10) to find ARKTunnel's installed service before or after a Q7 network hit.
Task Scheduler operational log
- Enable
Microsoft-Windows-TaskScheduler/Operational(disabled by default on most builds) and alert on new task registrations under\Microsoft\Windows\Maps\or\Microsoft\Windows\Servicing\that do not match your organization's known-good task baseline — see Playbook 4 in Section 13.
Perimeter DNS / secure web gateway logs
Query Umbrella / Zscaler / firewall logs for the domains in Section 4. Unlike Falcon, a web gateway typically logs the full request path, which is the only way to confirm the Docro extension's /extensionInstaller/updateChromeExtension and similar config-endpoint paths actually fired.
CrowdStrike LogScale CQL Hunt Queries
Looks for: any process named eld0/eld1/eld2 — OfferLoader's distinctive three-way payload fan-out. The single strongest, lowest-noise signal in this pack.
// HUNT: OfferLoader distinctive child-process chain (eld0/eld1/eld2) // MITRE: T1204.002, T1027 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 telemetry (default sensor policy) // FALSE POSITIVES: none expected -- eld0/eld1/eld2 basenames are not used by any known legitimate software #event_simpleName=ProcessRollup2 | FileName=/^eld[0-2](\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, FileName, ParentBaseFileName, CommandLine, SHA256HashData]) | sort(@timestamp, order=desc)
Looks for: the two documented lure filenames launching from a user Downloads/Temp path, matching Unit 42's two intrusion sets. FP: this is a triage feed, not a standalone alert — pivot into Q1/Q3 hits before acting.
// HUNT: Candidate trojanized installer executing from a user Downloads/Temp path // MITRE: T1204.002, T1036.005 // CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2 telemetry // FALSE POSITIVES: legitimate software is routinely installed from Downloads/Temp; this is a triage feed, not a standalone alert -- pivot into Q1/Q3 hits before acting // TUNING: exclude known-good deployment tooling (SCCM/Intune/ConnectWise/AnyDesk installers) and signed vendor installers your fleet regularly runs from these paths #event_simpleName=ProcessRollup2 | FileName=/^(windirstat|bluetooth driver for windows 10)\.exe$/i | FilePath=/\\(Downloads|AppData\\Local\\Temp)\\/i | table([@timestamp, aid, ComputerName, UserName, FileName, FilePath, ParentBaseFileName, SHA256HashData]) | sort(@timestamp, order=desc)
Looks for: the 10 file-execution-relevant hashes from Unit 42's IOC table (installer, loader stages, and payload droppers). Will only ever catch these specific, already-published samples.
// HUNT: Exact SHA256 match against confirmed CL-CRI-1171 samples (Unit 42, 2026-09-09) // MITRE: T1204.002, T1027 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 telemetry; SHA256HashData is populated when Falcon has computed or received a hash for the binary // FALSE POSITIVES: none -- exact hash match; will only ever catch these specific, already-published samples #event_simpleName=ProcessRollup2 | in(SHA256HashData, values=["7f792c45de1e28fd42ac44c9444f157a2161742d130bac336c0e991aabbb112c","fc485882626512e7ff82a1d7cd8e8fb3e9751b026d97e682d6908aefff1f2d73","3052bd320a34e12ee694811ed0578797477dfd480c664491e509ed15ce1a6961","25558ea78c4aa0fdd0f45fafcaa546d3115dc5806809d144a5801a40e48fd4c5","9b0d9cbc0fd4a7bae8b78a15dfbe63052779414ad725845732c4a0083008da69","aaebc8c07de485be6d1bfa956668c5e18aa1ff5588dfe84672e20ae90b4560f1","b367762140ae7f5098230b8a5da738c9241f286281ec9439dd6ca581fc87989c","2c6e11027b011042c9a118fc20728f8f4ebb6be8795cc84cc9a45622c297d354","553ce594c9c6afdd4794fddc28c194e3bc3c1b052310e5099c58ac15bab72104","fdcc95b7791c0d6590dcf1a412dc9fcc92ad2095818d1b78368b31efad012007"]) | table([@timestamp, aid, ComputerName, UserName, FileName, SHA256HashData, ParentBaseFileName]) | sort(@timestamp, order=desc)
Looks for: t.ps1's signature move — excluding the entire C:\ drive from Defender via PowerShell. FP: rare legitimate backup/migration tooling does this too; confirm against change-management records.
// HUNT: PowerShell disabling Defender and excluding the entire C: drive (Insomnia RAT t.ps1 behavior) // MITRE: T1562.001, T1059.001 // CONF: high FP: medium COST: low // REQUIRES: ProcessRollup2 with CommandLine visibility // FALSE POSITIVES: some legitimate backup/AV-migration tooling adds broad exclusions; rare enough in most fleets to warrant investigation, but confirm against change-management records before treating as confirmed compromise // TUNING: exclude known internal deployment/migration scripts by their signed publisher or a documented ticket-referenced CommandLine pattern #event_simpleName=ProcessRollup2 | FileName=/^powershell(\.exe)?$/i | CommandLine=/Add-MpPreference/i | CommandLine=/-ExclusionPath\s+["']?C:\\\\/i | table([@timestamp, aid, ComputerName, UserName, CommandLine, ParentBaseFileName]) | sort(@timestamp, order=desc)
Looks for: the two scheduled-task names Unit 42 documented, registered under Microsoft's own task paths to blend in.
// HUNT: Insomnia RAT masquerading persistence tasks // MITRE: T1053.005 // CONF: high FP: low COST: low // REQUIRES: ScheduledTaskRegistered telemetry // FALSE POSITIVES: none expected -- "Maps Performance Task" and "OOBETaskScheduler" are not genuine Microsoft task names #event_simpleName=ScheduledTaskRegistered | TaskName=/^(Maps Performance Task|OOBETaskScheduler)$/i | table([@timestamp, aid, ComputerName, UserName, TaskName, TaskExecutable]) | sort(@timestamp, order=desc)
Looks for: t.ps1 setting SystemComponent=1 on a Node.js Uninstall registry key to hide it from Add/Remove Programs. FP: some legitimate silent enterprise deployments do this too.
// HUNT: Node.js/Python runtime silently deployed and hidden from Add/Remove Programs (Insomnia RAT setup) // MITRE: T1112, T1027 // CONF: medium FP: medium COST: low // REQUIRES: RegGenericValueUpdate telemetry; DWORD value representation for RegStringValue is tenant/sensor-version dependent -- ⚠ validate in tenant // FALSE POSITIVES: legitimate silent Node.js/Python enterprise deployments occasionally set SystemComponent=1 too; corroborate with Q1/Q3/Q5 hits before treating as malicious // TUNING: scope to hosts that also show a Q1 (eld0-2) or Q5 (scheduled task) hit in the same session before alerting #event_simpleName=RegGenericValueUpdate | RegObjectName=/\\Uninstall\\/i | RegValueName=/^SystemComponent$/i | RegStringValue=/^1$/ | table([@timestamp, aid, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue]) | sort(@timestamp, order=desc)
Looks for: the resulting on-disk artifacts and service install once ARKTunnel's in-memory steganographic extraction completes. Gap: the LSB decode itself is invisible; see Section 15.
// HUNT: ARKTunnel dropped-artifact and service-install signature // MITRE: T1027.003, T1543.003, T1140 // CONF: high FP: low COST: low // REQUIRES: ZipFileWritten, NewExecutableWritten, CreateService telemetry // FALSE POSITIVES: none expected -- ServiceName wscl-13/msvcsrvc and the procorTrex.zip filename are not used by legitimate software. GAP: the in-memory BMP LSB steganographic extraction itself is not visible to any of these events (see Section 15) #event_simpleName=/^(ZipFileWritten|NewExecutableWritten|CreateService)$/ | TargetFileName=/^procorTrex\.zip$/i or FileName=/^wscl\.exe$/i or ServiceName=/^(wscl-13|msvcsrvc)$/i | table([@timestamp, aid, ComputerName, UserName, TargetFileName, TargetDirectoryName, FileName, ServiceName, ServiceImagePath]) | sort(@timestamp, order=desc)
Looks for: Chrome's Secure Preferences file being modified alongside Adblock.dll / docro extension artifacts. FP: some legitimate Chrome management tooling also touches Secure Preferences.
// HUNT: Chrome Secure Preferences tamper and docro extension sideload (Docro Hijacker) // MITRE: T1176, T1112 // CONF: medium FP: medium COST: low // REQUIRES: CriticalFileModified (or your tenant's file-integrity-monitoring event) + NewExecutableWritten telemetry; Falcon has no native browser-extension-inventory event type (see Section 15) // FALSE POSITIVES: some legitimate Chrome management/kiosk tooling also modifies Secure Preferences; corroborate with the ProgramData\DocsHelper path or a Q1/Q3 hit on the same host before treating as malicious // TUNING: exclude known enterprise browser-management agents (e.g. Chrome Browser Cloud Management sync writes) that touch Secure Preferences on a known schedule #event_simpleName=/^(CriticalFileModified|NewExecutableWritten)$/ | TargetFileName=/^Secure Preferences$/i or TargetFileName=/^Adblock\.dll$/i or TargetDirectoryName=/\\ProgramData\\DocsHelper\\docro/i | table([@timestamp, aid, ComputerName, UserName, TargetFileName, TargetDirectoryName]) | sort(@timestamp, order=desc)
Looks for: any endpoint resolving the 10 confirmed second-stage/C2 domains spanning all three payload families, including the crowdstri.com typosquat.
// HUNT: DNS resolution to confirmed CL-CRI-1171 second-stage / C2 infrastructure // MITRE: T1071.001, T1583.001 // CONF: high FP: low COST: low // REQUIRES: DnsRequest telemetry // FALSE POSITIVES: none expected -- domains are unique to this campaign per Unit 42 (2026-09-09); crowdstri.com is a typosquat of the CrowdStrike brand and should never appear in legitimate traffic #event_simpleName=DnsRequest | DomainName=/^(stryper\.info|aa\.amazingshield\.xyz|crowdstri\.com|reg\.pcsdkflyer\.ca|vendralo\.info|drelto\.info|mqsearch\.com|finersto\.com|extentrack\.com|voyagemist\.space)$/i | table([@timestamp, aid, ComputerName, UserName, DomainName, ContextProcessId_decimal]) | sort(@timestamp, order=desc)
Looks for: the naming shape Unit 42 documented for >200 rotating gate domains. This is deliberately a low-priority triage feed, never a block source — see the TUNING note.
// HUNT: Rotational two-word-compound gate/landing domain pattern (CL-CRI-1171 infrastructure convention) // MITRE: T1583.001, T1071.001 // CONF: low FP: high COST: medium // REQUIRES: DnsRequest telemetry // FALSE POSITIVES: HIGH -- this regex matches the *shape* of Unit 42's >200 reported hostnames (two dictionary words concatenated, no hyphen, over .xyz/.cfd/.space/.info), not a confirmed-malicious list; ordinary marketing/dropcatch/parked domains follow the same shape constantly. Treat hits as a LOW-priority triage feed only, never an auto-block source. // TUNING: cross-reference any hit against the Section 4 IOC table and require a second signal (a Q1/Q3/Q9 hit on the same host within 24h) before investigating; exclude your own DNS security vendor's sinkhole/parking responses // LOOKBACK: 7d #event_simpleName=DnsRequest | DomainName=/^[a-z]{6,18}\.(xyz|cfd|space|info)$/i | !in(DomainName, values=["stryper.info","aa.amazingshield.xyz","crowdstri.com","vendralo.info","drelto.info","mqsearch.com","finersto.com","extentrack.com"]) | groupBy([aid, ComputerName, DomainName], function=[count(as=Hits), min(@timestamp, as=FirstSeen)], limit=1000) | sort(Hits, order=desc)
Looks for: the disguised C2 User-Agent string, via NG-SIEM-ingested proxy/firewall logs only — Falcon's endpoint sensor does not decode HTTP headers inside TLS traffic for arbitrary processes.
// HUNT: Insomnia RAT C2 User-Agent via ingested web-proxy/NGSIEM logs (NOT native Falcon EDR sensor telemetry) // MITRE: T1071.001, T1036.005 // CONF: medium FP: low COST: medium // REQUIRES: NG-SIEM ingestion of a web proxy / firewall / SWG log source that captures the HTTP User-Agent header. ⚠ validate in tenant: repo name, parser, and field names below (#repo, http_user_agent, url) are illustrative and depend entirely on your ingested log source's parser. // FALSE POSITIVES: low if the field is populated correctly -- the literal string "insomnia/2023.4.0 Windows" is also the default user-agent of the legitimate Insomnia API-testing desktop client; confirm the destination host is NOT a developer workstation calling a legitimate API before treating as malicious #repo=ngsiem-web-proxy | http_user_agent="insomnia/2023.4.0 Windows" | groupBy([src_ip, url], function=[count(as=Hits), min(@timestamp, as=FirstSeen)], limit=1000) | sort(Hits, order=desc)
CrowdStrike Custom IOA Recommendations
Honesty note: the highest-confidence signal in this pack (Q1, the eld0/eld1/eld2 child-process chain) is exactly the kind of narrow, distinctive process-naming pattern a Falcon Custom IOA is built for. The domain-pattern hunt (Q10) is the opposite case — too broad and too high-FP for a Custom IOA, and belongs only as an investigate-only Scheduled Search at most.
| Control | Mechanism | Patterns / scope | Deployment path |
|---|---|---|---|
| Custom IOA — process | Falcon Custom IOA rule | FileName matches ^eld[0-2](\.exe)?$ — action: detect (promote to prevent only after your own tenant validation, per Section 2's single-source cap) | Falcon console → Custom IOA rule groups → new File Creation/Process rule |
| Custom IOC — hash | Falcon IOC Management | The 16 SHA-256 hashes in Section 10's CSV — action: detect (high-confidence rows) or hunt (medium-confidence rows) | IOC Management → Add indicator → type: sha256 |
| Custom IOC — domain | Falcon IOC Management | The 10 confirmed C2/second-stage domains — action: detect | IOC Management → Add indicator → type: domain; see Section 10 CSV block |
| Scheduled Search | NG-SIEM Scheduled Search | Q1 (child-process chain), Q3 (hash match), Q5 (scheduled tasks), Q9 (C2 domains) — all CONF high / FP low | Promote directly; these four are the IOA/Scheduled-Search candidates |
| Investigate-only | Ad hoc hunt query | Q2, Q4, Q6, Q7, Q8, Q11 — medium-confidence or context-dependent, needing periodic re-validation | Run manually on the cadence in Section 11; do not auto-promote |
| Triage-only (never promote) | Ad hoc hunt query | Q10 — explicitly high-FP pattern hunt | Manual review only, cross-referenced against a Q1/Q3/Q9 hit; never a Scheduled Search or IOA |
Machine-Readable IOC Appendix
The Falcon IOC Management CSV below is the only block whose atomic indicators are mechanically traced to the saved source snapshots. The other blocks are practical quick-copy references (operator/protocol details, named tooling, and fleet audit commands) that are not Falcon-importable IOC types.
type,value,action,severity,expiration,description,tags sha256,7f792c45de1e28fd42ac44c9444f157a2161742d130bac336c0e991aabbb112c,detect,high,2026-12-25,Trojanized windirstat.exe Inno Setup 6.7.1 initial-access installer,campaign:cl-cri-1171 family:offerloader sha256,fc485882626512e7ff82a1d7cd8e8fb3e9751b026d97e682d6908aefff1f2d73,hunt,medium,2026-11-10,windirstat.tmp unpacked stage (single-source),campaign:cl-cri-1171 family:offerloader sha256,3052bd320a34e12ee694811ed0578797477dfd480c664491e509ed15ce1a6961,detect,high,2026-12-25,eld0.exe Insomnia RAT initial loader,campaign:cl-cri-1171 family:offerloader sha256,25558ea78c4aa0fdd0f45fafcaa546d3115dc5806809d144a5801a40e48fd4c5,hunt,medium,2026-11-10,eld0.tmp unpacked loader stage (single-source),campaign:cl-cri-1171 family:offerloader sha256,9b0d9cbc0fd4a7bae8b78a15dfbe63052779414ad725845732c4a0083008da69,detect,high,2026-12-25,a.dll executes PowerShell downloader for Node.js/Python stages,campaign:cl-cri-1171 family:insomnia-rat sha256,ceb30a5eb9ad9d9c6712c80726df16f96f99d9fc0753be241b00b4d636eb576e,detect,high,2026-12-25,t.ps1 Insomnia RAT PowerShell installer (Defender disable + C: exclusion),campaign:cl-cri-1171 family:insomnia-rat sha256,cf184d04ca31fb2b6b7efd85399c29c1136b539153e137ceb3877b1b905791de,detect,high,2026-12-25,GUID-named Python component of Insomnia dual payload (filename randomized per build),campaign:cl-cri-1171 family:insomnia-rat sha256,62d49d0c78207ec2452cc8a30501db771c9edbae89889e41a7dd227551243e8e,detect,high,2026-12-25,aa.js Node.js component of Insomnia dual payload,campaign:cl-cri-1171 family:insomnia-rat sha256,aaebc8c07de485be6d1bfa956668c5e18aa1ff5588dfe84672e20ae90b4560f1,detect,high,2026-12-25,eld1.exe ARKTunnel LSB-steganography dropper,campaign:cl-cri-1171 family:arktunnel sha256,e05bc22afbc5ddd50b49c85ee169dd13318000d38286de2b8bcff98217256a8d,hunt,medium,2026-11-10,procorTrex.zip carved from eld1.exe BMP steganography payload (single-source),campaign:cl-cri-1171 family:arktunnel sha256,b367762140ae7f5098230b8a5da738c9241f286281ec9439dd6ca581fc87989c,detect,high,2026-12-25,wscl.exe ARKTunnel WebSocket tunneling RAT,campaign:cl-cri-1171 family:arktunnel sha256,d8d783f8e050a6e394f3c0aa5e2bc73a38d822e55fbc39c0648cbff566de3cdf,hunt,medium,2026-11-10,ARKTunnel shared resource icon (retro-hunt only; single-source),campaign:cl-cri-1171 family:arktunnel sha256,06e0afd01bbc6c9d5dc16c3165089b233dc071e1f251abd06235d1b9166cdac5,hunt,medium,2026-11-10,ARKTunnel shared resource icon #2 (retro-hunt only; single-source),campaign:cl-cri-1171 family:arktunnel sha256,2c6e11027b011042c9a118fc20728f8f4ebb6be8795cc84cc9a45622c297d354,detect,high,2026-12-25,eld2.exe Docro Hijacker installer,campaign:cl-cri-1171 family:docro-hijacker sha256,553ce594c9c6afdd4794fddc28c194e3bc3c1b052310e5099c58ac15bab72104,hunt,medium,2026-11-10,eld2.tmp unpacked stage (single-source),campaign:cl-cri-1171 family:docro-hijacker sha256,fdcc95b7791c0d6590dcf1a412dc9fcc92ad2095818d1b78368b31efad012007,detect,high,2026-12-25,Adblock.dll Chrome Secure Preferences HMAC-bypass DLL,campaign:cl-cri-1171 family:docro-hijacker domain,stryper.info,detect,high,2026-12-25,Insomnia RAT Node.js agent host (aa.js POST /d /e),campaign:cl-cri-1171 family:insomnia-rat domain,aa.amazingshield.xyz,detect,high,2026-12-25,Insomnia RAT Python agent host,campaign:cl-cri-1171 family:insomnia-rat domain,crowdstri.com,detect,high,2026-12-25,CrowdStrike-typosquat C2 for Insomnia RAT Python agent,campaign:cl-cri-1171 family:insomnia-rat domain,reg.pcsdkflyer.ca,detect,high,2026-12-25,ARKTunnel (wscl.exe) WebSocket C2,campaign:cl-cri-1171 family:arktunnel domain,vendralo.info,detect,high,2026-12-25,Docro Hijacker per-victim UUID and hourly rewrite-rule delivery,campaign:cl-cri-1171 family:docro-hijacker domain,finersto.com,hunt,medium,2026-11-10,Docro Hijacker extension install/start telemetry (single-source),campaign:cl-cri-1171 family:docro-hijacker domain,drelto.info,detect,high,2026-12-25,Docro Hijacker SERP-injection script host (/farlix),campaign:cl-cri-1171 family:docro-hijacker domain,mqsearch.com,detect,high,2026-12-25,Docro Hijacker hijacked default search provider endpoint,campaign:cl-cri-1171 family:docro-hijacker domain,extentrack.com,hunt,medium,2026-11-10,Docro Hijacker install-success/failure callback (single-source),campaign:cl-cri-1171 family:docro-hijacker domain,voyagemist.space,hunt,medium,2026-11-10,OfferLoader initial tracking beacon / install-verdict gate,campaign:cl-cri-1171 family:offerloader domain,noiseship.cfd,hunt,medium,2026-10-10,SEO-poison lure domain registered 39 days before observed use -- perishable,campaign:cl-cri-1171 family:offerloader domain,atthelake.info,hunt,medium,2026-10-10,Top referring SEO-poison domain -- perishable,campaign:cl-cri-1171 family:offerloader domain,bubbleslip.xyz,hunt,low,2026-10-10,Illustrative example of the rotating two-word-compound gate pattern -- NOT a live blocklist entry,campaign:cl-cri-1171 family:offerloader domain,churchpail.xyz,hunt,low,2026-10-10,Illustrative example of the rotating two-word-compound gate pattern -- NOT a live blocklist entry,campaign:cl-cri-1171 family:offerloader domain,dinosaursjam.cfd,hunt,low,2026-10-10,Illustrative example of the rotating two-word-compound gate pattern -- NOT a live blocklist entry,campaign:cl-cri-1171 family:offerloader
# Operator/loader variable names (compiled Pascal [Code] section, not directly queryable, context only) offer_execution, offer_execution_fail, offer_exists # OfferLoader child-process fan-out (see Q1) eld0.exe -> Insomnia RAT (Operation A) eld1.exe -> ARKTunnel (Operation B) eld2.exe -> Docro Hijacker (Operation C) # Insomnia RAT C2 protocol user_agent: insomnia/2023.4.0 Windows endpoints: POST /d (tasking), POST /e (error reporting) persistence: "Maps Performance Task" under \Microsoft\Windows\Maps\ ; "OOBETaskScheduler" under \Microsoft\Windows\Servicing\ # ARKTunnel service persistence (see Q7) service_names: wscl-13, msvcsrvc (delayed autostart) c2_config_decode: Base64 -> XOR, 39-byte blob # Docro Hijacker paths (see Q8) extension_path: C:\ProgramData\DocsHelper\docro\ dll_path: %TEMP%\Adblock.dll serp_injection_script: drelto.info/farlix # Known affiliate IDs observed in the two documented intrusion sets (context, not a hunt indicator) CID=2855 (Bluetooth Driver for Windows 10.exe intrusion set) CID=3075 (windirstat.exe intrusion set)
Cluster: CL-CRI-1171 (Unit 42 attribution framework) Loader: OfferLoader (disposable, generic Inno Setup trojanized-installer loader) Payload A: Insomnia RAT -- dual Node.js/Python cross-platform backdoor Payload B: ARKTunnel -- WebSocket tunneling RAT, LSB-steganography staged Payload C: Docro Hijacker -- Chrome Secure Preferences hijacker + search extension ARKTunnel fabricated corporate-identity rotation (attribution signal, not a hunt indicator): EarthLink (May 2025) -- coincidental use of a real ISP's name EarthChain (May 2025-Apr 2026) -- coincidental use of a real company's name EarthKark (Feb 2026-Jun 2026) -- fully fictitious identity TamarkLark (Mar 2026-Jun 2026) -- fully fictitious identity; PE metadata: "TamarkLark Corporation" / "TamarkLark Manager" Scale (per Unit 42, 2026-09-09): >10,000 distinct OfferLoader samples; >200 rotating C2/gate domains; >=50 ARKTunnel samples over 1 year; observed distribution window June 2025-April 2026; 11 YouTube channels (since removed) and a parallel SEO-poisoning funnel; targets include gamers (YouTube funnel) and corporate/critical-infrastructure/government endpoints (SEO funnel).
# ARKTunnel service presence Get-Service -Name wscl-13,msvcsrvc -ErrorAction SilentlyContinue # Insomnia RAT masquerading scheduled tasks Get-ScheduledTask -TaskName "Maps Performance Task","OOBETaskScheduler" -ErrorAction SilentlyContinue # Docro Hijacker sideloaded extension path Get-ChildItem "C:\ProgramData\DocsHelper\docro" -ErrorAction SilentlyContinue # Chrome Secure Preferences recent-modification check (all local profiles) Get-ChildItem "$env:LOCALAPPDATA\Google\Chrome\User Data\*\Secure Preferences" -ErrorAction SilentlyContinue | Select-Object FullName, LastWriteTime # ARKTunnel dropped artifact Get-ChildItem "C:\Users\Public\procorTrex.zip" -ErrorAction SilentlyContinue
Detection Validation Gates
Telemetry ready
ProcessRollup2, DnsRequest, ZipFileWritten, NewExecutableWritten, CreateService, ScheduledTaskRegistered, and RegGenericValueUpdate must be enabled and flowing (default Falcon sensor policy covers all seven on Windows). Confirm with #event_simpleName=ProcessRollup2 | groupBy(ComputerName, function=count(), limit=10) against a small pilot group before relying on Q1-Q9.
Benign baseline
Run Q1, Q3, Q5, and Q9 with a 30-day console lookback and confirm a zero (or near-zero, fully explained) baseline before enabling any of them as a Scheduled Search. Any pre-existing hits should be triaged as already-compromised endpoints, not tuned away. Run Q10 once against the same window purely to gauge its baseline noise volume in your environment before ever running it live.
Positive tests
Validate Q1 and Q5 against a lab-owned host that spawns a harmless, uniquely-named process called eld1.exe (or registers a scheduled task named exactly "OOBETaskScheduler") rather than resolving or executing any live campaign domain or sample from production. Do not run confirmed campaign hashes or resolve confirmed campaign domains from a production endpoint for testing.
Promotion
Q1, Q3, Q5, and Q9 are the IOA/Scheduled-Search candidates (CONF high, FP low). Q2, Q4, Q6, Q7, Q8, and Q11 remain investigate-only pending periodic re-validation. Q10 never promotes past manual triage, per its explicit high-FP labeling in Section 8.
Hardening — Tiered
1. Disable local-admin merge for Defender exclusion lists. Set-MpPreference -DisableLocalAdminMerge $true (equivalently, the "Configure local administrator merge behavior for lists" policy under Administrative Templates > Windows Components > Microsoft Defender Antivirus > Exclusions) prevents a locally-run Add-MpPreference -ExclusionPath "C:\" from ever merging into the effective, managed exclusion list — neutralizing t.ps1's defense-evasion step even if it runs. MITRE M1028 (Operating System Configuration); Microsoft Security Baseline for Windows / Microsoft Defender Antivirus documentation; CIS Microsoft Windows Benchmark (Microsoft Defender Antivirus section).
2. Lock the enterprise-managed Chrome default search provider. Set DefaultSearchProviderEnabled/DefaultSearchProviderName/DefaultSearchProviderSearchURL via Chrome Enterprise policy (Playbook 2, Section 13). A managed default-search policy takes precedence over a user-profile Secure Preferences value, so Docro Hijacker's HMAC-forged rewrite of the default search provider stops working even if the bypass DLL still runs. MITRE M1042 (Disable or Remove Feature or Program); CIS Google Chrome Benchmark (Default Search Provider section).
3. Fleet-wide audit sweep. Run the Section 10 Fleet Audit Commands across all endpoints to find existing ARKTunnel services, Insomnia scheduled tasks, and Docro extension/Secure-Preferences artifacts before any policy rollout, so existing infections are triaged rather than silently masked by new controls.
4. Application control for user-writable execution paths. Deploy an AppLocker or WDAC path-deny rule for unsigned executables launched from %USERPROFILE%\Downloads\* and %USERPROFILE%\AppData\Local\Temp\*, with a signed-publisher exception for approved deployment tooling (Playbook 3, Section 13). This blocks the OfferLoader installer's very first execution step regardless of which lure filename it uses next. MITRE M1038 (Execution Prevention); CIS Microsoft Windows Benchmark (Application Control section).
5. Task Scheduler operational logging and baseline alerting. Enable Microsoft-Windows-TaskScheduler/Operational fleet-wide (Playbook 4, Section 13) and alert on new task registrations under \Microsoft\Windows\Maps\ and \Microsoft\Windows\Servicing\ that fall outside your known-Microsoft-task baseline. MITRE M1047 (Audit).
6. DNS-security category blocking for newly-registered domains in the observed TLD set. Most enterprise DNS-security/SWG products offer a "newly registered domain" or "high-risk TLD" category; enabling it for .xyz/.cfd/.space/.info reduces exposure to the rotating gate infrastructure without needing a static, perishable domain list. MITRE M1031 (Network Intrusion Prevention). ⚠ best-practice, no single CIS Benchmark section covers TLD-category DNS filtering; the underlying control (DNS security filtering) is documented in CIS Controls v8, Control 9.
7. Browser extension governance program. Move from ad hoc extension checks to a documented allowlist model: ExtensionInstallBlocklist: ["*"] paired with ExtensionInstallAllowlist for approved extensions (Playbook 2, Section 13). This blocks sideloaded/unpacked extensions like docro at the platform level, independent of Docro Hijacker's specific HMAC-bypass technique, and generalizes to the next browser-hijacker family. MITRE M1042; CIS Google Chrome Benchmark (Extension Management section).
8. Formal PPI/loader-cluster IR runbook. Generalize the Section 14 containment runbook into a standing playbook for "generic loader spawns N unrelated payloads" incidents — the defining trait of PPI infrastructure is that any two infections from the same loader can carry entirely different, unrelated malware, so IR scoping must never assume the payload set from one infection generalizes to the next. MITRE M1047 (Audit) as an ongoing IR-maturity practice.
9. User awareness training on SEO-poisoned downloads and gaming-optimization lures. The initial-access vector here requires no exploit, only a convincing download page or YouTube description link; awareness training measurably reduces the population that reaches step 1 of the attack chain (Section 3). MITRE M1017 (User Training).
Deployable Playbooks
Playbook 1 — Disable Defender local-admin exclusion merge (PowerShell / Intune)
Prerequisites: local admin or Intune/GPO push rights. Reboot required: no — Defender re-reads the setting on next policy sync. Rollback: Set-MpPreference -DisableLocalAdminMerge $false.
Set-MpPreference -DisableLocalAdminMerge $true
Verify: Get-MpPreference | Select-Object DisableLocalAdminMerge returns True; a subsequent local Add-MpPreference -ExclusionPath "C:\" no longer appears in the effective exclusion list returned by Get-MpPreference | Select-Object -ExpandProperty ExclusionPath once managed policy is present.
Playbook 2 — Chrome enterprise policy: lock default search + block unmanaged extensions
Prerequisites: write access to Chrome policy delivery (GPO ADMX, Intune, or Google Admin console for managed ChromeOS/Chrome Browser Cloud Management). Reboot required: no — restart Chrome to pick up policy. Rollback: remove the JSON keys below and restart Chrome.
{
"DefaultSearchProviderEnabled": true,
"DefaultSearchProviderName": "Google",
"DefaultSearchProviderSearchURL": "https://www.google.com/search?q={searchTerms}",
"ExtensionInstallBlocklist": ["*"],
"ExtensionInstallAllowlist": ["REPLACE_WITH_your_approved_extension_ids"]
}
Verify: chrome://policy on a test endpoint shows both policies applied; chrome://extensions with Developer Mode on shows any unpacked/sideloaded extension (including a test copy of docro's manifest structure) blocked from loading; the default search box shows the managed provider and offers no alternate-provider option in Settings.
Playbook 3 — AppLocker path-deny rule for Downloads/Temp execution
Prerequisites: local admin or GPO push rights to Application Control Policies. Reboot required: no — AppLocker re-evaluates on next policy refresh / Application Identity service poll. Rollback: remove or disable the deny rule and re-run gpupdate /force.
<AppLockerPolicy Version="1">
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FilePathRule Id="REPLACE_WITH_new_guid" Name="Deny exe from Downloads" Description="Blocks OfferLoader-style installer execution from Downloads" UserOrGroupSid="S-1-1-0" Action="Deny">
<Conditions>
<FilePathCondition Path="%USERPROFILE%\Downloads\*.exe" />
</Conditions>
</FilePathRule>
<FilePathRule Id="REPLACE_WITH_new_guid_2" Name="Deny exe from Temp" Description="Blocks unpacked installer stages from user Temp" UserOrGroupSid="S-1-1-0" Action="Deny">
<Conditions>
<FilePathCondition Path="%USERPROFILE%\AppData\Local\Temp\*.exe" />
</Conditions>
</FilePathRule>
</RuleCollection>
</AppLockerPolicy>
Apply with Set-AppLockerPolicy -XmlPolicy "C:\Policies\DenyDownloadsTempExec.xml" -Merge and add publisher-condition exceptions for your approved deployment tooling before enforcing. Verify: Get-AppLockerPolicy -Effective -Xml includes both rules; a test .exe copied to Downloads and launched is blocked with the standard AppLocker denial dialog.
Playbook 4 — Enable Task Scheduler operational logging (fleet-wide)
Prerequisites: local admin or RTR/GPO push rights. Reboot required: no. Rollback: wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:false.
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true
Verify: wevtutil gl Microsoft-Windows-TaskScheduler/Operational shows enabled: true; registering a test scheduled task produces Event ID 106 in that log, confirming the pipeline is live for SIEM/NG-SIEM ingestion.
Playbook 5 — Fleet-wide RTR eradication sweep (ARKTunnel service + Insomnia tasks)
Prerequisites: Falcon RTR enabled and admin rights to run a batch RTR script. Reboot required: no. Rollback: none required for the detection half; the removal commands are themselves the remediation action, run only after Section 14 Identify/Triage confirms compromise.
sc query wscl-13 sc query msvcsrvc sc stop wscl-13 sc delete wscl-13 sc stop msvcsrvc sc delete msvcsrvc schtasks /delete /tn "Maps Performance Task" /f schtasks /delete /tn "OOBETaskScheduler" /f
Verify: repeat sc query and schtasks /query /tn "..." for each name and confirm "service does not exist" / "task not found"; re-run the Section 10 Fleet Audit Commands to confirm no remaining artifacts.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| 1. Identify / Triage | Confirm eld0-2 execution via Q1/Q3; confirm ARKTunnel service and Insomnia scheduled tasks via the Section 10 audit commands; confirm Docro artifacts via Q8. Because this is a PPI loader, do NOT assume all three payload families are present on every host — verify each branch independently | SOC / Detection Engineering | Q1/Q3/Q5/Q8/Q9 hit lists, RTR audit output |
| 2. Contain | Network-contain the host in Falcon pending investigation; block the confirmed domains in Section 4 at the perimeter DNS/SWG layer | SOC / Network Engineering | Containment log, perimeter blocklist change record |
| 3. Eradicate | Run Playbook 5 (stop/delete ARKTunnel services, delete Insomnia scheduled tasks); remove Adblock.dll and the docro extension directory; remove the a.dll/aa.js/Python-agent files if still present; re-run the Section 10 audit sweep to confirm removal | Endpoint Engineering | Second RTR sweep output |
| 4. Recover / Remediate identity & browser | Reset the Chrome profile (or restore a known-good Secure Preferences backup) on any confirmed-affected endpoint; deploy Playbook 2's managed search-provider/extension policy before returning the host to service; rotate any credentials entered while the browser hijack was active | Endpoint Engineering / Security Awareness | Browser reset log, policy deployment confirmation |
| 5. Evidence & Reporting | Preserve Q1-Q11 hit lists, RTR audit output, and the confirmed-affected host list for the incident record; report to security leadership, noting which of the three payload branches (Insomnia RAT / ARKTunnel / Docro Hijacker) were confirmed present | SOC | Incident ticket with attached query outputs |
| 6. Post-incident | Add the Section 4 domains and hashes to Falcon IOC Management at the severities in this pack (never prevent/critical without your own additional corroboration); deploy Playbooks 1, 3, and 4 fleet-wide; formalize the Section 12 near-term and strategic hardening items | Detection Engineering | IOC Management change record |
Detection Coverage Map
| Technique | Behavior | CQL | IOA/Control | Coverage |
|---|---|---|---|---|
| T1204.002 User Execution: Malicious File | Trojanized Inno Setup installer run from Downloads/Temp | Q2, Q3 | AppLocker/WDAC path deny (Playbook 3) | Good |
| T1027 Obfuscated Files or Information | All malicious logic hidden in the installer's compiled Pascal [Code] section | — (script content inside a compiled installer is not exposed as queryable telemetry) | Application control blocks the installer itself before its bytecode runs | Gap (CQL) / mitigated by policy |
| T1027.003 Steganography | ARKTunnel payload extracted in-memory from a BMP resource via LSB steganography | — (in-memory image decode) | — | Gap |
| T1140 Deobfuscate/Decode Files or Information | ARKTunnel C2 address decoded from a Base64+XOR blob in-process | Q9 (indirect, via the resulting DNS resolution only) | — | Partial |
| T1053.005 Scheduled Task | "Maps Performance Task" / "OOBETaskScheduler" persistence | Q5 | Custom IOA + Scheduled Search | Good |
| T1543.003 Windows Service | ARKTunnel installs as wscl-13 / msvcsrvc | Q7 | Custom IOA candidate | Good |
| T1562.001 Impair Defenses | t.ps1 disables Defender, excludes C:\, suppresses notifications | Q4 | Defender local-admin-merge lockout (Playbook 1) | Partial |
| T1112 Modify Registry | SystemComponent=1 hides Node.js; Secure Preferences MACs rewritten | Q6, Q8 | — | Partial |
| T1105 Ingress Tool Transfer | t.ps1 downloads Python/Node.js runtimes and agent payloads | Q9 (indirect, via infrastructure signal only) | — | Partial |
| T1071.001 Application Layer Protocol: Web Protocols | HTTPS POST to /d /e with a disguised User-Agent; ARKTunnel WebSocket tunnel | Q9 (domain-level); Q11 (UA-level, NGSIEM only, not native EDR) | Custom IOC (domain) | Partial |
| T1176 Browser Extensions | docro Manifest V3 extension sideloaded via Secure Preferences tamper | Q8 | Chrome ExtensionInstallBlocklist (Playbook 2) | Partial |
| T1583.001 Acquire Infrastructure: Domains | >200 rotating two-word-compound C2/gate domains | Q10 (deliberately high-FP, triage-only) | DNS-security newly-registered-domain category (Section 12) | Partial |
| Search-result monetization / SERP script injection | docro extension injects a script into Google SERPs to hijack/rewrite results | — (in-browser JS content inside the search engine's own TLS session) | — | Gap |
Validation gates (Section 11, summarized): telemetry readiness confirmed via a pilot ProcessRollup2/DnsRequest check; benign baseline required before promoting Q1/Q3/Q5/Q9; positive-test against a lab host, never a live campaign hash or domain, before production use; Q1/Q3/Q5/Q9 promote to Scheduled Search, Q2/Q4/Q6/Q7/Q8/Q11 stay investigate-only, and Q10 never promotes past manual triage.
Hunt Summary Ticket
TITLE: OfferLoader / CL-CRI-1171 pay-per-install loader -- Insomnia RAT, ARKTunnel, Docro Hijacker SEVERITY: HIGH -- disposable multi-payload loader with >10,000 samples observed, delivering a cross-platform RAT, an undocumented WebSocket tunneling RAT, and a Chrome search hijacker; targets both gamers (YouTube funnel) and corporate/critical-infrastructure/government endpoints (SEO funnel) SCOPE: Managed Windows endpoints (installer execution, service/task persistence, DNS egress); Chrome browser profile integrity; NGSIEM-ingested proxy logs (User-Agent visibility) HYPOTHESIS: Endpoints running a trojanized WinDirStat/Bluetooth-driver installer spawn eld0/eld1/eld2 child processes, each delivering an independent payload family with its own persistence and C2 QUERIES: Q1-Q11 (Q1, Q3, Q5, Q9 promoted to Scheduled Search / IOA candidates; Q10 is triage-only, never promoted) DO FIRST: Q1 (eld0-2 child-process chain), then Q3 (exact hash match), then the Section 10 RTR audit sweep (ARKTunnel service, Insomnia tasks, Docro extension path) FINDINGS: GAPS: In-memory BMP LSB steganographic extraction (ARKTunnel) and in-browser SERP script injection (Docro Hijacker) are both invisible to EDR by design; the Insomnia RAT User-Agent is visible only via NGSIEM-ingested proxy logs, not native Falcon sensor telemetry; the installer's compiled Pascal [Code] section is not inspectable content ACTIONS: Disable Defender local-admin exclusion merge (Playbook 1); lock the managed Chrome default search provider and extension allowlist (Playbook 2); deploy AppLocker/WDAC deny rules for Downloads/Temp execution (Playbook 3); run the fleet-wide RTR eradication sweep (Playbook 5) on any confirmed host OWNER: SOC / Detection Engineering / Endpoint Engineering VERSION: v1.0 · 2026-09-26 · STATIC REVIEW PASSED
Changelog
References
| ID | Publisher | Version/date | Accessed | Use | URL |
|---|---|---|---|---|---|
| S01 | Unit 42 (Palo Alto Networks), Rem Dudas | 2026-09-09 | 2026-09-26 | Primary investigation: OfferLoader chain, all three payload families, full IOC tables, rotational infrastructure appendix | https://unit42.paloaltonetworks.com/ppi-network-malware-campaign-analysis/ |
| S02 | Cyber Security News, Tushar Subhra Dutta | 2026-09-14 | 2026-09-26 | Corroboration (republication citing Unit 42): 5 of the same hashes, 4 of the same domains | https://cybersecuritynews.com/hackers-abuse-youtube-gaming/ |
| S03 | GBHackers on Security, Mayura Kathir | 2026-09-11 | 2026-09-26 | Corroboration (republication citing Unit 42): windirstat.exe hash and campaign overview | https://gbhackers.com/10000-malware-loaders/ |
| S04 | Malwarebytes Labs, Joshua Cannell | 2015-05-13 | 2026-09-26 | Historical technique precedent for Chrome Secure Preferences HMAC forging (Docro Hijacker's revived technique); no atomics from this source are shipped | https://www.malwarebytes.com/blog/news/2015/05/winyahoo-pup-modifies-chrome-secure-preferences |