Sauron Loader: MaaS DLL Side-Loading Campaigns Against Germany
Executive Summary
DCSO CyTec published research on 2026-09-24 describing a previously undocumented loader family it calls Sauron Loader, encountered in multiple real-world incidents against organizations in Germany. The malware is sold as Malware-as-a-Service in Russian-speaking underground forums by an actor operating under the alias "S4ur0n" (leetspeak for "Sauron"), and the seller's own advertisement states the loader is intended exclusively for Russian-speaking customers and is not to be used against public-sector organizations or post-Soviet states. Cyber Security News independently corroborated the finding on 2026-09-25 after DCSO shared the report with them directly, and the write-up was further mirrored by Cryptika, summarized by Mallory.ai, and cross-posted to the malware.news community board. This pack treats the DCSO CyTec research as the primary technical source and Cyber Security News as the second independent confirmation.
In the incidents DCSO supported, Sauron Loader was the final stage of attack chains that began with social engineering rather than exploitation: ClickFix-style fake verification prompts and voice phishing, where victims were first flooded with spam email (email bombing) and then contacted by attackers posing as IT support, in some cases directing the victim to start a Microsoft Quick Assist remote-assistance session. The observed MSI installer drops three files into the hardcoded directory C:\ProgramData\keyroll: the legitimate, genuinely Mozilla-signed utility rnpkeys.exe (part of the RNPGP suite), the malicious loader library rnp.dll that it side-loads, and a second malicious library tdwp.dll that decrypts rnp.dll's encrypted sections directly in memory and creates a scheduled task named keyroll for persistence. The malware deliberately delays execution during decryption, a technique intended to frustrate antivirus and automated sandbox analysis.
The highest-value defensive angle is the directory and the task name, not the DLL filenames. rnpkeys.exe and rnp.dll are real Mozilla RNP component names, so hunting on the filenames alone risks flagging genuine RNPGP installs. What is campaign-specific is the combination: those exact binaries running from C:\ProgramData\keyroll, dropped by an MSI, backed by a scheduled task literally named keyroll. That combination has no benign explanation in a normal estate.
The second-highest-value angle is the four named command-and-control domains recovered from the decrypted embedded configuration: api.namsb-show.com, api.quinlantours.com, api.virtual-magic.com, and api.lahaina-shores.com. All four, plus the four SHA-256 hashes (the malicious MSI, the malicious rnp.dll, the malicious tdwp.dll, and the legitimate rnpkeys.exe for context only), were independently published by both DCSO CyTec and Cyber Security News, which qualifies the malicious set for a block posture under this pack's two-source rule.
Defender priority: import the section 10 CSV into Falcon IOC Management and block the four C2 domains at DNS and proxy today, then run Q2 and Q4 across a 90-day window. A hit on either is a confirmed compromise until proven otherwise: nothing in a normal estate legitimately places rnpkeys.exe in C:\ProgramData\keyroll or registers a task named keyroll. Never block the rnpkeys.exe hash itself; it is a genuine signed Mozilla binary and blocking it does nothing to stop the campaign.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| Tier 1 | DCSO CyTec — Sauron Loader: A New Loader Lurking in Underground Forums (2026-09-24) | Primary research. Full chain of execution, decrypted config layout, C2 protocol (Salsa20 + RSA), TLV message format, ten payload handler types, sleep/rotation timers, four C2 domains, all four SHA-256 hashes, complete MITRE ATT&CK mapping, DCSO GitHub extractor tool. | Yes, primary |
| Tier 1 | Cyber Security News — Sauron Loader Malware Uses DLL Side-Loading and In-Memory Decryption to Evade Detection (2026-09-25) | Independent journalism, written from a DCSO report shared directly with the outlet. Confirms the attack chain, the persistence mechanism, and republishes the full IOC table (hashes, filenames, path, task name, four C2 domains) matching DCSO's own values exactly. | Yes, second independent source for the two-source block rule |
| Tier 2 | Cryptika Cybersecurity (2026-09-25) | Syndicated republish; the article itself states its original source is cybersecuritynews.com. Treated as a mirror of the Cyber Security News article, not a second independent confirmation. | Corroboration only |
| Tier 2 | Mallory.ai intelligence story | Aggregator timeline confirming the actor alias, MaaS model, targeting restrictions, and that DCSO published the hashes and domains. Atomic indicator values are masked on the public page; no hash or domain value was sourced from this page. | Narrative corroboration only, no atomic IOCs |
| Ref | DCSO GitHub — Blog_CyTec/2026_09__sauron_loader | Config-extraction Python tool (get_config.py) and a MISP event with the indicator set. Confirms the embedded-config field layout (magic number, CIS/gov-domain check flags, RSA key lengths) independently of the blog prose. | Corroboration of config structure |
Research decisions
- Prevent/critical requires two independent sources. The four C2 domains and the three malicious SHA-256 hashes (MSI,
rnp.dll,tdwp.dll) are published identically by both DCSO CyTec and Cyber Security News, two editorially independent outlets, so they ship ataction=prevent. The Cryptika mirror is not counted as a second source because it discloses itself as a republish of the Cyber Security News piece. - The legitimate
rnpkeys.exehash never ships as prevent. It is a genuine, correctly signed Mozilla RNPGP binary that the loader abuses for side-loading. It is listed as a hunt anchor with an explicit do-not-block marker in sections 4 and 10. - Filenames alone are not sufficient hunt anchors.
rnpkeys.exeandrnp.dllare real RNPGP component names. Every CQL query keys on the unexpected parent path (C:\ProgramData\keyroll), the MSI-dropped context, the scheduled task name, or the DLL appearing outside its known location, never on the filename in isolation. - No aggregator-only indicators. Mallory.ai's page masks every atomic value, so nothing atomic in this pack traces to it. It was used only to confirm the narrative and the actor alias.
- No related-cluster IOCs imported. Mallory.ai's "Related stories" panel lists unrelated malware (LegionLoader/Satacom, TA4922's SilentRunLoader/Atlas RAT, generic ClickFix/Donut loader campaigns). None of their indicators (for example a
167.88.167.9:8356callback or anobs.dllsideload from a different campaign) belong to Sauron Loader and none are shipped in this pack. - Prompt-injection review. All five fetched sources (DCSO/malware.news mirror, Cyber Security News, Cryptika, Mallory.ai, DCSO's GitHub repository) were reviewed for text addressed to an automated reader: instructions to fetch further URLs, change scope, or skip a check. None were found. No source was disqualified.
- Access note. The DCSO CyTec Medium post (the cited primary source) returns HTTP 403 to automated fetch tools. Its full text was retrieved and saved instead from its malware.news community mirror, which reproduces the post verbatim including the appendix TTP-mapping table and the indicator list.
- Perishability. DCSO reports finding additional Sauron Loader samples with different embedded C2 infrastructure beyond the analyzed sample. The four named domains will not be the last set this loader uses; the behavioral queries in section 8 (path, task name, MSI-to-sideload chain) are built to outlive a C2 rotation.
Hunt Brief & Attack Chain
Attack chain
| # | Step | Observed behavior | Telemetry | Hunt angle |
|---|---|---|---|---|
| 1 | Initial access, ClickFix | Fake verification / "fix it yourself" pastejacking prompt convinces the victim to run a command themselves. | Clipboard, ProcessRollup2 | Section 7 native hunts |
| 1b | Initial access, vishing | Victims are flooded with spam email (email bombing), then called by an attacker posing as IT support. In one DCSO-observed incident the caller instructed the victim to start a Microsoft Quick Assist session. | Mail gateway, remote-assistance tool logs | Section 7, hardening item 3 |
| 2 | Stage 1, drop | An MSI installer extracts and drops three files into the hardcoded directory C:\ProgramData\keyroll: rnpkeys.exe, rnp.dll, tdwp.dll. | ProcessRollup2, PeFileWritten | Q3, Q5 |
| 3 | Stage 2, side-load | The legitimate rnpkeys.exe is executed and side-loads the malicious rnp.dll from the same directory. | ProcessRollup2 | Q2, Q7 |
| 4 | Stage 3, in-memory decrypt | rnp.dll loads tdwp.dll, which decrypts encrypted sections of rnp.dll directly in memory, deliberately delaying execution to frustrate sandbox and antivirus analysis. | Not exposed as a discrete Falcon event | Gap, see section 15 |
| 5 | Persistence | tdwp.dll registers a scheduled task named keyroll that re-launches the loader at intervals. | ScheduledTaskRegistered | Q4, Q8, Q12 |
| 6 | Command and control | HTTPS POST to a randomized path of the shape /<prefix>/v<1-9>/<action><resource>?<parameters>, prefix one of api, webhook, metrics, public, internal. Payload is Salsa20-encrypted with a per-request 16-byte key and 8-byte nonce plus an RSA signature. | NetworkConnectIP4, DnsRequest, proxy | Q1, Q11, section 7 |
| 7 | Registration | Message type 0x01. Bot ID is the lowercase MD5 hex digest of <COMPUTERNAME><USERNAME><volume_serial>. On failure the loader rotates C2 and sleeps 160 seconds. | Not exposed as a discrete Falcon event; protocol-internal | Behavioral signal only |
| 8 | Tasking and payload retrieval | Message type 0x02 polls for tasking; message type 0x04 retrieves a payload. On a successful poll/task cycle the loader sleeps 600 seconds. Staged payloads land in %TEMP% with a random 6-16 character filename. | PeFileWritten, NewExecutableWritten, ZipFileWritten | Q9 |
| 9 | Payload execution | Ten handler types: EXE, DLL (via rundll32/regsvr32 or a manual PE loader), driver, shellcode, MSI, ZIP, CMD, PowerShell, VBS, JavaScript. | ProcessRollup2 | Q12, section 7 |
| 10 | Result reporting | Message type 0x03 reports task results back to the C2, including chunked PNG screenshot exfiltration in pieces of up to 0x4000 bytes. | NetworkConnectIP4, proxy | Section 7 |
Hunt hypotheses (fidelity-ordered)
| H | Hypothesis | MITRE | Telemetry | Expected FP source | Conf |
|---|---|---|---|---|---|
| H1 | A host resolved one of the four named Sauron Loader C2 domains. | T1071.001 | DnsRequest | None. No benign resolver path exists. | High |
| H2 | rnpkeys.exe executed from C:\ProgramData\keyroll. | T1574.002, T1036.005 | ProcessRollup2 | None observed; no legitimate RNPGP install uses this path. | High |
| H3 | rnp.dll or tdwp.dll was written to C:\ProgramData\keyroll. | T1027.013, T1574.002 | PeFileWritten | None observed; campaign-specific path and filename pair. | High |
| H4 | A scheduled task named keyroll was registered. | T1053.005 | ScheduledTaskRegistered | None; not a Windows or common-vendor task name. | High |
| H5 | msiexec.exe directly spawned rnpkeys.exe. | T1218.007, T1574.002 | ProcessRollup2 | None observed in a normal software-deployment estate. | High |
| H6 | A published Sauron Loader SHA-256 hash executed or was written to disk. | T1204.002 | ProcessRollup2, PeFileWritten | Malware-analysis workstations and detonation sandboxes. | High |
| H7 | An RNP/rnpkeys binary executed outside its legitimate Mozilla install path, campaign-agnostic form of H2. | T1574.002, T1036.005 | ProcessRollup2 | A genuine Thunderbird/RNP install running key-management operations from Program Files. | Medium |
| H8 | A scheduled task launches an executable from a non-standard ProgramData subfolder, campaign-agnostic form of H4. | T1053.005 | ScheduledTaskRegistered | Legitimate vendor agents that install a scheduled task under ProgramData. | Medium |
| H9 | A payload with a random 6-16 character filename and a loader-handler extension was staged to %TEMP%. | T1105, T1027 | PeFileWritten, NewExecutableWritten | Installers and browsers routinely stage randomly-named temp files. | Medium |
| H10 | rnp.dll or tdwp.dll appeared outside the known C:\ProgramData\keyroll path, a moved or renamed build. | T1036.005, T1574.002 | PeFileWritten | None known by filename collision; confirm sensor signature-flag semantics before alerting. | Medium |
| H11 | A process running out of C:\ProgramData\keyroll beacons out repeatedly on TCP/443, matching the loader's 160s/600s poll cadence. | T1071.001, T1573.001, T1573.002 | NetworkConnectIP4 | Any legitimate agent co-located in ProgramData. | Medium |
| H12 | rundll32 or regsvr32 was invoked directly against rnp.dll or tdwp.dll, the Type-2 DLL payload handler. | T1218.011, T1218.010, T1574.002 | ProcessRollup2 | None expected; these files are not legitimately invoked this way. | High |
Consolidated IOC Table
Confidence high = published identically by DCSO CyTec and Cyber Security News, two independent sources. Action follows confidence: only two-source infrastructure ships at prevent/critical, and the legitimate Mozilla binary never ships as a block action regardless of how prominently it appears in the chain.
| Type | Value | Conf | Action | Context | Expiry |
|---|---|---|---|---|---|
| domain | api[.]namsb-show[.]com | high | prevent | Sauron Loader C2 endpoint recovered from the decrypted embedded config. | 2027-03-27 |
| domain | api[.]quinlantours[.]com | high | prevent | Sauron Loader C2 endpoint. | 2027-03-27 |
| domain | api[.]virtual-magic[.]com | high | prevent | Sauron Loader C2 endpoint. | 2027-03-27 |
| domain | api[.]lahaina-shores[.]com | high | prevent | Sauron Loader C2 endpoint. | 2027-03-27 |
| sha256 | ee727d639eaa4ee2e0d7cafbe496e14aaac8df0955d9fb599f2c11dfa1d0f8f2 | high | prevent | Analyzed MSI installer; drops the loader triad into C:\ProgramData\keyroll. | 2027-03-27 |
| sha256 | 5606afdc5191d42f38d3c4f1692eda0a629c88810e29bfe78528733284ad1bf8 | high | prevent | Malicious loader library rnp.dll, side-loaded by rnpkeys.exe. | 2027-03-27 |
| sha256 | 6551293e996d19755ba497f50b30a18c178f0d6e2a73b29ae742b8171e2985b7 | high | prevent | Malicious decrypter and scheduler library tdwp.dll; creates the keyroll scheduled task. | 2027-03-27 |
| sha256 | 194d7e8870ff783ce1e4e4e3015c895cc67ae52fd5e063c89dd1c069400d3991 | high | hunt only | Legitimate, genuinely Mozilla-signed RNPGP binary. Never block. Listed as a hunt anchor for its location, not its identity. | n/a |
| path | C:\ProgramData\keyroll | high | hunt | Hardcoded drop directory for the entire loader triad. The single highest-fidelity behavioral anchor in this pack. | 2027-03-27 |
| scheduled task | keyroll | high | hunt | Persistence mechanism created by tdwp.dll. | 2027-03-27 |
| filename | rnp.dll | high | hunt | Malicious loader DLL. Also a real Mozilla RNPGP component name; hunt on location, not name alone. | 2027-03-27 |
| filename | tdwp.dll | high | hunt | Malicious decrypter/scheduler DLL. | 2027-03-27 |
| filename | rnpkeys.exe | high | hunt (context) | Legitimate side-loading host binary. Do not block; watch for it running from an unexpected path. | n/a |
| network | URI shape /<prefix>/v<1-9>/<action><resource>?<parameters> | high | hunt (proxy) | Randomized HTTPS beacon path; not visible to endpoint telemetry, see section 7. | 2027-03-27 |
Do not block rnpkeys.exe by hash or by name alone. It is a genuine, correctly signed Mozilla RNPGP utility that the loader abuses purely for its side-loading behavior. Blocking it breaks a legitimate application and does not stop the campaign, which would simply ship a different signed host binary in its next MSI build.
Affected Surface & Telemetry Matrix
| Surface | Exposure | Required telemetry | Priority | Gap risk |
|---|---|---|---|---|
| Windows workstations | Primary target. ClickFix and vishing lures both land here; full MSI-drop-to-persistence chain executes on the endpoint. | ProcessRollup2, PeFileWritten, ScheduledTaskRegistered, NetworkConnectIP4, DnsRequest | Critical | Low, standard Falcon coverage |
| Help-desk / remote-support tooling | Vishing chain culminates in a Microsoft Quick Assist or similar remote-assistance session granted by the victim. | Remote-assistance application logs, ProcessRollup2 | High | Medium, depends on whether remote-assist tools are logged centrally |
| Email gateway | Email-bombing precursor to the vishing chain. | Mail flow / volume anomaly logs | High | Medium, volume anomaly detection is often tuned for spam, not bombing |
| DNS resolver / proxy | The only place a host with no endpoint agent, or a host beaconing before EDR loads, shows up. | DNS resolver logs, proxy logs with URI and user agent | Critical | Medium, URI-level proxy logging is not universally retained |
| Loader in-memory decryption stage | The decryption of rnp.dll's encrypted sections by tdwp.dll, and the deliberate execution delay. | Not surfaced as a discrete Falcon event | Medium | Gap, memory-scan / IOA territory only |
| C2 protocol content (Salsa20/RSA) | Registration, tasking, and result messages are opaque to any device that only sees encrypted HTTPS. | Full packet capture or a TLS-terminating proxy | Medium | Gap, most estates do not TLS-inspect all egress |
ATT&CK Mapping
Technique identifiers below follow DCSO CyTec's own published TTP mapping appendix.
| Tactic | Technique | Observed behavior | Query / control |
|---|---|---|---|
| Initial Access | T1667 Email Bombing | Spam flood precedes the fake IT-support call. | Section 7 |
| Initial Access | T1566.004 Phishing: Spearphishing Voice | Attacker calls posing as IT support after the email flood. | Section 7, hardening item 3 |
| Initial Access / C2 | T1219 Remote Access Tools | Victim instructed to start a Microsoft Quick Assist session in at least one incident. | Section 7 |
| Defense Evasion / Execution | T1218.007 System Binary Proxy Execution: Msiexec | MSI installer drops and launches the triad. | Q5 |
| Defense Evasion | T1574.002 Hijack Execution Flow: DLL Side-Loading | rnpkeys.exe side-loads rnp.dll. | Q2, Q7, Q12 |
| Defense Evasion | T1036.005 Masquerading: Match Legitimate Resource Name or Location | Malicious DLLs reuse legitimate RNPGP component names. | Q10 |
| Defense Evasion | T1027.013 Obfuscated Files or Information: Encrypted/Encoded File | rnp.dll ships with encrypted sections. | Q3 |
| Defense Evasion | T1140 Deobfuscate/Decode Files or Information | tdwp.dll decrypts rnp.dll in memory. | Gap, section 15 |
| Defense Evasion | T1480.001 Execution Guardrails: Environmental Keying | CIS-country and public-sector checks gate execution per the seller's advertisement and embedded config. | Behavioral note only |
| Persistence | T1053.005 Scheduled Task/Job: Scheduled Task | Task keyroll re-launches the loader. | Q4, Q8, Q12 |
| Discovery | T1082, T1033, T1057, T1518.001, T1016, T1614.001 | Registration message collects computer name, username, Windows version, privilege level, installed products, and keyboard-layout/CIS checks. | Behavioral note only |
| Command and Control | T1071.001 Application Layer Protocol: Web Protocols | HTTPS POST with a randomized URI path. | Q1, Q11, section 7 |
| Command and Control | T1573.001 Encrypted Channel: Symmetric Cryptography | Salsa20 encryption of every request and response. | Q11, section 7 |
| Command and Control | T1573.002 Encrypted Channel: Asymmetric Cryptography | RSA signature over every request. | Section 7 |
| Command and Control | T1105 Ingress Tool Transfer | Message type 0x04 payload retrieval. | Q9 |
| Execution | T1059.003, T1059.001, T1059.005, T1059.007 | CMD, PowerShell, VBS and JavaScript payload handlers. | Section 7 |
| Execution / Defense Evasion | T1218.011 Rundll32, T1218.010 Regsvr32 | DLL payload handler stages via rundll32/regsvr32 or a manual PE loader. | Q12 |
| Execution / Persistence | T1543.003 Create or Modify System Process: Windows Service | Driver payload handler installs and starts a driver service. | Section 7 |
| Defense Evasion | T1055.012 Process Injection: Process Hollowing | Shellcode handler can inject into a host process. | Section 7 |
| Defense Evasion / Execution | T1620 Reflective Code Loading | Manual PE loading path for the DLL handler. | Section 7 |
| Collection | T1113 Screen Capture | Chunked PNG screenshot exfiltration via the task-results message. | Section 7 |
| Exfiltration | T1041 Exfiltration Over C2 Channel | Task results and screenshot chunks exfiltrated over the same encrypted C2 channel. | Q11, section 7 |
Native Audit-Log Hunts (non-CQL)
Proxy / web gateway
- Search proxy access logs for HTTPS POST requests whose path matches
/<prefix>/v[1-9]/<action><resource>where prefix is one ofapi,webhook,metrics,public,internal, action issetorget, and resource is one ofConfig,Status,Profile,Settings,Preferences,Token,Metadata,Connection,Timeout,Features. A single client hitting several of these path shapes at a steady interval is the loader's registration/poll cycle. - Filter on the two documented loader user-agent strings:
Mozilla/5.0 (Windows NT %d.%d; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.3650.96for Windows 10 and above, andMozilla/5.0 (Windows NT %d.%d; Trident/7.0; rv:11.0) like Geckofor Windows 8, where%d.%dis the actual Windows major/minor version. - Look for a steady beacon rhythm consistent with the documented sleep timers: roughly 160 seconds after a failed registration or poll (also triggers C2 rotation to one of the other three domains), and roughly 600 seconds after a successful poll/task cycle.
- If your proxy or firewall can TLS-inspect the session, the plaintext-before-encryption structure is a Salsa20 key/nonce header (16-byte key, 8-byte nonce on client requests; 32-byte key, 8-byte nonce on server responses) followed by an RSA signature and ciphertext length fields, then 1111 to 9999 bytes of random padding. This shape is unusual enough to fingerprint even without breaking the encryption.
DNS resolver
- Query resolver logs for the four named domains in section 4 over your longest retention window. DCSO notes it found additional samples with different embedded C2 infrastructure, so treat the four names as a floor, not a ceiling.
- Flag repeated NXDOMAIN or fast domain-rotation patterns from a single client immediately following a resolution of one of the four known domains: this is the loader's documented C2-rotation-on-failure behavior.
Email gateway
- Search for a sudden, sharp increase in inbound mail volume to a single mailbox in a short window (email bombing), especially newsletter or mailing-list signup confirmations, which is a common bombing technique.
- Cross-reference any mailbox that received an email-bombing pattern against subsequent inbound or outbound calls, help-desk tickets, or remote-assistance session logs within the following hours.
Remote-assistance tooling
- Audit Microsoft Quick Assist (and AnyDesk, if present in your estate) session logs for sessions initiated by a standard user shortly after an email-bombing event, without a corresponding IT ticket opened beforehand by the user.
- Confirm your help desk has, and staff actually follow, an out-of-band identity-verification step before starting any unsolicited remote-assistance session.
Windows endpoint (Sysmon / native)
- Sysmon Event ID 7 (Image Loaded):
rnpkeys.exeloadingrnp.dllfromC:\ProgramData\keyroll. This is the cleanest sideloading signal and Falcon's Custom IOA rule types are the closest native equivalent (section 9). - Sysmon Event ID 11 (File Create): any of
rnpkeys.exe,rnp.dll, ortdwp.dllcreated underC:\ProgramData\keyroll. - Sysmon Event ID 1 (Process Create) with a command line invoking
schtasks.exe /createand a task name ofkeyroll, as a cross-check against the nativeScheduledTaskRegisteredevent used in Q4. - Enumerate
C:\ProgramDatafor any subdirectory containing exactly the triadrnpkeys.exe,rnp.dll,tdwp.dll, regardless of the parent folder name, in case a future build renames the drop directory. Playbook 1 in section 13 does this estate-wide.
CrowdStrike LogScale CQL Hunt Queries
None of these queries carry an in-query time filter. Set the window with the console time picker; the intended lookback is recorded in each card as a // LOOKBACK: comment. For this campaign use 90 days minimum, since DCSO reports finding additional samples with independently rotated C2 infrastructure.
Looks for: DNS resolution of the four C2 domains recovered from the decrypted embedded config and confirmed by two independent sources. There is no benign path to these names. Run this first.
// HUNT: Sauron Loader confirmed C2 domain resolution // MITRE: T1071.001 | CONF: high FP: low COST: low // REQUIRES: DnsRequest telemetry // FALSE POSITIVES: none expected; no legitimate resolver path exists for these hostnames // LOOKBACK: 90d (set in the console time picker) #event_simpleName=/^(DnsRequest|SuspiciousDnsRequest)$/ | DomainName=/^([a-z0-9_-]+\.)*(namsb-show\.com|quinlantours\.com|virtual-magic\.com|lahaina-shores\.com)$/i | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, DomainName]) | sort(@timestamp, order=desc, limit=500)
Looks for: the exact side-load host binary running from the exact hardcoded directory the MSI drops it into. rnpkeys.exe is a real Mozilla RNPGP utility, but it has no legitimate reason to run from C:\ProgramData\keyroll. This combination of name and path is the single highest-fidelity signal in this pack.
// HUNT: Sauron Loader side-load host executing from its hardcoded drop directory // MITRE: T1574.002, T1036.005, T1218.007 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: none expected; rnpkeys.exe has no legitimate reason to run from ProgramData\keyroll // LOOKBACK: 90d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^rnpkeys(\.exe)?$/i | ImageFileName=/\\ProgramData\\keyroll\\/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, SHA256HashData, CommandLine]) | sort(@timestamp, order=desc, limit=500)
Looks for: the MSI-drop moment itself, catching the malicious DLL pair as it is written to disk, which typically happens before the process-execution signal in Q2 fires.
// HUNT: Sauron Loader malicious DLL pair written to the ProgramData\keyroll directory // MITRE: T1027.013, T1574.002 | CONF: high FP: low COST: low // REQUIRES: PeFileWritten or NewExecutableWritten // FALSE POSITIVES: none expected; this exact filename pair dropping into this exact directory is campaign-specific // LOOKBACK: 90d #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\ProgramData\\keyroll\\(rnp|tdwp)\.dll$/i | table([@timestamp, aid, ComputerName, UserName, TargetFileName, SHA256HashData]) | sort(@timestamp, order=desc, limit=500)
Looks for: the exact persistence task name created by tdwp.dll. "keyroll" is not a Windows or common-vendor task name, so this is a near zero-false-positive query.
// HUNT: Sauron Loader "keyroll" scheduled task persistence // MITRE: T1053.005 | CONF: high FP: low COST: low // REQUIRES: ScheduledTaskRegistered telemetry // FALSE POSITIVES: none expected; "keyroll" is not a Windows or common-vendor task name // LOOKBACK: 90d #event_simpleName=/^ScheduledTaskRegistered$/ | TaskName=/^keyroll$/i | table([@timestamp, aid, ComputerName, UserName, TaskName, TaskExecutable, TaskAuthor]) | sort(@timestamp, order=desc, limit=500)
Looks for: the installer-to-execution chain, msiexec.exe as the immediate parent of rnpkeys.exe. A normal RNPGP install is run by a user double-clicking an installer UI or a package manager, not spawned as a direct msiexec child in this pattern.
// HUNT: MSI installer directly spawning the Sauron Loader side-load host // MITRE: T1218.007, T1574.002 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: none expected; msiexec does not legitimately launch rnpkeys.exe as a direct child // LOOKBACK: 90d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^msiexec(\.exe)?$/i | FileName=/^rnpkeys(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine]) | sort(@timestamp, order=desc, limit=500)
Looks for: the vendor-published SHA-256 set for the malicious MSI dropper and the two malicious DLLs. Retrospective hash hunting is the cheapest confirmation you have; run it before anything else if you only have time for one query besides Q1.
// HUNT: Sauron Loader known-bad SHA-256 set (MSI dropper + malicious DLL pair) // MITRE: T1204.002, T1574.002 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2, PeFileWritten or ImageHash // FALSE POSITIVES: malware-analysis workstations and detonation sandboxes // NOTE: the legitimate signed rnpkeys.exe hash is deliberately NOT in this list; see section 4 // LOOKBACK: 180d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten|ImageHash)$/ | in(SHA256HashData, values=[ "ee727d639eaa4ee2e0d7cafbe496e14aaac8df0955d9fb599f2c11dfa1d0f8f2", "5606afdc5191d42f38d3c4f1692eda0a629c88810e29bfe78528733284ad1bf8", "6551293e996d19755ba497f50b30a18c178f0d6e2a73b29ae742b8171e2985b7"]) | table([@timestamp, aid, ComputerName, UserName, #event_simpleName, FileName, ImageFileName, TargetFileName, SHA256HashData]) | sort(@timestamp, order=desc, limit=500)
Looks for: the campaign-agnostic version of Q2, in case a future Sauron Loader build renames the keyroll drop directory. FP: medium; a genuine Thunderbird or standalone RNP install legitimately runs rnpkeys.exe from Program Files during key management, so the tuning line is required before this feeds an alert.
// HUNT: RNP/rnpkeys binary executing outside its legitimate Mozilla RNP install path // MITRE: T1574.002, T1036.005 | CONF: medium FP: medium COST: medium // REQUIRES: ProcessRollup2 // FALSE POSITIVES: a genuine Thunderbird/RNP install running rnpkeys.exe from Program Files during key management // TUNING: append the exclusion stage below to drop the real install path, then baseline the survivors // TUNING: | ImageFileName!=/\\Program Files( \(x86\))?\\(Mozilla Thunderbird|RNP)\\/i // LOOKBACK: 90d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^rnpkeys(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, SHA256HashData]) | sort(@timestamp, order=desc, limit=500)
Looks for: the campaign-agnostic version of Q4, in case a future build renames the keyroll task. Sorted ascending so the rarest task/executable pairs surface first. FP: medium; plenty of legitimate vendor agents install a scheduled task under ProgramData.
// HUNT: Scheduled task launching an executable from a non-standard ProgramData subfolder // MITRE: T1053.005 | CONF: medium FP: medium COST: medium // REQUIRES: ScheduledTaskRegistered telemetry // FALSE POSITIVES: legitimate vendor agents and updaters that install a scheduled task under ProgramData // TUNING: exclude your approved ProgramData vendor subfolders by name, e.g. append // TUNING: | TaskExecutable!=/\\ProgramData\\(Microsoft|Google|Mozilla|Adobe|Dell|HP|Intel|CrowdStrike)\\/i // TUNING: then investigate any TaskExecutable seen on fewer than 3 distinct hosts // LOOKBACK: 90d #event_simpleName=/^ScheduledTaskRegistered$/ | TaskExecutable=/\\ProgramData\\[^\\]+\\[^\\]+\.(exe|dll)$/i | groupBy([TaskName, TaskExecutable], function=[count(aid, distinct=true, as=HostCount), count(as=Regs)], limit=2000) | sort(HostCount, order=asc, limit=200)
Looks for: the documented staging pattern for a directly-downloaded payload, a 6-16 character random name in %TEMP% with one of the loader's ten handler-format extensions. FP: medium-high on its own; installers and browsers do this constantly, so treat a hit as a triage feed and correlate with Q2/Q3 on the same host within a 24-hour window before acting.
// HUNT: Sauron Loader payload staged to %TEMP% with a randomised filename // MITRE: T1105, T1027 | CONF: medium FP: medium-high COST: medium // REQUIRES: PeFileWritten, NewExecutableWritten or ZipFileWritten // FALSE POSITIVES: legitimate installers and browsers routinely stage randomly-named temp files // TUNING: correlate with Q2/Q3 hits on the same aid within a 24h window before treating this as actionable; // TUNING: on its own this query is a triage feed, not an alert // LOOKBACK: 30d #event_simpleName=/^(PeFileWritten|NewExecutableWritten|ZipFileWritten)$/ | TargetFileName=/\\Temp\\[A-Za-z0-9]{6,16}\.(exe|dll|sys|msi|zip|cmd|ps1|vbs|js)$/i | table([@timestamp, aid, ComputerName, UserName, TargetFileName, SHA256HashData]) | sort(@timestamp, order=desc, limit=500)
Looks for: a moved, renamed-directory, or manually-copied build of the loader that keeps the DLL filenames but drops them somewhere other than C:\ProgramData\keyroll. Projects SignInfoFlags as a signing-state hint alongside the hash.
// HUNT: rnp.dll / tdwp.dll written outside the known ProgramData\keyroll drop path // MITRE: T1036.005, T1574.002 | CONF: medium FP: medium COST: medium // REQUIRES: PeFileWritten or NewExecutableWritten // FALSE POSITIVES: none known by filename collision, but confirm SignInfoFlags semantics for your sensor version first // TUNING: ⚠ validate in tenant -- SignInfoFlags bit meanings are sensor/tenant-version dependent; // TUNING: project and baseline the values your estate actually reports before filtering on a specific bit // LOOKBACK: 90d #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\(rnp|tdwp)\.dll$/i | TargetFileName!=/\\ProgramData\\keyroll\\/i | table([@timestamp, aid, ComputerName, UserName, TargetFileName, SignInfoFlags, SHA256HashData]) | sort(@timestamp, order=desc, limit=500)
Looks for: the network-egress fingerprint of the loader's own process names reaching out on TCP/443 repeatedly, which is what the documented 160-second (failed poll) and 600-second (successful poll) sleep cadence looks like from the outside. FP: medium-high; any legitimate agent that happens to share the directory would match. COST: high; scope the lookback down after tuning.
// HUNT: Repeated HTTPS egress from a Sauron Loader process (C2 poll/registration cadence) // MITRE: T1071.001, T1573.001, T1573.002 | CONF: medium FP: medium-high COST: high // REQUIRES: NetworkConnectIP4 // FALSE POSITIVES: any legitimate updater or agent co-located under the same process names // TUNING: drop known-good egress destinations first, e.g. append a !cidr() stage for your CDN/vendor ranges, // TUNING: then keep groups where Conns is high and the FirstSeen-to-LastSeen span matches multiple poll cycles // LOOKBACK: 30d (this one is expensive; widen only after tuning) #event_simpleName=/^NetworkConnectIP4$/ | ContextBaseFileName=/^(rnpkeys|rnp|tdwp)(\.exe|\.dll)?$/i | RemotePort=443 | groupBy([aid, ComputerName, ContextBaseFileName, RemoteAddressIP4], function=[count(as=Conns), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=2000) | sort(Conns, order=desc, limit=200)
Looks for: the DCSO-documented Type-2 DLL payload handler, which stages a DLL and launches it via rundll32/regsvr32 or a manual PE loader. Catches a downloaded second-stage DLL payload being invoked this way, independent of the initial infection path.
// HUNT: rundll32/regsvr32 invoked against a Sauron Loader component DLL // MITRE: T1218.011, T1218.010, T1574.002 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: none expected; rnp.dll/tdwp.dll are not legitimately invoked via rundll32/regsvr32 // LOOKBACK: 90d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(rundll32|regsvr32)(\.exe)?$/i | CommandLine=/\\(rnp|tdwp)\.dll/i | table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=500)
CrowdStrike Custom IOA Recommendations
Four of the twelve queries are clean enough to promote to Custom IOAs. The rest stay investigate-only until tuned. Build these under Endpoint security > Custom IOA rule groups, start every rule at Detect, and only move to Prevent after a two-week clean baseline.
IOA-1 · Side-load host in its hardcoded drop directory
| Field | Value |
|---|---|
| Rule type | Process Creation |
| Source from Q | Q2 |
| Image filename pattern | .*\\rnpkeys\.exe |
| Path guard | Image filename pattern .*\\ProgramData\\keyroll\\.* |
| Severity | Critical |
| Action | Detect first. Promote to Prevent once confirmed no internal tooling ever stages a legitimate RNPGP binary under this path. |
IOA-2 · "keyroll" scheduled task creation
| Field | Value |
|---|---|
| Rule type | Scheduled Task Registered |
| Source from Q | Q4 |
| Task name pattern | ^keyroll$ |
| Severity | Critical |
| Action | Detect. This name has no known legitimate use; promote to Prevent after a short observation window. |
IOA-3 · MSI-to-sideload execution chain
| Field | Value |
|---|---|
| Rule type | Process Creation |
| Source from Q | Q5 |
| Parent image filename pattern | .*\\msiexec\.exe |
| Image filename pattern | .*\\rnpkeys\.exe |
| Severity | High |
| Action | Detect, then Prevent once confirmed your software-deployment tooling never chains msiexec directly into rnpkeys.exe. |
IOA-4 · rundll32/regsvr32 against a component DLL
| Field | Value |
|---|---|
| Rule type | Process Creation |
| Source from Q | Q12 |
| Image filename pattern | .*\\(rundll32|regsvr32)\.exe |
| Command line pattern | .*\\(rnp|tdwp)\.dll.* |
| Severity | High |
| Action | Detect, then Prevent; no legitimate invocation of these filenames via rundll32/regsvr32 is expected. |
Not promoted, and why
- Q1 / Q6 (domain and hash lookups) — better served by Falcon IOC Management import than by a Custom IOA. Import the CSV in section 10 instead.
- Q3 — the file-write moment overlaps IOA-1's process signal in most incidents and is kept as a scheduled search rather than a duplicate IOA.
- Q7, Q8, Q9, Q10, Q11 — FP medium or higher. Run these as scheduled searches for two weeks and apply the tuning line before considering an IOA.
- The in-memory decryption stage and the Salsa20/RSA protocol content — no Custom IOA rule type reaches them. They are memory-behavioral and protocol-content signals respectively; treat this as a known ceiling, not a gap you can close with more queries.
Machine-Readable IOC Appendix
Read before importing. Every value below traces to a saved snapshot of the DCSO CyTec research and its independent Cyber Security News confirmation. Two-source infrastructure carries severity=critical. The legitimate Mozilla binary is listed for context only and must never be set to a block action.
type,value,action,severity,expiration,description,tags domain,api.namsb-show.com,prevent,critical,2027-03-27,Sauron Loader C2 endpoint,campaign:SauronLoader domain,api.quinlantours.com,prevent,critical,2027-03-27,Sauron Loader C2 endpoint,campaign:SauronLoader domain,api.virtual-magic.com,prevent,critical,2027-03-27,Sauron Loader C2 endpoint,campaign:SauronLoader domain,api.lahaina-shores.com,prevent,critical,2027-03-27,Sauron Loader C2 endpoint,campaign:SauronLoader sha256,ee727d639eaa4ee2e0d7cafbe496e14aaac8df0955d9fb599f2c11dfa1d0f8f2,prevent,critical,2027-03-27,Sauron Loader MSI installer,campaign:SauronLoader sha256,5606afdc5191d42f38d3c4f1692eda0a629c88810e29bfe78528733284ad1bf8,prevent,critical,2027-03-27,Sauron Loader malicious rnp.dll,campaign:SauronLoader sha256,6551293e996d19755ba497f50b30a18c178f0d6e2a73b29ae742b8171e2985b7,prevent,critical,2027-03-27,Sauron Loader malicious tdwp.dll,campaign:SauronLoader # DO NOT BLOCK 194d7e8870ff783ce1e4e4e3015c895cc67ae52fd5e063c89dd1c069400d3991 # That SHA-256 is the LEGITIMATE, genuinely Mozilla-signed rnpkeys.exe utility. # It is a hunt anchor only. Blocking it breaks a real product and stops nothing. # The next campaign build can pick a different signed host binary entirely.
# These survive a C2 rotation or a renamed drop directory. The atomic
# indicators above will not.
DROP_PATH C:\ProgramData\keyroll (hardcoded MSI extraction target)
TRIAD rnpkeys.exe (legit) + rnp.dll (malicious loader) +
tdwp.dll (malicious decrypter/scheduler), all three in
the same directory
SIDELOAD legitimate signed rnpkeys.exe side-loads rnp.dll from
its own directory
DECRYPT_ROUTINE tdwp.dll decrypts rnp.dll's encrypted sections directly
in memory, with a deliberate execution delay
PERSISTENCE scheduled task literally named "keyroll"
C2_URI_SHAPE /prefix/vN/actionResource?params where prefix is one of
api, webhook, metrics, public, internal (N is 1-9)
C2_CRYPTO Salsa20 with a fresh 16-byte key + 8-byte nonce per
client request, RSA-signed; server replies with a
32-byte Salsa20 key
BOT_ID lowercase MD5 hex digest of
COMPUTERNAME + USERNAME + volume_serial
SLEEP_TIMERS 160s after a failed registration/poll (also rotates C2);
600s after a successful poll/task cycle
MSG_TYPES 0x01 registration, 0x02 task poll, 0x03 task results,
0x04 payload retrieval
PAYLOAD_HANDLERS EXE, DLL, driver (.sys), shellcode, MSI, ZIP, CMD,
PowerShell, VBS, JavaScript (10 total)
TEMP_STAGING %TEMP%\ + random 6-16 character name + handler extension
SCREENSHOT_EXFIL PNG captured, chunked into pieces up to 0x4000 bytes,
sent via the same task-results message type
loader Sauron Loader (Malware-as-a-Service, C++) seller alias S4ur0n (leetspeak for "Sauron") market Russian-speaking underground forums drop mechanism MSI installer to C:\ProgramData\keyroll sideload host rnpkeys.exe (genuine Mozilla RNPGP utility, abused) loader dll rnp.dll (encrypted, decrypted in memory by tdwp.dll) decrypter/sched tdwp.dll (persistence via scheduled task "keyroll") publisher DCSO CyTec (primary research, 2026-09-24) corroboration Cyber Security News (2026-09-25, independent) extractor tool DCSO GitHub Blog_CyTec/2026_09__sauron_loader/get_config.py
# Delivery vectors observed: ClickFix fake-prompt pastejacking, and # vishing (email bombing followed by a fake IT-support call, in one # incident directing the victim to open Microsoft Quick Assist). # Policy / process checks Help desk has a documented out-of-band caller-identity verification step Y/N Standard users can start Quick Assist / remote-assist sessions unattended Y/N Mail gateway flags abnormal inbound volume spikes to a single mailbox Y/N Standard users can install MSI packages without elevation Y/N # Policy values to verify HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated = 0 HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated = 0 HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\DisableMSI = 2 # Defender ASR rules to enable in Block mode D3E037E1-3EB8-44C8-A917-57927947596D Block JS/VBS launching downloaded executable content 5BEB7EFE-FD9A-4556-801D-275E5FFC04CC Block execution of potentially obfuscated scripts D4F940AB-401B-4EFC-AADC-AD5F3C50688A Block Office apps creating child processes
Detection Validation Gates
Gate 1 — Telemetry ready
- Confirm
ScheduledTaskRegisteredevents are present estate-wide before trusting a clean result from Q4, Q8, or Q12:#event_simpleName=/^ScheduledTaskRegistered$/ | groupBy([ComputerName], function=count(as=n), limit=5000). A host group returning zero is invisible to the persistence queries. - Confirm
DnsRequestis flowing before trusting Q1's silence. - Confirm
PeFileWrittenorNewExecutableWrittenis enabled before trusting Q3, Q9, or Q10's silence. - Confirm your DNS resolver and proxy retention actually covers 90 days. If it covers 30, record that in the hunt ticket rather than reporting a clean hunt.
Gate 2 — Benign baseline
- Before enabling Q7 or Q8 as a scheduled search, confirm whether your estate has a legitimate Thunderbird/RNP deployment or any scheduled tasks that legitimately install under
ProgramData, and add the tuning exclusion in the card before promoting either to an alert. - Run Q11 for one full week first and inspect the
Connsdistribution; anything that looks like normal telemetry or update-check traffic belongs in the CIDR/vendor-range exclusion, not in the alert.
Gate 3 — Confirm the finding, not just the query
- A hit on Q2, Q3, Q4, or Q5 is high-confidence on its own; still pull the full directory listing of
C:\ProgramData\keyrollbefore isolating, since the loader may already have staged an additional payload there. - A hit on Q7, Q8, Q9, Q10, or Q11 alone is not sufficient to declare compromise; corroborate against Q1, Q2, Q4, or Q6 on the same host before escalating.
Hardening — Tiered
Each control names the MITRE mitigation it satisfies and the platform authority that defines it. Controls are ordered by leverage against this specific chain, not by comprehensiveness.
- Block the four confirmed C2 domains at DNS and proxy. Import the section 10 CSV into Falcon IOC Management and add the same domains to your resolver's denylist. MITRE M1037 Filter Network Traffic. Verify: resolve each name from a user subnet and confirm NXDOMAIN or sinkhole.
- Deny execution from unexpected ProgramData subdirectories. An AppLocker or WDAC deny rule targeting non-vendor executables running from
%ProgramData%\*removes the exact drop-and-run pattern this loader depends on. MITRE M1038 Execution Prevention; CIS Microsoft Windows Benchmark application-control section; Microsoft Security Baseline. Verify: stage a benign EXE under a non-approved ProgramData subfolder and confirm it is blocked. - Require out-of-band identity verification for any unsolicited IT-support contact. The vishing chain depends entirely on the victim trusting a cold caller. Publish and drill a verification procedure (callback to a known internal extension, ticket-number cross-check) before any remote-assistance session is granted. MITRE M1017 User Training. best practice, no formal benchmark covers social-engineering process controls directly.
- Restrict who can initiate or accept Microsoft Quick Assist sessions. At least one DCSO-observed incident used Quick Assist as the remote-access vector after the fake support call. MITRE M1042 Disable or Remove Feature or Program. Verify: confirm Quick Assist is removed or policy-restricted on standard-user endpoints outside an active, ticketed support session.
- Enable the three Defender ASR rules listed in section 10 in Block mode. The JS/VBS and Office child-process rules cut off two of the ten documented payload-handler execution paths. MITRE M1038, M1040 Behavior Prevention on Endpoint; Microsoft Defender ASR documentation. Verify:
Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids. - Alert on email-volume anomalies per mailbox. Email bombing is the documented precursor to the vishing call in this campaign. MITRE M1031 Network Intrusion Prevention. best practice, most mail security platforms ship a volume-anomaly rule that is disabled by default.
- Remove non-admin MSI install rights. Set
AlwaysInstallElevated=0in both hives andDisableMSI=2for standard users. The ClickFix and vishing chains both rely on a user (or an attacker with remote-assist access) being able to run an unmanaged MSI. MITRE M1026 Privileged Account Management, M1038; CIS Windows Benchmark installer section. - Publisher-and-path allowlisting for signed vendor utilities. A WDAC or AppLocker publisher rule that permits
rnpkeys.exe(and other genuine Mozilla/vendor binaries you rely on) only from their real install paths directly defeats this side-load pattern regardless of which signed binary a future build picks. MITRE M1038; CIS Windows Benchmark; Microsoft WDAC design guide. Verify:Get-AppLockerPolicy -Effective -Xmland a copy-to-ProgramData execution test. - Baseline and alert on new scheduled task creation outside a known-good vendor set. Every DCSO-observed Sauron Loader infection persists via exactly one scheduled task. MITRE M1047 Audit. Feeds Q8 and Q12 directly.
- TLS-inspecting proxy on user egress, with a documented exception list. Without it, the C2 URI shape and Salsa20/RSA header structure in section 7 are unavailable to you, and the loader's beacon looks like any other HTTPS traffic. MITRE M1020 SSL/TLS Inspection.
- Simulated vishing / email-bombing tabletop exercise for the help desk. The technique's reported 72% success rate in industry reporting on this class of attack means a documented process alone is not enough; staff need to have practiced saying no. MITRE M1017 User Training.
- WDAC in enforcement mode across the managed estate. Application control is the only control in this list that defeats an unknown future Sauron Loader build on the day it ships, regardless of which signed binary or drop directory it uses. Audit mode first, then enforce ring by ring. MITRE M1038; Microsoft WDAC deployment guidance.
- Retention uplift for DNS, proxy, and remote-assistance session logs to 12 months. DCSO reports finding additional samples with rotated infrastructure; a 30-day retention window would report a live compromise as clean. MITRE M1047 Audit. best practice, retention targets are regulatory, not benchmark-defined.
- Formalize a help-desk impersonation runbook as part of the broader incident-response plan. Vishing followed by fake IT support has been used to deliver DarkGate and by Black Basta affiliates historically, and this campaign confirms it is still a live, effective initial-access technique. MITRE M1017.
Deployable Playbooks
Playbook 1 — Sweep for the Sauron Loader triad (PowerShell)
Finds the drop directory or any folder anywhere on disk containing all three loader filenames together, in case a future build renames the keyroll directory. Read-only; run it estate-wide before you change anything.
# Run as SYSTEM or an admin. Read-only enumeration.
$known = 'C:\ProgramData\keyroll'
if (Test-Path $known) {
Get-ChildItem -Path $known -File -ErrorAction SilentlyContinue | ForEach-Object {
[pscustomobject]@{
Host = $env:COMPUTERNAME
Path = $known
File = $_.Name
Sha256 = (Get-FileHash $_.FullName -Algorithm SHA256).Hash
}
}
}
# Broader sweep: any ProgramData subfolder containing all three filenames,
# in case a future build renames the "keyroll" directory itself.
Get-ChildItem 'C:\ProgramData' -Directory -ErrorAction SilentlyContinue | ForEach-Object {
$dir = $_.FullName
$has = @('rnpkeys.exe','rnp.dll','tdwp.dll') | Where-Object {
Test-Path (Join-Path $dir $_)
}
if ($has.Count -eq 3) {
[pscustomobject]@{
Host = $env:COMPUTERNAME
Directory = $dir
Triad = 'CONFIRMED'
}
}
}
# All three filenames together in one ProgramData subfolder is the Sauron
# Loader triad regardless of the directory name. Collect the folder and the
# scheduled task list before isolating.
Playbook 2 — Audit for the "keyroll" scheduled task (PowerShell)
Cross-checks the native ScheduledTaskRegistered telemetry in Q4 against the local task scheduler directly. Read-only.
Get-ScheduledTask | Where-Object { $_.TaskName -match 'keyroll' } | ForEach-Object {
$info = Get-ScheduledTaskInfo -TaskName $_.TaskName -TaskPath $_.TaskPath
[pscustomobject]@{
Host = $env:COMPUTERNAME
TaskName = $_.TaskName
TaskPath = $_.TaskPath
Action = ($_.Actions | ForEach-Object { $_.Execute }) -join ';'
Arguments = ($_.Actions | ForEach-Object { $_.Arguments }) -join ';'
State = $_.State
LastRun = $info.LastRunTime
}
}
Playbook 3 — Deny execution from ProgramData (AppLocker, GPO)
Deploy in Audit mode for 48 hours first; the report tells you which legitimate applications you are about to break before you enforce.
# 1. Create or edit a GPO linked to your workstation OU. # 2. Computer Configuration # -> Policies # -> Windows Settings # -> Security Settings # -> Application Control Policies # -> AppLocker # -> Executable Rules # 3. New Rule: Action = Deny, User = Everyone, Condition = Path # %OSDRIVE%\ProgramData\* # Then add Exceptions for your known-good vendor subfolders # (Microsoft, your EDR vendor, approved line-of-business agents). # 4. Repeat under "DLL Rules" with the same path and exceptions. DLL rules # are what actually stop the sideload; the executable rule alone leaves # rnp.dll loadable by rnpkeys.exe even if rnpkeys.exe itself is denied. # 5. Set enforcement to "Audit only", collect for 48h, then switch to # "Enforce rules".
Playbook 4 — Help-desk vishing verification checklist (process)
A one-page script for help-desk and IT staff to challenge an unsolicited "IT support" contact, especially one that follows an email flood.
1. Did the user open a ticket BEFORE this contact arrived? If no, treat as unsolicited. 2. Call the user back on a number from the internal directory, never a number the caller provided. 3. Never accept a Quick Assist / AnyDesk / remote-assist session initiated in response to an unsolicited call or a "fix it yourself" prompt. 4. Never read out, or ask the user to enter, a one-time code or session PIN to someone who called them first. 5. If a recent inbox flood is confirmed, treat any IT-support contact in the following 24 hours as suspicious by default and escalate to the security team before any remote access is granted.
Containment & Incident Response Runbook
- Isolate, don't kill, the affected host first. Network-contain via Falcon host isolation rather than terminating the process; killing
tdwp.dll's scheduler mid-cycle can complicate forensic timing but the host should stop reaching the C2 immediately. - Preserve
C:\ProgramData\keyrollbefore remediation. Copy the full directory listing, all three files, and their hashes off the host. Confirm whether an additional payload has already been staged there via the message-type-4 payload-retrieval mechanism. - Pull the scheduled task definition for "keyroll."
schtasks /query /tn keyroll /xmlbefore deleting it, to capture the exact executable path and arguments for the case file. - Identify the entry vector. Check whether the user reports a recent email-bombing event, an unsolicited IT-support call, or a ClickFix-style prompt they were told to run. This determines whether the help-desk verification gap (hardening item 3) or the mail-flow anomaly detection (hardening item 6) needs the more urgent fix.
- Check for a granted remote-assistance session. Review Quick Assist, AnyDesk, or similar tool logs around the infection window for a session the user did not initiate themselves.
- Hunt laterally with Q1, Q2, Q4, and Q6 estate-wide before declaring scope. A single confirmed host rarely means a single victim; the loader's registration message reports domain-join status, so check whether the host is domain-joined and, if so, whether credentials used on it require rotation.
- Rotate credentials used on or near the compromised host if there is any indication of screenshot exfiltration (task-results messages with non-zero
total_data_length) or a downloaded credential-theft payload via the DLL or shellcode handler. - Remove the triad and the scheduled task, then re-image if the loader executed a downloaded second-stage payload. A confirmed hit on Q9 (temp-staged payload) or Q12 (rundll32/regsvr32 against a component DLL) raises this from "clean the loader" to "assume second-stage compromise."
- Block the four C2 domains estate-wide if not already enforced, and check DNS logs for any other host that has ever resolved them.
- File the hunt ticket in section 16 with the confirmed entry vector, host count, and whether a second-stage payload executed, before closing the incident.
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Hardening | Coverage |
|---|---|---|---|---|---|
| T1071.001 | C2 domain resolution and HTTPS beacon | Q1, Q11 | — | Item 1 | Good |
| T1574.002 | DLL side-loading via rnpkeys.exe | Q2, Q3, Q5, Q7, Q12 | IOA-1, IOA-3, IOA-4 | Items 2, 8 | Good |
| T1036.005 | Malicious DLLs masquerading as real RNPGP components | Q7, Q10 | IOA-1 | Item 8 | Partial — filename overlap with a genuine component is unavoidable by design |
| T1218.007 | MSI-to-sideload execution chain | Q5 | IOA-3 | Item 7 | Good |
| T1027.013 | Encrypted sections shipped inside rnp.dll | Q3 | — | — | Partial — write event covers the drop, not the encryption itself |
| T1140 | In-memory decryption of rnp.dll by tdwp.dll | — | — | Item 12 | Gap — no discrete Falcon event for the decrypt stage; sensor memory scanning is the counter |
| T1053.005 | "keyroll" scheduled task persistence | Q4, Q8, Q12 | IOA-2 | Item 9 | Good |
| T1667 / T1566.004 | Email bombing followed by voice-phishing IT-support impersonation | — | — | Items 3, 6, 11, 13 | Gap — endpoint telemetry does not cover this; section 7 mail-gateway hunts and the hardening process controls are the coverage |
| T1219 | Quick Assist / remote-assist tool granted to the caller | — | — | Item 4 | Partial — depends on whether remote-assist tools are centrally logged |
| T1573.001 / T1573.002 | Salsa20 + RSA encrypted C2 protocol | Q11 | — | Item 10 | Partial — content-level visibility requires TLS inspection; volume/cadence signal only otherwise |
| T1105 | Payload retrieval and temp staging | Q9 | — | — | Partial — high baseline noise; correlation-dependent, see Q9 tuning |
| T1218.011 / T1218.010 | rundll32/regsvr32 DLL payload handler | Q12 | IOA-4 | — | Good |
| T1113 / T1041 | Chunked PNG screenshot exfiltration over the C2 channel | Q11 (volume signal only) | — | — | Gap — no discrete Falcon event distinguishes screenshot chunks from ordinary task results |
Twelve queries and four Custom IOAs cover the drop, side-load, persistence, and one payload-handler technique at Good or Partial. The remaining gaps cluster in three places, for three different reasons: the in-memory decryption stage was engineered specifically to avoid endpoint-visible primitives, the social-engineering delivery vectors sit upstream of any endpoint telemetry entirely, and the encrypted C2 content requires TLS inspection this pack cannot assume every reader has deployed. Section 12's application-control item (13) and mail-gateway/help-desk process controls (items 3, 6, 11) are the counters for the delivery gap; sensor memory scanning is the counter for the decryption gap. Before reporting a clean hunt, complete Gate 1 in section 11: a query that returns nothing because the telemetry never arrived is not a negative result.
Hunt Summary Ticket
TITLE: Sauron Loader - MaaS DLL side-loading via rnpkeys.exe/rnp.dll/tdwp.dll,
keyroll persistence, ClickFix/vishing delivery hunt
SEVERITY: High - active MaaS campaign against German organizations, confirmed
intrusions, seller actively advertises to further customers
SCOPE: All Windows endpoints; help-desk and remote-assistance tooling;
mail gateway; DNS resolver and proxy logs. Minimum 90-day lookback.
HYPOTHESIS: A host has rnpkeys.exe, rnp.dll and tdwp.dll dropped by an MSI into
C:\ProgramData\keyroll, with rnpkeys.exe side-loading rnp.dll and a
scheduled task named "keyroll" providing persistence. Corollary: any
host resolving one of the four named C2 domains is compromised.
QUERIES: Q1 confirmed C2 domain resolution CONF high / FP low RUN FIRST
Q2 side-load host in drop directory CONF high / FP low RUN SECOND
Q3 malicious DLL pair written to disk CONF high / FP low
Q4 "keyroll" scheduled task CONF high / FP low RUN SECOND
Q5 msiexec spawning side-load host CONF high / FP low
Q6 known-bad SHA-256 set CONF high / FP low RUN FIRST
Q7 rnpkeys.exe outside install path CONF med / FP med
Q8 scheduled task in non-standard ProgramData CONF med / FP med
Q9 randomised %TEMP% payload staging CONF med / FP med-high
Q10 component DLL outside known path CONF med / FP med
Q11 beacon cadence egress CONF med / FP med-high
Q12 rundll32/regsvr32 against component DLL CONF high / FP low
DO FIRST: 1. Import the section 10 CSV into Falcon IOC Management.
2. Block the four C2 domains at DNS and proxy.
3. Run Q1, Q2, Q4 and Q6 across maximum retention.
4. Run playbook 1 estate-wide to inventory ProgramData for the triad.
5. Complete Gate 1 in section 11 before reporting any query clean.
FINDINGS: [ ] Q1 hits ............ hosts: ______ domains matched: ______
[ ] Q2/Q4 hits ......... hosts: ______ triad confirmed: Y / N
[ ] Q6 hits ............ hosts: ______ which hash(es): ______
[ ] Entry route ........ ClickFix / vishing+QuickAssist / unknown
[ ] Second-stage payload Y / N handler type: ______
[ ] Screenshot exfil indication Y / N
GAPS: - In-memory decryption stage (tdwp.dll decrypting rnp.dll) is not a
discrete Falcon event; application control is the counter.
- Email bombing and voice-phishing delivery sit upstream of endpoint
telemetry; mail-gateway and help-desk process controls are the
coverage, not a query.
- Salsa20/RSA C2 content needs TLS inspection to read; without it,
only connection volume and cadence are visible.
- Record your actual DNS/proxy retention here. If under 90 days,
this hunt is inconclusive, not clean: ______
ACTIONS: [ ] Immediate hardening tier deployed (section 12, items 1-6)
[ ] IOA-1 through IOA-4 created at Detect severity
[ ] Q7, Q8, Q9, Q10, Q11 baselined for two weeks and tuned
[ ] Help-desk vishing verification checklist (playbook 4) distributed
[ ] AlwaysInstallElevated / DisableMSI policy values confirmed
OWNER: ______________________
VERSION: v1.0 (2026-09-27)
Changelog
References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| 1 | DCSO CyTec — Sauron Loader: A New Loader Lurking in Underground Forums | Primary research: attack chain, decrypted config layout, C2 protocol, TLV message format, payload handlers, sleep timers, domain/hash IOC set, full ATT&CK mapping. Full text retrieved via the malware.news community mirror; the Medium URL returns HTTP 403 to automated fetch. | 2026-09-27 |
| 1 | Cyber Security News — Sauron Loader Malware Uses DLL Side-Loading and In-Memory Decryption to Evade Detection | Independent confirmation of the attack chain and the full IOC table; qualifies the block-eligible indicators under this pack's two-source rule. | 2026-09-27 |
| 2 | Cryptika Cybersecurity | Syndicated republish of the Cyber Security News article; corroboration only, not counted as an independent second source. | 2026-09-27 |
| 2 | Mallory.ai — Sauron Loader Sold to Russian-Speaking Criminals Targets German Organizations | Narrative corroboration of the actor alias, MaaS model, and targeting restrictions. Atomic indicator values are masked on the public page and were not sourced from it. | 2026-09-27 |
| Ref | DCSO GitHub — Blog_CyTec/2026_09__sauron_loader | Config-extraction tool and MISP event; corroborates the embedded-config field layout. | 2026-09-27 |
| Ref | MITRE ATT&CK | Technique and mitigation identifiers throughout sections 6 and 12 | 2026-09-27 |
| Ref | Microsoft Defender — Attack Surface Reduction rules reference | ASR rule GUIDs in sections 10 and 12 | 2026-09-27 |
| Ref | CIS Benchmarks | Windows application-control and installer baselines | 2026-09-27 |
Source snapshots for every cited source are stored alongside this file in Sauron-Loader-Hunt-sources/. Every atomic indicator shipped in section 10 traces to one of them.