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
| Component | Detail |
|---|---|
| Browser | Mozilla Firefox (all versions supporting WebExtensions — i.e., current releases) |
| Delivery channel | Mozilla Add-ons store (AMO) and potentially sideloaded XPI files |
| Impersonated brands | OKX Wallet, Rabby Wallet, TronLink, and other Web3 wallet products |
| Campaign scale | 40 confirmed malicious extensions; 77 related add-ons sharing code/infrastructure |
| Target data | Seed 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)
- Publication — Attacker uploads a convincingly branded wallet extension to AMO, cloning names, icons, and screenshots from OKX, Rabby, or TronLink.
- Installation — Victim searching for a wallet installs the impostor extension. The XPI is written into the Firefox profile's
extensions/directory and registered inextensions.json. - Permissions grant — The extension requests typical wallet permissions (
storage,clipboardRead,webRequest,<all_urls>host access), which users accept because legitimate wallets request similar scopes. - 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.
- Exfiltration — Stolen secrets are transmitted to attacker-controlled infrastructure from within the
firefox.exeprocess, blending into normal browser HTTPS traffic. - 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.jsonandaddonStartup.json.lz4, plus an.xpifile in theextensions/subdirectory (Windows) or~/.mozilla/firefox/<profile>/extensions/(Linux/macOS). - Each extension has a unique ID (GUID or email-style identifier) and a
manifest.jsoninside the XPI declaring permissions. - Exfiltration traffic originates from
firefox.exeto 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
---
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.
// 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.
-- 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.
# 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)
- Remove the malicious extension. Open
about:addonsin 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. - 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.
- Rotate associated credentials — exchange accounts, email accounts tied to the wallet, and any password reused across crypto services.
- 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.