Back to Intelligence

Offside Wallet Theft Factory: 40 Malicious Firefox Extensions Stealing Crypto Wallet Seeds — Detection and Removal Guide

SA
Security Arsenal Team
August 21, 2026
11 min read

The Socket Threat Research team has exposed a coordinated browser-extension malware campaign dubbed Offside Wallet Theft Factory: 40 malicious Mozilla Firefox extensions impersonating legitimate Web3 wallets — including OKX, Rabby Wallet, and TronLink — to steal wallet secrets and drain cryptocurrency from victims. These 40 add-ons belong to a broader cluster of 77 extensions sharing source code and infrastructure, indicating an industrialized 'factory' operation that can rapidly rebrand and republish after takedowns. Organizations with employees holding corporate or personal crypto assets, and any SOC protecting users in the Web3 space, must treat browser extensions as an unmanaged attack surface — effective immediately.

What Happened

Attackers published dozens of Firefox add-ons through the Mozilla Add-ons (AMO) store that closely mimic the branding, names, and user interfaces of legitimate cryptocurrency wallet extensions. Once installed, the malicious extensions replicate expected wallet functionality to lower suspicion while harvesting the data that matters most to an attacker:

  • Seed phrases / mnemonic recovery phrases entered during wallet 'setup' or 'restore'
  • Private keys and keystore files
  • Wallet passwords and PINs
  • Session data that enables account takeover of associated exchange accounts

The shared codebase and overlapping backend infrastructure across 77 add-ons is the critical detail. This is not a one-off typosquat — it is a repeatable production line. When Mozilla removes one batch, the operators can re-skin the same malicious code as a different wallet brand and re-upload it within hours. Defenders should assume new variants of this factory are already live or will be shortly.

Why Defenders Need to Act Now

Browser extensions operate with extraordinary privilege: they can read every keystroke and form field on every page, access the clipboard, intercept network requests, and persist indefinitely inside the browser profile. Traditional endpoint controls rarely inspect them. A single compromised extension on a finance-team workstation or an executive's machine can result in irreversible financial loss — cryptocurrency theft has no chargeback, no fraud department, and no recovery mechanism.

The severity is amplified for organizations that:

  • Hold treasury or operational funds in self-custody wallets
  • Allow employees to use browser-based wallets on corporate endpoints
  • Have no extension allowlisting policy for managed browsers

Technical Analysis

Affected Products and Platforms

ComponentDetail
BrowserMozilla Firefox (all versions supporting WebExtensions — i.e., current releases)
Delivery channelMozilla Add-ons store (AMO) and potentially sideloaded XPI files
Impersonated brandsOKX Wallet, Rabby Wallet, TronLink, and other Web3 wallet products
Campaign scale40 confirmed malicious extensions; 77 related add-ons sharing code/infrastructure
Target dataSeed phrases, private keys, wallet credentials

No CVE is associated with this campaign — this is not a browser vulnerability. The abuse vector is the extension trust model itself: users voluntarily grant powerful permissions to code they believe is a legitimate wallet.

