Back to Intelligence

Offside Wallet Theft Factory: 77 Malicious Firefox Extensions Steal Crypto Wallet Seed Phrases via Supabase & Cloudflare Workers C2 — OTX Pulse Detection Pack

SA
Security Arsenal Team
August 20, 2026
9 min read

Threat Summary

AlienVault OTX pulse data, sourced from Socket's research, confirms a coordinated, industrialized browser extension campaign tracked as the Offside Wallet Theft Factory. The operation encompasses 77 Firefox extensions, of which 40 are confirmed malicious, engineered to steal cryptocurrency wallet secrets — recovery seed phrases, private keys, and stored credentials — from victims interacting with Web3 and decentralized finance platforms.

The campaign's defining characteristic is its factory model: rather than a single malicious extension, the operators mass-produce variants impersonating legitimate wallet tools (MetaMask, Phantom, and similar Web3 wallet interfaces), publishing them through the Firefox Add-ons ecosystem to harvest secrets at scale. The attack chain is straightforward but effective:

  1. Delivery — victim installs a trojanized or impersonating Firefox extension from the add-on store or via phishing lures.
  2. Remote activation — malicious behavior is gated behind Supabase-controlled remote switches, meaning the extension can remain dormant during review and be armed post-installation.
  3. Harvesting — injected content scripts read wallet recovery phrases, private keys, and credentials from browser storage, DOM input fields, and clipboard.
  4. Exfiltration — stolen secrets are relayed through Cloudflare Workers acting as serverless C2 proxies, plus hardcoded fallback C2 domains, blending exfil traffic with legitimate cloud infrastructure.

The objective is unambiguous: cryptocurrency theft at scale, with credential theft providing secondary monetization. Because the C2 layer rides on Supabase and Cloudflare Workers — both legitimate, broadly-allowed SaaS platforms — traditional domain-reputation blocking alone will not stop this campaign.

Threat Actor / Malware Profile

Attribution: Unknown threat actor; TLP:WHITE. The consistent infrastructure pattern (Supabase remote switches + Cloudflare Workers exfil relays + hardcoded fallback C2) across 40+ extensions indicates a single operator or organized group running a repeatable build pipeline — hence the 'Theft Factory' designation.

Distribution method: Mozilla Firefox Add-ons store submissions and phishing-driven sideloading. Extensions impersonate legitimate crypto wallets and Web3 utilities to pass casual review and lure self-custody users.

Payload behavior:

  • Content-script injection into wallet and exchange pages to capture seed phrases and private keys at input time.
  • Reads browser.storage.local and clipboard buffers for previously stored secrets.
  • Credential harvesting from form fields on financial and Web3 domains.

C2 communication:

  • Supabase (legitimate BaaS platform) abused as a remote configuration / kill-switch layer — the extension polls a Supabase endpoint to determine whether to activate malicious logic.
  • Cloudflare Workers serverless endpoints act as exfiltration relays, proxying stolen secrets to attacker-controlled backends. Worker subdomains (*.workers.dev) are high-reputation and rarely blocked.
  • Hardcoded fallback C2 domains including browser-app.com, browsify.net, e-wl.com, and the hijacked/typosquatted gemachriverdale.org provide resilience if cloud relays are suspended.

Persistence mechanism: The browser extension itself is the persistence vehicle — it survives reboots, updates via the add-on channel, and re-arms on every browser launch. Removal requires explicit extension uninstall, not just process termination.

Anti-analysis techniques:

  • Logic gating via remote switch: dormant-by-default payloads defeat static review and sandbox detonation that doesn't emulate the Supabase activation response.
  • Infrastructure laundering: exfil through Cloudflare Workers and Supabase evades reputation-based egress filtering.
  • Variant churn: 77-extension sprawl forces hash-by-hash whack-a-mole; shared hashes in this pulse identify the known-bad cluster.

IOC Analysis

The pulse carries 164 indicators across two types:

