KREMLIN / REF9334 — Banking Browser-Extension Hunt
Executive Summary
KREMLIN is a Brazilian banking-malware toolkit — named by its own author "Kr3mlin4rt1st," with no actual Russian nexus — that Elastic Security Labs has tracked as REF9334 across seven campaigns since May 2025 (reported 2026-09-15). Victims manually run a JavaScript file disguised as a bank receipt or invoice; a multi-stage loader checks for sandboxes, establishes scheduled-task persistence, resolves command-and-control locations from an Ethereum smart contract or Cloudflare Workers, and drops a C++ installer that sideloads through a legitimate SentinelOne binary.
The operation's signature capability is forcing a malicious Chrome/Edge extension into the browser without the Web Store and without user consent: the installer force-closes the browser, extracts Chromium's OSCrypt and App-Bound encryption keys (via DPAPI and a debugged browser process), then rewrites the profile's Secure Preferences file — regenerating the HMACs and encrypted hashes Chromium itself uses to prove the file hasn't been tampered with. The browser loads the extension as though the user had approved it. The extension then harvests cookies, session storage, browsing history, screenshots, and keystrokes from roughly a dozen Brazilian banks, exfiltrating an RC4-encrypted archive to attacker infrastructure. Elastic disrupted over 1,500 infections (98.75% in Brazil) by sinkholing the malware's own sandbox-canary domain.
Falcon telemetry cannot see inside the extension's in-browser JavaScript (keylogging, screenshot capture, cookie theft happen entirely in-page), so detection here is necessarily about the surrounding host behavior: the scheduled task, the DLL sideload, the debugger-attached browser process, and the Secure Preferences write itself. That gap is exactly why the hardening section (§12–13) — extension allowlisting, blocking the three known malicious extension IDs, and disabling unmanaged Developer Mode — carries as much weight in this pack as the hunt queries do.
Defender priority: hunt for (1) Chrome/Edge Secure Preferences modified by a non-browser process and (2) chrome.exe/msedge.exe launched with --remote-debugging-port. Both behavioral signals catch the technique regardless of which of the 20+ rotating C2 domains this campaign uses next — infrastructure IOCs alone will not survive the next rebrand (donalurdes → maria → haria → cremeb → zaviro/volmira already happened once).
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| Primary | Elastic Security Labs — "The extension you never installed: KREMLIN forges Chrome's own integrity checks to steal banking sessions" | Full technical report: 7-campaign timeline, IOC appendix (domains/IPs/hashes/extension IDs), Ethereum contract evolution, Secure Preferences HMAC-forgery mechanics, SentinelOne DLL sideload, PigSyscall usage, victim count (1,515 systems, 98.75% Brazil) | Yes |
| Secondary | The Hacker News — "KREMLIN Banking Malware Hijacks Chrome and Edge to Steal Credentials and Session Tokens" | Corroborates the extension ID (ndpbidppejfanjbhfgjlohfanbfbklff), current C2 domains (volmira.site, zaviro.online, luizestrelhashapr.online), the Ethereum contract address, and the "Phantom Extension"/HMAC-forgery description | Yes (corroboration only — raises confidence, does not add new atomics) |
| Secondary | GBHackers — "KREMLIN Banking Malware Bypasses Chrome Security to Steal Banking Sessions" | Corroborates the scheduled task name, the SentinelOne sideload, the RC4/SystemFunction032 exfil detail, and the Ethereum dead-drop contract; explicitly recommends hunting Secure Preferences changes, Developer Mode activation, and browser debugging activity | Yes (corroboration only) |
Decisions made against the operator brief: two indicators supplied in the tasking brief could not be traced to any fetched source text after a targeted re-search — IP 45.90.13[.]77 (only 45.90.13.210 appears in the Elastic report; same /24, different host, not corroborated) and Cloudflare Workers hostname find-postman.ddesdokww.workers.dev (no fetched source mentions this string at all). Per the no-invented-IOC rule, both are omitted from this pack rather than shipped on the brief's word alone. The Workers hostname version.checkeligibitily.workers.dev is likewise not shipped as an atomic block/detect entry — the source only describes the resolver as serving "version, graph subdomains" without giving the full hostname string verbatim — but graph.checkeligibitily.workers.dev IS shipped, because that exact string appears in the source's quoted resolver URL.
Trust-the-source resolution: the operator brief's lure-filename pattern (ComprovanteBank_DD-MM-YYYY.js) differs slightly from what Elastic actually documented (COMPROVANTE_{Bank}_DD-MM-YYYY.{10 digits}.js and ComprovanteOriginal_{Bank}_DD-MM-YYYY.{10 digits}.js). This pack uses the source's actual pattern throughout.
Prompt-injection check: none of the three fetched sources contained any text directed at the research agent (no embedded instructions, no "ignore previous instructions," no claimed authorization to skip steps or fetch additional URLs). All three are cited normally.
Hunt Brief & Attack Chain
Hunt Hypotheses
- (High) Persistence via a scheduled task named
MicrosoftNodeRuntimeUpdaterorAcrobatBrowserExtensionis present on hosts compromised by this loader family. - (High) Chrome/Edge
Secure Preferencesfiles are being modified by a process other than the browser itself — the mechanical fingerprint of forced extension registration. - (High) chrome.exe/msedge.exe processes are being launched with remote-debugging flags to extract OSCrypt/App-Bound keys via
ReadProcessMemory. - (High) A binary named
SentinelMemoryScanner.exeis running from a path outside a genuine SentinelOne installation (DLL sideload staging). - (Medium)
node.exeis being spawned underconhost.exe --headless, matching the first-stage persistence execution pattern. - (Medium)
wscript.exe/cscript.exeare executing JavaScript files whose names match the COMPROVANTE banking-receipt lure pattern. - (High) Endpoints are resolving DNS for known KREMLIN/REF9334 C2 infrastructure (current or historical).
- (High) One of the three known malicious extension IDs is present in a Chrome/Edge profile.
Attack Chain
| Step | Telemetry | Hunt Angle |
|---|---|---|
| 1. Delivery | Email/messenger attachment or download | JavaScript file named to look like a bank receipt/invoice (no native Falcon email telemetry — pair with mail-gateway/EDR-for-email logs) |
| 2. Execution | ProcessRollup2 (wscript.exe/cscript.exe) | Q3 — lure filename pattern match |
| 3. Sandbox/VM evasion | ProcessRollup2 (process enumeration), no dedicated event | Not directly queryable; covered by downstream persistence/DLL hunts |
| 4. Persistence | ScheduledTaskRegistered | Q1 — named-task hunt |
| 5. First-stage relaunch | ProcessRollup2 (conhost.exe → node.exe) | Q2 |
| 6. C2/payload resolution | Ethereum smart contract read / Cloudflare Workers — no Falcon telemetry (on-chain RPC call, not endpoint DNS) | Gap — see §15 |
| 7. Installer + DLL sideload | ProcessRollup2, PeFileWritten/NewExecutableWritten | Q6, Q7 |
| 8. Credential-store key theft | ProcessRollup2 (debugger-attached chrome/msedge) | Q5 |
| 9. Forced extension install | CriticalFileModified (Secure Preferences / Extensions path) | Q4, Q9 |
| 10. Collection (cookies/keys/screenshots/keylog) | In-browser JavaScript — no Falcon telemetry | Gap — see §15; mitigate via hardening §12 |
| 11. Exfiltration | NetworkConnectIP4/DnsRequest to C2 | Q8 |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| Domain | volmira.site | High | Detect | Current extension C2 (version check, download, exfil) | 2027-03-16 |
| Domain | zaviro.online | High | Detect | Current installer C2 + fingerprint upload | 2027-03-16 |
| Domain | luizestrelhashapr.online | High | Detect | Extension C2, resolved via Ethereum smart contract | 2027-03-16 |
| Domain | granderevolucao.store | Medium | Detect | Installer payload host (single-sourced) | 2026-12-16 |
| Domain | cremeb.com | Medium | Detect | Cremeb-campaign C2 + QR-extension config API (single-sourced) | 2026-12-16 |
| Domain | californicationdetroit.com | Medium | Detect | Backup, Cloudflare-proxied infrastructure (single-sourced) | 2026-12-16 |
| Domain | graph.checkeligibitily.workers.dev | Medium | Detect | Cloudflare Workers C2 resolver — full hostname only, workers.dev is shared infra | 2026-12-16 |
| Domain (historical) | codecaudiog.site, codecvideowin.online, acrobat-updater.com, lojinhadoluiz.online, donalurdesconfeitos.site, marialurdes.site, harialurdes.site | Medium | Hunt | Prior-campaign C2 (Jun 2025 – Mar 2026); low activity expected now but useful for retro-hunting | 2026-10-16 |
| IPv4 | 185.221.23.133 | Medium | Detect | Codecaudiog-campaign PULSAR RAT C2 | 2026-12-16 |
| IPv4 | 144.172.112.239 | Medium | Detect | Acrobat-campaign PULSAR RAT C2 | 2026-12-16 |
| IPv4 | 45.90.13.210 | Medium | Detect | Acrobat-campaign PULSAR RAT alternate C2 | 2026-12-16 |
| IPv4 | 37.16.74.100 / 37.16.74.34 | Medium | Detect | Cremeb-campaign PULSAR RAT C2 | 2026-12-16 |
| IPv4 | 178.92.162.38 | Medium | Detect | REMCOS RAT C2 (Ethereum-transition campaign) | 2026-12-16 |
| SHA-256 (x8) | see §10 Falcon IOC CSV | Medium | Detect | Installer, extension, PowerShell installer, JS loaders — all single-sourced (Elastic) | 2026-12-16 |
| Extension ID | ndpbidppejfanjbhfgjlohfanbfbklff | High | Block install | "AVSync System Inc" — corroborated by 2 sources | 2027-03-16 |
| Extension ID | djodclnjknbpambeaaapadmdfhmbpeog | Medium | Block install | "FrameSync Driver System" masquerade | 2026-12-16 |
| Extension ID | cdgcjghdeinagopbaobhmaefigoafaaa | Medium | Block install | QR-code themed extension | 2026-12-16 |
| Mutex | ClarinhoQueSim-XEDA2O | Medium | Hunt | Ethereum-transition-era installer mutex | 2026-12-16 |
| Scheduled task | MicrosoftNodeRuntimeUpdater / AcrobatBrowserExtension | High | Detect | Persistence task names | 2027-03-16 |
| Domain (do NOT block) | creamp1eonlyfans.net | High | Enrich / monitor only | Sandbox-canary domain, now sinkholed by Elastic Threat Command — a hit means an infected host tried to abort; blocking it re-enables the malware's normal execution path | 2026-12-16 |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows endpoint (process/file/task) | Falcon sensor: ProcessRollup2, PeFileWritten, NewExecutableWritten, ScheduledTaskRegistered | High | Low — standard sensor telemetry, on by default |
| Chrome/Edge profile files (Secure Preferences, Local State, Extensions/) | CriticalFileModified via a Falcon Critical File Monitoring / FIM rule scoped to these paths | Critical | High — this rule is not configured out of the box; Q4 and Q9 return nothing until it is (see §11) |
| DNS / network egress | DnsRequest, NetworkConnectIP4 | High | Low, assuming DnsRequest collection is enabled |
| In-browser extension activity (keylogging, screenshots, cookie theft) | None — this happens entirely inside the browser's JS engine | Critical | Total gap for EDR; mitigate via extension-install hardening (§12), not detection |
| Blockchain-based C2 resolution (Ethereum RPC read) | None — an outbound RPC call to a public Ethereum node, indistinguishable from normal dApp/wallet traffic without app-layer proxy inspection | Medium | Total gap; detection falls back to the resolved domains/IPs after the fact (Q8) |
ATT&CK Mapping
| Tactic | Technique | Name | Observed Behavior |
|---|---|---|---|
| Initial Access | T1566.001 | Phishing: Spearphishing Attachment | JavaScript file disguised as a Brazilian-bank payment receipt (COMPROVANTE pattern) |
| Execution | T1204.002 | User Execution: Malicious File | Victim manually double-clicks the .js lure, invoked via wscript.exe/cscript.exe |
| Persistence | T1053.005 | Scheduled Task/Job: Scheduled Task | MicrosoftNodeRuntimeUpdater (logon+1min) / AcrobatBrowserExtension (logon + every 30min) |
| Defense Evasion | T1574.002 | Hijack Execution Flow: DLL Side-Loading | Legitimate SentinelMemoryScanner.exe loads malicious SentinelAgentCore.dll; loader-lock bypass via LdrpWorkInProgress manipulation |
| Persistence / Defense Evasion | T1176 | Browser Extensions | Extension force-registered in Secure Preferences with forged HMACs, bypassing Web Store approval |
| Credential Access | T1555.003 | Credentials from Password Stores: Credentials from Web Browsers | OSCrypt legacy key (DPAPI) + App-Bound key (debugger-attached ReadProcessMemory against chrome.dll) extraction |
| Collection | T1113 / T1056.001 | Screen Capture / Input Capture: Keylogging | In-extension screenshot command; keylogging via input-event listeners + MutationObserver (no EDR visibility) |
| Command and Control | T1102.001 | Web Service: Dead Drop Resolver | Ethereum smart contract setConfig/getConfig serving current C2 domains; Cloudflare Workers as a secondary resolver |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | HTTPS + WebSocket polling to /google_ws/ and /google_api/*.css disguised as static-asset fetches |
| Defense Evasion | T1027 | Obfuscated Files or Information | XOR-encrypted installer strings, reversed-Base64 loader payloads, JPEG-steganography carriers on archive.org |
| Defense Evasion | T1497 | Virtualization/Sandbox Evasion | Process-tool enumeration (60+ security tools), VM artifact checks, network canary domain |
| Exfiltration | T1041 | Exfiltration Over C2 Channel | RC4-encrypted (key = SHA-256 of plaintext) ZIP of browser data sent to /api/savecreds / /api/v1/fingerprint |
Native Audit-Log Hunts
Non-CQL checks that complement the Falcon queries in §8, especially where a Critical File Monitoring rule is not yet deployed.
- Windows Security Event 4698 (scheduled task created) — filter
TaskNameforMicrosoftNodeRuntimeUpdaterorAcrobatBrowserExtension; cross-reference the creating process against known-admin tooling. - Sysmon Event ID 7 (image/DLL load) — flag
SentinelAgentCore.dllloaded by a process whose path is not under the standard SentinelOne install directory. - Sysmon Event ID 11 (FileCreate) — flag writes to
...\User Data\Default\Secure Preferences,...\User Data\Local State, or any...\User Data\Default\Extensions\{extension-id}path where the writing image is notchrome.exeormsedge.exe. - Chrome/Edge policy audit (
chrome://policy/edge://policy) — confirmExtensionInstallBlocklistandExtensionSettingsare actually applied on the endpoint, not merely configured centrally. - chrome://extensions with Developer Mode manually enabled — visually confirm no unpublished/unexpected extension is present; the three known IDs will not show a Web Store listing if inspected.
- DNS/proxy log review for the sinkholed canary domain
creamp1eonlyfans.net— any resolution attempt is a confirmed-infection signal (see the "do NOT block" note in §4/§10). - Manual IR / live-response — enumerate open mutexes for
ClarinhoQueSim-XEDA2Oon a suspect host (no native Windows Event Log source for mutex creation; requires a live-response tool or memory capture).
CrowdStrike LogScale CQL Hunt Queries
Looks for: the two persistence task names KREMLIN's loader registers. FP: none expected — these names are not used by legitimate software.
// HUNT: Scheduled Task Persistence — MicrosoftNodeRuntimeUpdater / AcrobatBrowserExtension // MITRE: T1053.005 // CONF: high FP: low COST: low // REQUIRES: ScheduledTaskRegistered // FALSE POSITIVES: none expected — task names are attacker-chosen, not used by legitimate software #event_simpleName=/^ScheduledTaskRegistered$/ | TaskName=/^(MicrosoftNodeRuntimeUpdater|AcrobatBrowserExtension)$/i | table([ComputerName, UserName, TaskName, TaskExecutable, TaskAuthor, aid])
Looks for: the documented conhost.exe --headless node.exe relaunch pattern used by the first-stage loader. FP: legitimate headless Node.js CI/build agents or Electron-based dev tooling can match this.
// HUNT: conhost.exe --headless Spawning node.exe // MITRE: T1059.007, T1204.002 // CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: legitimate headless Node.js CI/build agents or Electron dev tooling launched via conhost // TUNING: exclude known CI build hosts and approved Electron/Node dev tooling directories via an ImageFileName path exclusion after validating in your tenant #event_simpleName=/^ProcessRollup2$/ | FileName=/^node(\.exe)?$/i | ParentBaseFileName=/^conhost(\.exe)?$/i | CommandLine=/--headless/i | table([ComputerName, UserName, FileName, ParentBaseFileName, CommandLine, aid])
Looks for: Windows Script Host executing a file whose name contains the "comprovante" (Portuguese for "receipt") lure keyword. FP: legitimate finance-team scripts or macros that reference accounting documents named similarly.
// HUNT: Banking-Lure JavaScript via wscript/cscript (COMPROVANTE Pattern) // MITRE: T1566.001, T1204.002 // CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: legitimate accounting/finance scripts or macros that reference "comprovante"-named documents // TUNING: exclude signed/approved accounting-suite installers; if noisy, scope the hunt to endpoints outside the finance department #event_simpleName=/^ProcessRollup2$/ | FileName=/^(wscript|cscript)(\.exe)?$/i | CommandLine=/comprovante/i | table([ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, aid])
Looks for: the mechanical fingerprint of forced extension registration — Secure Preferences rewritten by something other than the browser. Requires a Critical File Monitoring rule covering this path (see §11). FP: enterprise browser-management agents legitimately rewrite this file outside the browser process.
// HUNT: Chrome/Edge Secure Preferences Modified by a Non-Browser Process // MITRE: T1176, T1555.003 // CONF: high FP: medium COST: low // REQUIRES: CriticalFileModified — Falcon Critical File Monitoring rule scoped to "Secure Preferences" under Chrome/Edge User Data profiles // FALSE POSITIVES: enterprise browser-management tools (Chrome Browser Cloud Management, Intune, Workspace ONE) that legitimately rewrite Secure Preferences outside the browser process // TUNING: exclude ContextBaseFileName values for your approved MDM/browser-management agents (e.g. IntuneManagementExtension.exe, CCMExec.exe) after validating them in your tenant #event_simpleName=/^CriticalFileModified$/ | TargetFileName=/Secure Preferences/i | ContextBaseFileName!=/^(chrome|msedge)(\.exe)?$/i | table([ComputerName, UserName, ContextBaseFileName, TargetFileName, aid])
Looks for: chrome.exe/msedge.exe launched with a remote-debugging flag — the precursor to the documented App-Bound key extraction via ReadProcessMemory. FP: web developers and QA/test automation (Selenium, Puppeteer, Playwright) legitimately use this flag.
// HUNT: Chrome/Edge Launched with Remote-Debugging Flags // MITRE: T1555.003, T1140 // CONF: high FP: medium COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: web developers, QA/test automation (Selenium, Puppeteer, Playwright), and RMM tooling that legitimately launch Chrome/Edge with --remote-debugging-port // TUNING: exclude ComputerName values for known dev/QA/CI workstations and build agents; consider scoping the alert to non-engineering OUs #event_simpleName=/^ProcessRollup2$/ | FileName=/^(chrome|msedge)(\.exe)?$/i | CommandLine=/--remote-debugging-(port|pipe)/i | table([ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, aid])
Looks for: the legitimate-named SentinelOne binary running from anywhere other than its real install directory — the setup for sideloading SentinelAgentCore.dll. FP: none expected; if a genuine SentinelOne agent is deployed, validate the standard path first.
// HUNT: SentinelMemoryScanner.exe Running Outside Its Installed Path // MITRE: T1574.002 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: none expected in environments without a genuine SentinelOne agent; where SentinelOne is deployed, confirm the standard install path before relying on this alone #event_simpleName=/^ProcessRollup2$/ | FileName=/^SentinelMemoryScanner(\.exe)?$/i | ImageFileName!=/\\Program Files\\SentinelOne\\/i | table([ComputerName, UserName, ImageFileName, ParentBaseFileName, CommandLine, aid])
Looks for: the malicious sideload DLL dropped outside a legitimate SentinelOne install. FP: none expected outside a genuine SentinelOne install/update in progress.
// HUNT: SentinelAgentCore.dll Written Outside the SentinelOne Install Directory // MITRE: T1574.002 // CONF: high FP: low COST: low // REQUIRES: PeFileWritten or NewExecutableWritten // FALSE POSITIVES: none expected outside a genuine SentinelOne install/update in progress #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/SentinelAgentCore\.dll$/i | TargetFileName!=/\\Program Files\\SentinelOne\\/i | table([ComputerName, UserName, TargetFileName, SHA256HashData, aid])
Looks for: DNS requests to current and historical campaign infrastructure. FP: none expected; these are attacker-registered domains. Refresh this list as infrastructure rotates (see §17 changelog cadence).
// HUNT: DNS Resolution to Known KREMLIN/REF9334 C2 Infrastructure // MITRE: T1071.001, T1102.001 // CONF: high FP: low COST: low // REQUIRES: DnsRequest // FALSE POSITIVES: none expected; domains are attacker-registered and campaign-specific — retire/rotate this list as infrastructure changes #event_simpleName=/^DnsRequest$/ | DomainName=/^(volmira\.site|zaviro\.online|granderevolucao\.store|luizestrelhashapr\.online|cremeb\.com|californicationdetroit\.com|codecaudiog\.site|codecvideowin\.online|acrobat-updater\.com|lojinhadoluiz\.online|donalurdesconfeitos\.site|marialurdes\.site|harialurdes\.site)$/i | table([ComputerName, UserName, DomainName, aid])
Looks for: any of the three known malicious extension IDs referenced in a file path (profile Extensions/{id} directory or Secure Preferences content). Requires the same Critical File Monitoring rule as Q4. FP: none — these IDs are not legitimate Web Store publishers.
// HUNT: Known KREMLIN Extension ID Present in a Chrome/Edge Profile // MITRE: T1176 // CONF: high FP: low COST: low // REQUIRES: CriticalFileModified — same FIM rule scope as Q4 (Extensions/ and Secure Preferences paths) // FALSE POSITIVES: none — these extension IDs are not legitimate Web Store publishers #event_simpleName=/^CriticalFileModified$/ | TargetFileName=/(ndpbidppejfanjbhfgjlohfanbfbklff|djodclnjknbpambeaaapadmdfhmbpeog|cdgcjghdeinagopbaobhmaefigoafaaa)/i | table([ComputerName, UserName, TargetFileName, ContextBaseFileName, aid])
CrowdStrike Custom IOA Recommendations
Promote the five highest-confidence, lowest-FP queries to Custom IOA rule groups after the 14-day silent-run validation in §11. Keep Q2, Q3, Q4, and Q5 as Investigate-only hunts until their FP-medium tuning exclusions are confirmed in your tenant.
| IOA Name | Source Query | Pattern | Exclusions | Deployment Path |
|---|---|---|---|---|
| DETECT — KREMLIN Scheduled Task Persistence | Q1 | Scheduled task registration matching MicrosoftNodeRuntimeUpdater or AcrobatBrowserExtension | None identified | Console > Endpoint Security > Custom IOA rule groups > Create rule (Process Creation category) > Detect-only for 14 days > promote to Prevent |
| DETECT — SentinelOne Binary Sideload Staging | Q6 + Q7 | SentinelMemoryScanner.exe execution or SentinelAgentCore.dll write outside the standard SentinelOne path | Validated SentinelOne install directory for your environment | Same rule group, Process Creation + File System categories |
| DETECT — KREMLIN C2 DNS Resolution | Q8 | DNS request to the current/historical domain list | None; refresh list on changelog updates | Prefer Falcon Custom IOC (domain) import over a Custom IOA for this one — see §10 CSV block |
| DETECT — Known KREMLIN Extension ID Present | Q9 | File path containing one of the three known extension IDs | None | Requires the Critical File Monitoring rule from §11 to be live first |
Triage & Response (for any hit above)
- Network-contain the host in Falcon before further investigation — this is an active credential-theft chain with a live exfil channel.
- Pull the process tree for the alerting event; confirm parent chain against §3's attack chain (JS lure → wscript/cscript → scheduled task → conhost/node → installer).
- Check for the Q4/Q9 Secure Preferences / extension-ID fingerprint even if the alert came from a different query — if present, assume the extension is already force-installed.
- Pull local Chrome/Edge
chrome://extensions(Developer Mode on) via live response; document any extension ID not matching your organization's approved/forced list. - Run Q8 environment-wide, scoped to the last 30 days, to find other hosts beaconing to the same infrastructure.
- Rotate credentials and revoke active sessions for any account whose browser profile shows the Q4/Q9 fingerprint, prioritizing banking and password-manager-linked accounts.
- Escalate to IR if OSCrypt/App-Bound key theft is confirmed (Q5 hit + Q4 hit on the same host within the same session) — this indicates DPAPI-protected secrets beyond the browser may be exposed.
Pivot Queries
// PIVOT: host-scoped — all process activity in the hour around a Q1/Q4/Q6 hit
#event_simpleName=/^ProcessRollup2$/
| aid=REPLACE_WITH_AID
| table([ComputerName, UserName, FileName, ParentBaseFileName, CommandLine, aid])
// PIVOT: environment-wide — any other host resolving the same C2 domain as a confirmed hit
#event_simpleName=/^DnsRequest$/
| DomainName=REPLACE_WITH_CONFIRMED_DOMAIN
| table([ComputerName, UserName, DomainName, aid])
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags domain,volmira.site,prevent,critical,2027-03-16,KREMLIN/REF9334 current extension C2 (version check/download/exfil) -- corroborated by 2 sources,campaign:KREMLIN-REF9334 domain,zaviro.online,prevent,critical,2027-03-16,KREMLIN/REF9334 current installer C2 and fingerprint upload -- corroborated by 2 sources,campaign:KREMLIN-REF9334 domain,luizestrelhashapr.online,prevent,critical,2027-03-16,KREMLIN/REF9334 extension C2 resolved via Ethereum smart contract -- corroborated by 2 sources,campaign:KREMLIN-REF9334 domain,granderevolucao.store,detect,high,2026-12-16,KREMLIN/REF9334 installer payload host (single-sourced),campaign:KREMLIN-REF9334 domain,cremeb.com,detect,high,2026-12-16,KREMLIN/REF9334 Cremeb-campaign C2 and QR-extension config API (single-sourced),campaign:KREMLIN-REF9334 domain,californicationdetroit.com,detect,medium,2026-12-16,KREMLIN/REF9334 backup Cloudflare-proxied infrastructure (single-sourced),campaign:KREMLIN-REF9334 domain,graph.checkeligibitily.workers.dev,detect,high,2026-12-16,KREMLIN/REF9334 Cloudflare Workers C2 resolver -- block this exact hostname only; workers.dev is shared multi-tenant infrastructure,campaign:KREMLIN-REF9334 domain,codecaudiog.site,hunt,medium,2026-10-16,KREMLIN/REF9334 historical Codecaudiog-campaign C2 (Jun 2025),campaign:KREMLIN-REF9334 domain,codecvideowin.online,hunt,medium,2026-10-16,KREMLIN/REF9334 historical Codecaudiog-campaign C2,campaign:KREMLIN-REF9334 domain,acrobat-updater.com,hunt,medium,2026-10-16,KREMLIN/REF9334 historical Acrobat-campaign C2 (Aug 2025),campaign:KREMLIN-REF9334 domain,lojinhadoluiz.online,hunt,medium,2026-10-16,KREMLIN/REF9334 historical Framesync-campaign C2 (Sep 2025),campaign:KREMLIN-REF9334 domain,donalurdesconfeitos.site,hunt,medium,2026-10-16,KREMLIN/REF9334 historical transition-era C2,campaign:KREMLIN-REF9334 domain,marialurdes.site,hunt,medium,2026-10-16,KREMLIN/REF9334 historical transition-era C2,campaign:KREMLIN-REF9334 domain,harialurdes.site,hunt,medium,2026-10-16,KREMLIN/REF9334 historical transition-era C2,campaign:KREMLIN-REF9334 ipv4,185.221.23.133,detect,high,2026-12-16,KREMLIN/REF9334 Codecaudiog-campaign PULSAR RAT C2,campaign:KREMLIN-REF9334 ipv4,144.172.112.239,detect,high,2026-12-16,KREMLIN/REF9334 Acrobat-campaign PULSAR RAT C2,campaign:KREMLIN-REF9334 ipv4,45.90.13.210,detect,high,2026-12-16,KREMLIN/REF9334 Acrobat-campaign PULSAR RAT alternate C2,campaign:KREMLIN-REF9334 ipv4,37.16.74.100,detect,high,2026-12-16,KREMLIN/REF9334 Cremeb-campaign PULSAR RAT C2,campaign:KREMLIN-REF9334 ipv4,37.16.74.34,detect,high,2026-12-16,KREMLIN/REF9334 Cremeb-campaign PULSAR RAT C2,campaign:KREMLIN-REF9334 ipv4,178.92.162.38,detect,high,2026-12-16,KREMLIN/REF9334 REMCOS RAT C2 (Ethereum-transition campaign),campaign:KREMLIN-REF9334 sha256,c8c38634dd44d7c6162c66174a6ee23ee404265125166e8d757681bdd66a4268,detect,high,2026-12-16,KREMLIN C++ installer (2.10MB x64; PigSyscall indirect syscalls; SentinelOne DLL sideload),campaign:KREMLIN-REF9334 sha256,223be3f8648bf6998c4a58b972522e5fda8d9d0a57b4e163811930de66c3f7ca,detect,high,2026-12-16,KREMLIN malicious extension -- AVSync System Inc masquerade (ext id ndpbidppejfanjbhfgjlohfanbfbklff),campaign:KREMLIN-REF9334 sha256,42a3e2bb135fb46b11b127f45a266b3a4d9dff4aa1cf75433f93fe69ba51a9b9,detect,high,2026-12-16,KREMLIN PowerShell extension installer (install_chrome_ext.ps1),campaign:KREMLIN-REF9334 sha256,106eac79396a3ff77b8f375c391260ce422be2ae4d55d3aa75b2635cbdc0fa42,detect,high,2026-12-16,KREMLIN first-stage JavaScript loader (Codecaudiog B variant),campaign:KREMLIN-REF9334 sha256,5ece7fd3766b0b7f8aadefa562313cea6c3c94f9398658dd389910e5be44f552,detect,high,2026-12-16,KREMLIN first-stage loader popup filename-pattern sample,campaign:KREMLIN-REF9334 sha256,ba80216c960977fa45e317f00dcf31e96acab29904a737cbc0bf86e929c3be5f,detect,high,2026-12-16,KREMLIN loader -- seguranca.versionnova.site wave A (2026-06-22),campaign:KREMLIN-REF9334 sha256,cb15cbf3f01a92e609e4c2bc26155e667e96c5d04770e83abba66ee07bcecea0,detect,high,2026-12-16,KREMLIN loader -- seguranca.versionnova.site wave B (2026-06-26),campaign:KREMLIN-REF9334 sha256,170dffb37e05f525f735bc9ad84b3908a488f7ce43fcb07739a10e4331e15a2c,detect,high,2026-12-16,KREMLIN loader -- seguranca.versionnova.site wave C (2026-07-03/14),campaign:KREMLIN-REF9334
# Scheduled task names (persistence)
MicrosoftNodeRuntimeUpdater -- runs 1 min after logon; launches conhost.exe --headless node.exe
AcrobatBrowserExtension -- runs at logon and every 30 minutes; re-downloads latest payload
# Mutex
ClarinhoQueSim-XEDA2O -- Ethereum-transition-era installer mutex (Portuguese name)
# Malicious Chrome/Edge extension IDs (not legitimate Web Store publishers)
ndpbidppejfanjbhfgjlohfanbfbklff -- "AVSync System Inc" v1.0.0
djodclnjknbpambeaaapadmdfhmbpeog -- "FrameSync Driver System" / "FrameSync Plugin Project"
cdgcjghdeinagopbaobhmaefigoafaaa -- QR-code themed extension (targets web.whatsapp.com, sicoob.com.br)
# Lure filename patterns (JavaScript, delivered as email/messenger attachments)
COMPROVANTE_{Bank}_DD-MM-YYYY.{10 digits}.js
ComprovanteOriginal_{Bank}_DD-MM-YYYY.{10 digits}.js
popup_{date}_{random}.js
# C2 request paths (behavioral -- not resolvable via DNS/IP blocking alone)
/google_ws/ -- extension WebSocket C2 channel
/google_api/ (paths ending in .css) -- extension REST C2 disguised as CSS fetches
/api/ext/version, /api/ext, /api/savecreds -- volmira.site endpoints
/api/v1/fingerprint -- zaviro.online endpoint
# RAT payloads distributed alongside the extension PULSAR RAT (versions 1.6.6, 1.7.1-1.7.3, 2.4.5 observed) REMCOS RAT (Ethereum-transition campaign, current) # Ethereum smart-contract dead-drop resolver (T1102.001) Operator wallet: 0x5C32A09873be70a92fd8bB5A9fED7967dE06BdE6 Current contract: 0xCD7360A83E5cdbBbbbcEB0e78748babA6740d07b (setConfig/getConfig; params: main-v2, sub-module, sentinel, extension, binary, binary_chunks) Prior contracts: 0x902EDbFECFF38f285Bf26283fB9cEB3700061873, 0x4f7D712D0B53fDf3c96896EB411467B30Da23406 # Sideloaded / abused legitimate binary SentinelMemoryScanner.exe -- legitimate SentinelOne binary abused to sideload SentinelAgentCore.dll # Syscall evasion PigSyscall -- open-source indirect-syscall library; resolves SSNs via RUNTIME_FUNCTION entries # Sandbox / kill-switch canary -- MONITOR ONLY, DO NOT BLOCK creamp1eonlyfans.net -- now sinkholed by Elastic Threat Command; malware aborts if this domain responds, so a hit means an infected host tried to self-terminate. Blocking it would restore the malware's default (non-aborting) execution path.
# Chrome/Edge policy audit (run per endpoint or pull via MDM reporting) 1. chrome://policy (or edge://policy) -- confirm ExtensionInstallBlocklist contains the 3 known KREMLIN extension IDs 2. Confirm ExtensionSettings default installation_mode is "blocked" (allowlist-only), not left unset 3. Confirm DeveloperToolsAvailability does not leave "Developer mode" reachable on the extensions page for standard users 4. chrome://extensions with Developer mode manually toggled on -- confirm zero unexpected/unpublished extensions 5. Where FIM is deployed, verify current Secure Preferences / Local State file hashes against a known-good baseline
Detection Validation Gates
| Gate | Requirement | Status for This Pack |
|---|---|---|
| Telemetry ready | ProcessRollup2, DnsRequest, PeFileWritten/NewExecutableWritten, ScheduledTaskRegistered enabled; Critical File Monitoring rule created for Secure Preferences/Local State/Extensions paths | Action needed — the FIM rule for Q4/Q9 is not on by default in most tenants |
| Benign baseline | Run all 9 queries over a trailing 30-day window with no alerting enabled; record hit volume per query | Pending — run before enabling any Custom IOA |
| Positive tests | In an isolated lab VM: register a scheduled task named exactly MicrosoftNodeRuntimeUpdater; launch chrome.exe --remote-debugging-port=9222; confirm Q1 and Q5 fire | Pending |
| Promotion | Promote Q1, Q6, Q7, Q8, Q9 to Custom IOA after 14 days silent-run with zero benign hits; keep Q2, Q3, Q4, Q5 as Investigate-only pending FP tuning validation | Scheduled — see §9 |
Hardening — Tiered & Deployable
Because the extension's in-browser data theft (§5, §15) is invisible to EDR, hardening carries more of the defensive weight than usual for this threat. The controls below target the three chokepoints the attack chain cannot avoid: getting the lure to execute, forcing the extension in, and reaching C2.
- Block the 3 known malicious extension IDs via Chrome/Edge
ExtensionInstallBlocklistpolicy (Chrome Enterprise / Microsoft Edge policy documentation). No compatibility risk — these are not legitimate publishers. → M1038 (Execution Prevention). - Disable Windows Script Host (WSH) for standard endpoints via the documented
Enabledregistry value, blocking wscript.exe/cscript.exe execution of the .js lure outright. → M1038, M1042 (Disable/Remove Feature or Program). - Enable the Falcon Critical File Monitoring / FIM rule for
Secure Preferences,Local State, andExtensions\under Chrome/Edge profiles — this is a detection prerequisite (§11), not just a hardening nicety; without it Q4 and Q9 are blind. → M1047 (Audit).
- Move Chrome/Edge extension policy to allowlist-only: set
ExtensionSettingsdefaultinstallation_modetoblocked, with an explicit allowlist for approved extensions and a forcelist for organization-mandated ones (Chrome Enterprise / Edge policy documentation). Pilot on one ring first — inventory currently-installed extensions before flipping the default. → M1038. - Enable Microsoft Defender ASR rule "Block JavaScript or VBScript from launching downloaded executable content" (GUID
d3e037e1-3eb8-44c8-a917-57927947596d) in Audit mode for 2 weeks, then Block. → M1040 (Behavior Prevention on Endpoint). - Restrict local administrator rights on standard user workstations — the App-Bound key extraction and Secure Preferences HMAC forgery both benefit from elevated or same-user debugger-attach rights; least-privilege reduces the attack surface for this specific technique. → M1026 (Privileged Account Management).
- Enable Credential Guard where hardware supports it (VT-x/AMD-V + Secure Boot), reducing the value of any DPAPI-protected secret theft that accompanies this technique on a compromised host. → M1025 (Privileged Process Integrity). ⚠ best-practice, no dedicated CIS Benchmark line item for this exact scenario — routed via the general Credential Guard control.
- User-awareness training targeted at finance/AP staff on the specific COMPROVANTE lure pattern — this is the one link in the chain that is entirely social, and the pack's own hunt coverage of delivery (§3, step 1) is a documented gap. → M1017 (User Training).
Deployable Playbooks
Playbook 1 — Disable Windows Script Host (blocks the .js lure's execution vector)
MITRE: T1204.002 → M1038, M1042 Prerequisites: confirm no legitimate logon/legacy scripts on the target ring depend on wscript.exe/cscript.exe (rare but check any old VBS/JS logon scripts first) Reboot required: No
\# Disable Windows Script Host for both wscript.exe and cscript.exe $path = 'HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings' New-Item -Path $path -Force | Out-Null New-ItemProperty -Path $path -Name 'Enabled' -Value 0 -PropertyType DWORD -Force | Out-Null Write-Output "Windows Script Host disabled (Enabled=0)"
GPO path: deploy the above via a registry preference item, or use Administrative Templates if your baseline ADMX includes a WSH template. Verify: (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings' Enabled).Enabled should return 0; attempting to run a .js file via double-click should show "Windows Script Host access is disabled."
Rollback: Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings' Enabled 1 (or delete the value) — takes effect immediately, no reboot needed.
Playbook 2 — Block Known KREMLIN Extension IDs + Move to Allowlist-Only
MITRE: T1176 → M1038 Prerequisites: Chrome/Edge ADMX templates installed in your GPO/Intune environment; inventory of currently force-installed and user-installed extensions before changing the default installation mode Reboot required: No (browser restart to pick up policy)
// Chrome/Edge ExtensionSettings policy (JSON) -- deploy via GPO "Extension management settings" or Intune OMA-URI
{
"ndpbidppejfanjbhfgjlohfanbfbklff": { "installation_mode": "blocked" },
"djodclnjknbpambeaaapadmdfhmbpeog": { "installation_mode": "blocked" },
"cdgcjghdeinagopbaobhmaefigoafaaa": { "installation_mode": "blocked" },
"*": { "installation_mode": "blocked" }
}
Verify: on a test endpoint, chrome://policy should show ExtensionSettings applied with the three blocked IDs; attempt to sideload one of the three IDs in a lab VM and confirm Chrome refuses to load it.
Rollback: revert the GPO/Intune ExtensionSettings value to your prior JSON (back it up before this change) and force a policy refresh (gpupdate /force or Intune sync).
Playbook 3 — Enable ASR Rule: Block JavaScript/VBScript from Launching Downloaded Executable Content
MITRE: T1204.002, T1059.007 → M1040 Prerequisites: Microsoft Defender Antivirus active or passive mode; roll out to a pilot ring in Audit before Block Reboot required: No
\# Audit mode first (recommended 2-week pilot) Set-MpPreference -AttackSurfaceReductionRules_Ids d3e037e1-3eb8-44c8-a917-57927947596d -AttackSurfaceReductionRules_Actions AuditMode \# After a clean audit period, switch to Block Set-MpPreference -AttackSurfaceReductionRules_Ids d3e037e1-3eb8-44c8-a917-57927947596d -AttackSurfaceReductionRules_Actions Enabled
Verify: Get-MpPreference | Select -ExpandProperty AttackSurfaceReductionRules_Ids should list the GUID with a matching action in AttackSurfaceReductionRules_Actions; review Defender ASR audit events (Event ID 1122/1121) for hit volume before flipping to Block.
Rollback: Set-MpPreference -AttackSurfaceReductionRules_Ids d3e037e1-3eb8-44c8-a917-57927947596d -AttackSurfaceReductionRules_Actions Disabled
Containment Runbook
| Phase | Actions | Owner | Evidence to Preserve |
|---|---|---|---|
| Isolate | Network-contain the host in Falcon; block the confirmed C2 domain/IP at proxy/firewall (never block the sinkholed creamp1eonlyfans.net canary — see §4/§10); force sign-out of any banking/financial sessions accessible from the host | SOC/IR on-call | Falcon RTR session log, containment timestamp, list of active browser sessions at time of isolation |
| Eradicate | Remove the MicrosoftNodeRuntimeUpdater/AcrobatBrowserExtension scheduled tasks; remove the malicious extension via forced ExtensionSettings "removed" mode (do not rely on manual chrome://extensions removal alone — Secure Preferences must be regenerated by a clean browser reinstall/profile reset); delete dropped installer/DLL/JS artifacts; quarantine and hash all recovered samples | IR / Endpoint Eng | Full file paths + hashes of all removed artifacts, scheduled task XML export, before/after Secure Preferences file (do not restore the tampered copy) |
| Recover | Reset the affected Chrome/Edge profile entirely (new profile, not a repaired one) since the HMACs/keys involved may still validate a residual tamper; rotate all credentials and revoke active sessions for accounts used in that profile, prioritizing banking and password-manager-linked accounts; re-image if root-level DPAPI/App-Bound key exposure is suspected beyond the browser; monitor Q8 hits from this host for 30 days | IR + affected user's manager (for banking-credential rotation) | Credential-rotation confirmation, 30-day monitoring log, closure report referencing which hunt queries fired during the incident |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1566.001 | Lure delivery | Q3 (execution only, not delivery) | No | Partial |
| T1053.005 | Scheduled task persistence | Q1 | Yes (§9) | Good |
| T1176 | Forced extension install | Q4, Q9 | Yes — Q9 (§9) | Good |
| T1555.003 | OSCrypt/App-Bound key theft | Q5 | No — investigate-only | Partial |
| T1574.002 | SentinelOne DLL sideload | Q6, Q7 | Yes (§9) | Good |
| T1102.001 | Ethereum dead-drop C2 resolution | None — on-chain RPC call, no Falcon telemetry | No | Gap |
| T1071.001 | HTTPS/WebSocket C2 comms | Q8 (DNS only; in-path proxy/SWG logs needed for the /google_ws/ and /google_api/ paths themselves) | Yes (§9) | Partial |
| T1056.001 | In-extension keylogging | None — in-browser JS, no EDR visibility | No | Gap — mitigate via §12 extension hardening |
| T1113 | In-extension screenshot capture | None — same gap as above | No | Gap — mitigate via §12 |
| T1027 | Installer/loader obfuscation | Covered indirectly via hash IOCs (§10), not behaviorally | No | Partial |
Validation gates from §11 apply to every "Good"/"Partial" row above — none of these queries should be promoted to Prevent without the benign-baseline and positive-test steps completed first. The two "Gap" rows tied to in-browser behavior are not closeable by EDR at all; they are the reason §12's extension-allowlisting controls are marked Immediate/Near-Term rather than optional.
Hunt Summary Ticket
TITLE: KREMLIN / REF9334 -- Banking Browser-Extension Hunt
SEVERITY: High / Active credential-theft campaign
SCOPE: Windows endpoints running Chrome or Edge; Brazilian-bank-facing users highest priority
HYPOTHESIS: Hosts show scheduled-task persistence, a non-browser process modifying Secure
Preferences, a debugger-attached browser process, or DNS resolution to known
KREMLIN C2 -- any one of these indicates active or attempted extension force-install.
QUERIES: Q1-Q9 (section 8); IOA candidates Q1, Q6, Q7, Q8, Q9 (section 9)
DO FIRST: 1) Confirm Critical File Monitoring is enabled for Secure Preferences/Extensions
paths (section 11) -- without it, Q4 and Q9 return nothing.
2) Run Q1, Q6, Q7, Q8 first (high conf, low FP, no tuning needed).
3) Block the 3 known extension IDs via ExtensionInstallBlocklist (section 12/13)
immediately, independent of hunt results.
FINDINGS: [populate after first run]
GAPS: In-browser extension behavior (keylogging, screenshot, cookie theft) and the
Ethereum-contract C2 resolution step are invisible to Falcon telemetry (section 15).
ACTIONS: See containment runbook (section 14) for any confirmed hit.
OWNER: HuntPack
VERSION: v0.1 -- 2026-09-16
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| Primary | Elastic Security Labs — "The extension you never installed: KREMLIN forges Chrome's own integrity checks to steal banking sessions" | Full technical report; IOC appendix; campaign timeline; Secure Preferences HMAC-forgery mechanics; Ethereum contract details; SentinelOne sideload; PigSyscall; victim count | 2026-09-16 |
| Secondary | The Hacker News — "KREMLIN Banking Malware Hijacks Chrome and Edge to Steal Credentials and Session Tokens" | Corroboration: current C2 domains, extension ID, Ethereum contract, HMAC-forgery description, victim/geography stats | 2026-09-16 |
| Secondary | GBHackers — "KREMLIN Banking Malware Bypasses Chrome Security to Steal Banking Sessions" | Corroboration: scheduled task name, SentinelOne sideload, RC4/SystemFunction032 exfil detail, recommended hunt angles | 2026-09-16 |
Source snapshots saved verbatim at build time: 01-elastic-security-labs.txt, 02-thehackernews.txt, 03-gbhackers.txt in this pack's -sources/ directory.