Attack Chain (Defender's View)

  1. Publication — Attacker uploads a convincingly branded wallet extension to AMO, cloning names, icons, and screenshots from OKX, Rabby, or TronLink.
  2. Installation — Victim searching for a wallet installs the impostor extension. The XPI is written into the Firefox profile's extensions/ directory and registered in extensions.json.
  3. Permissions grant — The extension requests typical wallet permissions (storage, clipboardRead, webRequest, <all_urls> host access), which users accept because legitimate wallets request similar scopes.
  4. Harvesting — During wallet 'creation' or 'import,' the extension captures the seed phrase/private key entered by the user. Content scripts may also scrape clipboard contents and form data.
  5. Exfiltration — Stolen secrets are transmitted to attacker-controlled infrastructure from within the firefox.exe process, blending into normal browser HTTPS traffic.
  6. Monetization — Wallets are drained, often minutes to hours after credential capture.

Key Forensic Artifacts

  • Extension installs create entries in %APPDATA%\Mozilla\Firefox\Profiles\<profile>\extensions.json and addonStartup.json.lz4, plus an .xpi file in the extensions/ subdirectory (Windows) or ~/.mozilla/firefox/<profile>/extensions/ (Linux/macOS).
  • Each extension has a unique ID (GUID or email-style identifier) and a manifest.json inside the XPI declaring permissions.
  • Exfiltration traffic originates from firefox.exe to attacker domains that are typically low-reputation, recently registered, and unrelated to the user's normal browsing.

Exploitation Status

Confirmed active, in-the-wild campaign. These extensions were distributed through an official browser store and used to steal real wallet secrets. This is not theoretical. Given the factory-style operation, defenders should assume ongoing publication of new variants even after AMO takedowns.

Detection & Response

The detections below target the observable behaviors this campaign produces: unauthorized extension installation into Firefox profiles, modification of extension registration files by non-browser processes (indicating sideloading), and network exfiltration patterns from the browser process.

Sigma Rules

YAML
---
title: Firefox Extension Installed via Sideloading or Profile Tampering
id: 3f8a2b91-7c4d-4e5f-9a1b-2c6d8e0f4a7b
status: experimental
description: Detects processes other than Firefox writing XPI extension files or modifying extensions.json in Firefox profiles, indicative of malicious extension sideloading as used in the Offside Wallet Theft Factory campaign.
references:
  - https://thehackernews.com/2026/08/40-malicious-firefox-extensions-pose-as.html
  - https://attack.mitre.org/techniques/T1176/
author: Security Arsenal
date: 2026/08/15
tags:
  - attack.persistence
  - attack.t1176
logsource:
  category: file_event
  product: windows
detection:
  selection_path:
    TargetFilename|contains:
      - '\Mozilla\Firefox\Profiles\'
  selection_target:
    TargetFilename|endswith:
      - '\extensions.json'
      - '\addonStartup.json.lz4'
      - '.xpi'
  filter_firefox:
    Image|endswith:
      - '\firefox.exe'
      - '\plugin-container.exe'
      - '\updater.exe'
  condition: selection_path and selection_target and not filter_firefox
falsepositives:
  - Enterprise extension deployment tools (intentional sideloading by IT)
  - Firefox Sync components
level: high
---
title: Firefox Network Connection to Cryptocurrency-Themed Typosquat Domain
id: 8c1d4e62-5a3b-4f78-b2e9-7d0c3a5f8e1d
status: experimental
description: Detects firefox.exe establishing connections to domains impersonating popular Web3 wallet brands, consistent with malicious extension C2/exfiltration in the Offside Wallet Theft Factory campaign.
references:
  - https://thehackernews.com/2026/08/40-malicious-firefox-extensions-pose-as.html
  - https://attack.mitre.org/techniques/T1071.001/
author: Security Arsenal
date: 2026/08/15
tags:
  - attack.exfiltration
  - attack.t1071.001
  - attack.t1176
logsource:
  category: network_connection
  product: windows
detection:
  selection_image:
    Image|endswith: '\firefox.exe'
  selection_domain:
    DestinationHostname|contains:
      - 'okx-wallet'
      - 'okxwallet'
      - 'rabby-wallet'
      - 'rabbywallet'
      - 'tronlink'
      - 'tron-link'
      - 'tronwallet'
  filter_legit:
    DestinationHostname|endswith:
      - '.okx.com'
      - '.rabby.io'
      - '.tronlink.org'
  condition: selection_image and selection_domain and not filter_legit
falsepositives:
  - Users visiting unofficial fan sites or forums (review destination context)
level: high
---
title: Browser Process Reading Browser Extension Store of Another Profile
id: 5e7f3a18-2b9c-4d61-a8f4-9c1e6b3d5f2a
status: experimental
description: Detects non-browser processes accessing Firefox extension storage and WebExtension local storage, which can indicate credential/secret harvesting from installed wallet extensions.
references:
  - https://thehackernews.com/2026/08/40-malicious-firefox-extensions-pose-as.html
  - https://attack.mitre.org/techniques/T1555/
author: Security Arsenal
date: 2026/08/15
tags:
  - attack.credential_access
  - attack.t1555
logsource:
  category: file_access
  product: windows
detection:
  selection:
    TargetFilename|contains:
      - '\Mozilla\Firefox\Profiles\'
    TargetFilename|contains:
      - '\storage\default\'
      - '\extension-data\'
  filter_legit:
    Image|endswith:
      - '\firefox.exe'
      - '\plugin-container.exe'
  condition: selection and not filter_legit
falsepositives:
  - Backup software and EDR scanning engines (tune by process hash)
level: medium

KQL — Microsoft Sentinel / Defender Hunting

This query hunts for extension installations and suspicious browser egress across the estate. Run it over a 14-day lookback, then pivot on any hits by user and device.

KQL — Microsoft Sentinel / Defender
// Hunt 1: Firefox extension files written by non-Firefox processes (sideloading)
DeviceFileEvents
| where TimeGenerated > ago(14d)
| where FolderPath has @"\Mozilla\Firefox\Profiles\"
| where FileName endswith ".xpi" or FileName in~ ("extensions.json", "addonStartup.json.lz4")
| where InitiatingProcessFileName !in~ ("firefox.exe", "plugin-container.exe", "updater.exe")
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, FolderPath, SHA256
| order by TimeGenerated desc
;
// Hunt 2: firefox.exe connecting to wallet-brand typosquat / suspicious domains
let WalletBrands = dynamic(["okx", "rabby", "tronlink", "tron-link"]);
let LegitSuffixes = dynamic(["okx.com", "rabby.io", "tronlink.org"]);
DeviceNetworkEvents
| where TimeGenerated > ago(14d)
| where InitiatingProcessFileName =~ "firefox.exe"
| where RemoteUrl has_any (WalletBrands)
| where not(RemoteUrl has_any (LegitSuffixes))
| summarize ConnectionCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated)
    by DeviceName, RemoteUrl, RemoteIP, InitiatingProcessAccountName