TypeExamplesOperationalization
Domains (C2 / infrastructure)browser-app.com, browsify.net, gemachriverdale.org, e-wl.comBlock at DNS sinkhole, web proxy, and EDR network rules. Note: hardcoded C2 only — Supabase (*.supabase.co) and Cloudflare Workers (*.workers.dev) endpoints are not in the indicator list because they are legitimate platforms; detect them behaviorally, not by blocklist.
FileHash-SHA256 (extension packages)08b7b064fa9a41b06774315d944ffddff705ab727222a0c3bcac64a77553bf2f, 4d0912d575087dab5f468214a2fd259bc386472a8b2b93b6e2441cde4bd941cb, 26427220b9965e22deca0e617657c2c65b78f750183355d1265c147818367bd7, 252119fc48ad93b0c930d7a62fb49420cf8986716539e4e9d4d5c1bad700d435Load into EDR blocklists and browser extension inventory tooling. Hash .xpi packages and unpacked extension directories under user Firefox profiles.

SOC operational guidance:

  • Pull the full 164-IOC set from the pulse and push domains to DNS/proxy controls immediately; SHA256 values to EDR custom blocklists.
  • Inventory first: enumerate installed Firefox extensions across the fleet (profiles under %APPDATA%\Mozilla\Firefox\Profiles\ and ~/.mozilla/firefox/) and match against hashes — you cannot detect what you have not inventoried.
  • Tooling: Socket for extension supply-chain analysis, OTX DirectConnect/API for indicator sync into your TIP (MISP, ThreatConnect, OpenCTI), and jq + the OTX pulses API for automated daily pulls.
  • Do not blanket-block supabase.co or workers.dev — alert on browser-extension-originated connections to them instead.

Detection Engineering

YAML
---
title: Firefox Extension Process Spawning Suspicious Network Egress to Serverless C2
id: 9f2c7a1e-4b3d-4e5f-8a6c-1d2e3f4a5b6c
status: experimental
description: Detects Firefox establishing connections to Cloudflare Workers or Supabase endpoints consistent with Offside Wallet Theft Factory exfiltration and remote-switch polling. Tune with known-good enterprise allowlists.
author: Security Arsenal Threat Intel
date: 2026/08/21
references:
    - https://socket.dev/blog/firefox-crypto-wallet-theft
logsource:
    category: network_connection
    product: windows
    service: sysmon
detection:
    selection_image:
        Image|endswith: '\firefox.exe'
    selection_dest:
        DestinationHostname|endswith:
            - '.workers.dev'
            - '.supabase.co'
    condition: selection_image and selection_dest
falsepositives:
    - Legitimate Web3 dApps and enterprise SaaS using Supabase backends accessed via Firefox
level: medium
tags:
    - attack.exfiltration
    - attack.t1041
    - attack.command_and_control
    - attack.t1071.001
---
title: DNS Resolution of Offside Wallet Theft Factory Hardcoded C2 Domains
id: 7a1b2c3d-5e6f-4a7b-8c9d-0e1f2a3b4c5d
status: experimental
description: Detects DNS queries for hardcoded command-and-control domains associated with the Offside Wallet Theft Factory malicious Firefox extension campaign (OTX pulse, Socket research).
author: Security Arsenal Threat Intel
date: 2026/08/21
references:
    - https://socket.dev/blog/firefox-crypto-wallet-theft
logsource:
    category: dns
detection:
    selection:
        query:
            - 'browser-app.com'
            - 'browsify.net'
            - 'gemachriverdale.org'
            - 'e-wl.com'
    condition: selection
falsepositives:
    - Threat intel research or sandbox detonation of the extensions
level: high
tags:
    - attack.command_and_control
    - attack.t1071.004
---
title: Malicious Firefox Extension Package Written to User Profile Extensions Directory
id: 2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e
status: experimental
description: Detects file creation of known-malicious extension packages (by SHA256) or unexpected .xpi drops in Firefox profile extensions directories, indicating installation of Offside Wallet Theft Factory extensions.
author: Security Arsenal Threat Intel
date: 2026/08/21
references:
    - https://socket.dev/blog/firefox-crypto-wallet-theft
logsource:
    category: file_event
    product: windows
    service: sysmon
detection:
    selection_path:
        TargetFilename|contains:
            - '\Mozilla\Firefox\Profiles\'
            - '\extensions\'
    selection_ext:
        TargetFilename|endswith: '.xpi'
    selection_hash:
        Hashes|contains:
            - '08b7b064fa9a41b06774315d944ffddff705ab727222a0c3bcac64a77553bf2f'
            - '4d0912d575087dab5f468214a2fd259bc386472a8b2b93b6e2441cde4bd941cb'
            - '26427220b9965e22deca0e617657c2c65b78f750183355d1265c147818367bd7'
            - '252119fc48ad93b0c930d7a62fb49420cf8986716539e4e9d4d5c1bad700d435'
    condition: selection_hash or (selection_path and selection_ext)
falsepositives:
    - Legitimate extension installs or updates (hash match condition eliminates these; path-only condition requires baseline tuning)
level: high
tags:
    - attack.persistence
    - attack.t1176
    - attack.user_execution
    - attack.t1204
KQL — Microsoft Sentinel / Defender
// Offside Wallet Theft Factory — Firefox extension exfil & C2 hunt (Microsoft Sentinel)
// Hunts: (1) known hardcoded C2 domains, (2) Firefox egress to serverless C2 platforms
let lookback = 14d;
let c2_domains = dynamic(["browser-app.com", "browsify.net", "gemachriverdale.org", "e-wl.com"]);
let hardcoded_c2 =
    DeviceNetworkEvents
    | where TimeGenerated > ago(lookback)
    | where RemoteUrl has_any (c2_domains)
    | project TimeGenerated, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, RemoteUrl, RemoteIP, ActionType
    | extend HuntMatch = "Hardcoded C2 Domain";
let serverless_c2 =
    DeviceNetworkEvents
    | where TimeGenerated > ago(lookback)
    | where InitiatingProcessFileName =~ "firefox.exe"
    | where RemoteUrl endswith ".workers.dev" or RemoteUrl endswith ".supabase.co"
    | summarize Connections = count(), DistinctHosts = dcount(RemoteUrl), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated)
        by DeviceName, InitiatingProcessAccountName, RemoteUrl, RemoteIP
    | extend HuntMatch = "Firefox -> Serverless C2 (Workers/Supabase)";
union hardcoded_c2, serverless_c2
| sort by TimeGenerated desc
PowerShell
# Offside Wallet Theft Factory - Endpoint IOC Hunt
# Checks Firefox profiles for malicious extensions, known-bad hashes, and live C2 connections
$ErrorActionPreference = 'SilentlyContinue'

$MaliciousHashes = @(
    '08B7B064FA9A41B06774315D944FFDDFF705AB727222A0C3BCAC64A77553BF2F',
    '4D0912D575087DAB5F468214A2FD259BC386472A8B2B93B6E2441CDE4BD941CB',
    '26427220B9965E22DECA0E617657C2C65B78F750183355D1265C147818367BD7',
    '252119FC48AD93B0C930D7A62FB49420CF8986716539E4E9D4D5C1BAD700D435'
)
$C2Domains = @('browser-app.com','browsify.net','gemachriverdale.org','e-wl.com')
$Findings = @()

Write-Host "[*] Enumerating Firefox profiles and hashing installed extensions..." -ForegroundColor Cyan
$profileRoots = Get-ChildItem "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles" -Directory
foreach ($profile in $profileRoots) {
    $extDir = Join-Path $profile.FullName 'extensions'
    if (Test-Path $extDir) {
        Get-ChildItem $extDir -Recurse -Include *.xpi,*.json,*.js | ForEach-Object {
            $h = (Get-FileHash $_.FullName -Algorithm SHA256).Hash
            if ($MaliciousHashes -contains $h) {
                $Findings += [PSCustomObject]@{Type='MALICIOUS EXTENSION HASH'; Path=$_.FullName; Hash=$h; Profile=$profile.Name}
                Write-Host "[!!] MALICIOUS EXTENSION: $($_.FullName) [$h]" -ForegroundColor Red
            }
        }
        # Flag non-standard extension IDs (factory variants use random GUIDs)
        Get-ChildItem $extDir -File | ForEach-Object {
            $Findings += [PSCustomObject]@{Type='Extension Inventory'; Path=$_.FullName; Hash=''; Profile=$profile.Name}
        }
    }
}