| order by ConnectionCount desc
;
// Hunt 3: Rare outbound destinations from Firefox (candidate exfil infrastructure)
DeviceNetworkEvents
| where TimeGenerated > ago(7d)
| where InitiatingProcessFileName =~ "firefox.exe"
| where isnotempty(RemoteUrl)
| summarize DeviceCount = dcount(DeviceId), TotalConns = count() by RemoteUrl
| where DeviceCount <= 2 and TotalConns < 50
| order by DeviceCount asc

Velociraptor VQL Hunt

Use this artifact to enumerate all installed Firefox extensions across endpoints and flag anything that is not on your approved list. This is the fastest way to find impostor wallet extensions at scale.

VQL — Velociraptor
-- Enumerate Firefox extensions and flag non-allowlisted / wallet-impersonating add-ons
LET profiles = SELECT FullPath
FROM glob(globs='C:/Users/*/AppData/Roaming/Mozilla/Firefox/Profiles/*/extensions.json')

LET parsed = SELECT
    FullPath AS ExtensionsJson,
    parse_json(filename=FullPath).addons AS Addons
FROM profiles

SELECT
    ExtensionsJson,
    item.id AS ExtensionID,
    item.defaultLocale.name AS ExtensionName,
    item.version AS Version,
    item.defaultLocale.creator AS Creator,
    item.location AS Location,
    item.signedState AS SignedState
FROM foreach(row=parsed,
query={
    SELECT * FROM foreach(row=Addons)
})
WHERE ExtensionName =~ '(?i)okx|rabby|tronlink|tron|wallet'
   OR SignedState < 2

Remediation / Audit Script

Run this PowerShell script (as the user or via your RMM/EDR) to audit Firefox profiles for suspicious extensions, flag unsigned or wallet-impersonating add-ons, and export a report for IR triage.

PowerShell
# Offside Wallet Theft Factory - Firefox Extension Audit & Remediation Script
# Run per-user or deploy via RMM. Review the report BEFORE removing anything.

$reportPath = "$env:USERPROFILE\Desktop\Firefox_Extension_Audit_$(Get-Date -Format yyyyMMdd_HHmmss).csv"
$suspiciousBrands = 'okx|rabby|tronlink|tron|metamask|phantom|wallet'
$results = @()