Write-Host "[*] Checking active connections and DNS cache for hardcoded C2..." -ForegroundColor Cyan
$conns = Get-NetTCPConnection | Where-Object { $_.State -eq 'Established' }
foreach ($c in $conns) {
    try {
        $rdns = (Resolve-DnsName $c.RemoteAddress -ErrorAction Stop).NameHost
        foreach ($d in $C2Domains) {
            if ($rdns -like "*$d*") {
                $proc = (Get-Process -Id $c.OwningProcess).ProcessName
                Write-Host "[!!] LIVE C2 CONNECTION: $d ($($c.RemoteAddress)) via $proc" -ForegroundColor Red
                $Findings += [PSCustomObject]@{Type='LIVE C2 CONNECTION'; Path="$d -> $($c.RemoteAddress)"; Hash=$proc; Profile=''}
            }
        }
    } catch {}
}
$dnsCache = Get-DnsClientCache | Where-Object { $n = $_.Entry; $C2Domains | Where-Object { $n -like "*$_*" } }
if ($dnsCache) { $dnsCache | ForEach-Object { Write-Host "[!] DNS cache hit: $($_.Entry)" -ForegroundColor Yellow } }

Write-Host "[*] Checking recent DNS query log for serverless C2 abuse..." -ForegroundColor Cyan
$serverless = Get-DnsClientCache | Where-Object { $_.Entry -match '.workers.dev$|.supabase.co$' }
if ($serverless) { $serverless | Select-Object Entry, Data | Format-Table -AutoSize }

if ($Findings.Count -eq 0) { Write-Host "[+] No confirmed Offside Wallet Theft Factory indicators found." -ForegroundColor Green }
else { $Findings | Export-Csv ".\offside_hunt_findings.csv" -NoTypeInformation; Write-Host "[*] Findings exported to offside_hunt_findings.csv" }

Response Priorities

Immediate (0-4 hours):

  • Block the four hardcoded C2 domains (browser-app.com, browsify.net, gemachriverdale.org, e-wl.com) at DNS, proxy, and EDR network layers.
  • Load all 164 pulse indicators (SHA256 set into EDR blocklists) and sweep the fleet with the hunt script above.
  • Inventory installed Firefox extensions enterprise-wide; quarantine any matching known-bad hashes and flag unapproved extensions impersonating wallet brands.
  • Alert on Firefox egress to *.workers.dev and *.supabase.co pending behavioral tuning.

24 hours:

  • This is credential- and seed-phrase-stealing malware: for any host with a confirmed malicious extension, assume all wallet secrets and credentials entered in that browser are compromised.
  • Force rotation of credentials stored or typed in affected browser profiles; for crypto assets, migrate funds to wallets with newly generated seed phrases — rotating a password does nothing for a stolen recovery phrase.
  • Review IdP logs (Entra ID/Okta) for anomalous sign-ins from affected users; check for sessions authenticated with stolen cookies or credentials.
  • Audit clipboard managers and password manager browser integrations on affected endpoints.

1 week:

  • Implement a browser extension allowlisting policy (Firefox Enterprise policies / ExtensionSettings) blocking unapproved add-on installs fleet-wide — this is the architectural fix for the extension-store attack vector.
  • Deploy egress controls that categorize and alert on browser-process traffic to serverless platforms (Cloudflare Workers, Supabase, Vercel, Netlify functions) rather than relying on domain reputation.
  • Restrict cryptocurrency wallet usage to hardened, dedicated endpoints or hardware wallets for treasury/finance functions; prohibit self-custody wallet extensions on general-purpose corporate machines.
  • Subscribe the OTX pulse feed into your TIP for automated indicator sync, and add extension-inventory collection to standard EDR telemetry.

Related Resources

Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.

Offside Wallet Theft Factory: 77 Malicious Firefox Extensions Steal Crypto Wallet Seed Phrases via Supabase & Cloudflare Workers C2 — OTX Pulse Detection Pack | Security Arsenal | Security Arsenal