# Enumerate all Firefox profiles for the current user
$profilesDir = "$env:APPDATA\Mozilla\Firefox\Profiles"
if (-not (Test-Path $profilesDir)) { Write-Host "No Firefox profiles found."; exit }

Get-ChildItem $profilesDir -Directory | ForEach-Object {
    $extJson = Join-Path $_.FullName "extensions.json"
    if (Test-Path $extJson) {
        $data = Get-Content $extJson -Raw | ConvertFrom-Json
        foreach ($addon in $data.addons) {
            $name = $addon.defaultLocale.name
            $flag = ""
            if ($name -match $suspiciousBrands) { $flag = "WALLET-BRAND MATCH - VERIFY AUTHENTICITY" }
            if ($addon.signedState -lt 2)          { $flag = ($flag + " | UNSIGNED/SIDELOADED").Trim(" |") }
            $results += [PSCustomObject]@{
                Profile      = $_.Name
                ExtensionID  = $addon.id
                Name         = $name
                Version      = $addon.version
                SignedState  = $addon.signedState
                Active       = $addon.active
                Flag         = $flag
            }
        }
    }
}

$results | Format-Table -AutoSize
$results | Export-Csv -Path $reportPath -NoTypeInformation
Write-Host "`nAudit complete. Report saved to: $reportPath"

$flagged = $results | Where-Object { $_.Flag -ne "" }
if ($flagged) {
    Write-Host "`n[!] $($flagged.Count) suspicious extension(s) found:" -ForegroundColor Red
    $flagged | Format-Table Name, ExtensionID, Flag -AutoSize
    Write-Host "ACTION: Remove flagged extensions via about:addons, rotate ALL wallet credentials," -ForegroundColor Yellow
    Write-Host "and move funds to a NEW wallet with a NEW seed phrase generated offline." -ForegroundColor Yellow
} else {
    Write-Host "`n[+] No wallet-brand or unsigned extensions detected." -ForegroundColor Green
}

Remediation

Immediate Actions (Affected Users / Endpoints)

  1. Remove the malicious extension. Open about:addons in Firefox, identify any wallet extension not downloaded deliberately from the vendor's official site, and remove it. Verify the legitimate source: OKX (okx.com), Rabby (rabby.io), TronLink (tronlink.org) — never install wallet software from search results alone.
  2. Assume full compromise of any wallet ever used with the extension. Transfer all funds to a newly created wallet with a new seed phrase generated on a clean device or hardware wallet. Reusing the old seed means the attacker still controls the funds.
  3. Rotate associated credentials — exchange accounts, email accounts tied to the wallet, and any password reused across crypto services.
  4. Review transaction history for unauthorized outbound transfers and report theft to exchanges (to freeze receiving addresses where possible) and law enforcement (FBI IC3 for U.S. victims).

Organizational Hardening

  • Enforce extension allowlisting. Firefox supports enterprise policy via ExtensionSettings (Group Policy / policies.json). Block all extensions by default and explicitly allow a vetted list. This single control would have fully prevented this campaign on managed endpoints.
  • Prohibit self-custody wallet use on corporate endpoints unless the device is dedicated, hardened, and monitored. Corporate treasury operations belong on hardware wallets with multi-signature controls.
  • Monitor AMO store for brand impersonation. Add your organization's wallet vendors to brand-monitoring; Socket's research shows the factory re-publishes rapidly after takedowns.
  • Deploy the detections above and hunt retroactively over at least 90 days of browser network telemetry.
  • Report malicious extensions to Mozilla via the AMO reporting mechanism to accelerate takedown and protect the broader ecosystem.

Verification

After cleanup, confirm no .xpi files remain for removed extensions in the profile's extensions/ directory, validate extensions.json contains only allowlisted IDs, and re-run the audit script after a browser restart. Continue monitoring for outbound connections to the typosquat domain patterns in the Sigma and KQL rules above for at least 30 days.

Related Resources

Security Arsenal Managed SOC Services AlertMonitor Platform Book a SOC Assessment soc-mdr Intel Hub

Is your security operations ready?

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