Security researchers have flagged a malicious Visual Studio Code extension named Solidity Pro (solidity-pro), published under at least two publisher identities — helper-beeps.solidity-pro and web3devtoolsx.solidity-pro — that delivers a browser wallet and credential stealer. Although both extensions have been pulled from the Open VSX registry, the associated GitHub repository remains live, and any developer who installed either package must be assumed compromised.
This is a supply-chain attack with a sharply focused victimology: Solidity and Web3 developers. These are users who, by definition, hold cryptocurrency wallets, interact with browser-based wallet extensions (MetaMask, Phantom, Rabby, Coinbase Wallet), and frequently store exchange API keys, RPC endpoints, and cloud credentials in their development environments. A successful infection is not an inconvenience — it is direct, immediate financial theft plus a foothold for follow-on compromise of anything the developer can reach.
If your organization employs smart contract developers, blockchain engineers, or anyone working in the Web3 space, treat this as an active incident response scenario, not a news item. Hunt for the extension IDs now.
Technical Analysis
What Happened
Threat actors published malicious VS Code extensions masquerading as a Solidity development toolkit — an obvious lure for the Ethereum/Web3 developer community. Two publisher/extension combinations have been identified:
helper-beeps.solidity-proweb3devtoolsx.solidity-pro
Both have been removed from the Open VSX registry (the open-source extension marketplace used by VS Code forks such as VSCodium, Cursor, and Windsurf, and also searchable from some alternative marketplace tooling). Critically, removal from the registry does not remove the extension from machines where it is already installed — and the underlying GitHub repository remains available, meaning the actor can continue distributing the payload through direct installs, re-uploads under new publisher names, or VSIX sideloading.
Attack Chain
From a defender's perspective, the execution flow follows the well-established malicious-extension playbook:
- Installation lure. A developer searching for Solidity language support installs
solidity-profrom Open VSX or a VSIX file. The extension presents plausible functionality to avoid immediate suspicion. - Activation payload. VS Code extensions execute arbitrary JavaScript/TypeScript in the extension host process (
Code.exespawning extension host workers) as soon as the extension activates — on startup or when a matching file type (.sol) is opened. There is no sandbox. The extension runs with the full privileges of the developer's user account. - Stager/dropper. The malicious extension code retrieves or unpacks a second-stage stealer, commonly via Node.js APIs available to extensions (
child_process,https,fs) or by spawning PowerShell/cmd for download-and-execute. - Theft. The stealer targets:
- Browser wallet extension data — the Local Extension Settings / IndexedDB / LevelDB directories of wallet extensions (MetaMask's extension ID
nkbihfbeogaeaoehlefnkodbefgpgknnis the canonical target, alongside Phantom, Rabby, Coinbase Wallet, and others), where encrypted vault data and, critically, the vault decryption keys derived from cached session state can be recovered. - Browser credential stores — Chromium
Login DataandLocal State(the DPAPI-encrypted master key), Firefoxlogins.json/key4.db. - API keys and developer secrets —
.envfiles, SSH keys (~/.ssh/), cloud CLI credential files (~/.aws/credentials,~/.config/gcloud), hardhat/foundry config files, and exchange API credentials common in Web3 projects.
- Browser wallet extension data — the Local Extension Settings / IndexedDB / LevelDB directories of wallet extensions (MetaMask's extension ID
- Exfiltration. Stolen data is staged and exfiltrated over HTTPS to actor-controlled infrastructure, frequently disguised as telemetry or hidden behind legitimate-looking domains and webhook services.
Why This Technique Works
VS Code's extension model is the vulnerability — by design. Extensions have unrestricted access to the filesystem, network, and process APIs of the host. There is no permission prompt, no capability model, and no runtime isolation. Marketplace review for Open VSX is minimal compared to the Microsoft Visual Studio Marketplace, which is precisely why threat actors favor it for typosquatting and malicious publishing campaigns. We have seen this pattern repeatedly in 2025–2026 across npm, PyPI, and extension marketplaces; the pivot to Web3 developers via a Solidity-themed lure shows deliberate, financially motivated targeting.
Exploitation Status
- Confirmed in-the-wild distribution via the two named extension IDs.
- Extensions removed from Open VSX, but the GitHub repository remains live — continued distribution via re-publication under new publisher names or VSIX sideloading must be assumed.
- No CVE applies — this is abuse of intended extension functionality, not a product vulnerability. Detection and hygiene, not patching, are the defensive levers.
Blast Radius
Any machine where either extension was installed should be treated as fully compromised at the user level: all browser-stored credentials, wallet seed material accessible to the session, SSH keys, cloud tokens, and any secrets in the developer's workspace must be rotated. If the developer's machine had access to production infrastructure, signing keys, or deployment pipelines, escalate accordingly — wallet drainers are frequently paired with infrastructure reconnaissance.
Detection & Response
The detections below target the observable behaviors of this threat: the presence of the malicious extension, VS Code spawning script interpreters or downloaders (extension activation behavior), and non-browser processes accessing browser credential stores and wallet extension data.
SIGMA Rules
---
title: VS Code Spawning Script Interpreter or Downloader
description: Detects the VS Code process tree spawning PowerShell, cmd, wscript, or curl/wget — consistent with a malicious extension executing a second-stage payload. Legitimate extensions rarely need to spawn script interpreters.
references:
- https://thehackernews.com/2026/08/solidity-pro-vs-code-extensions-steal.html
- https://attack.mitre.org/techniques/T1059/
- https://attack.mitre.org/techniques/T1195/002/
author: Security Arsenal
status: experimental
date: 2026/08/01
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith:
- '\Code.exe'
- '\Code - Insiders.exe'
- '\cursor.exe'
- '\windsurf.exe'
- '\VSCodium.exe'
selection_child:
Image|endswith:
- '\powershell.exe'
- '\pwsh.exe'
- '\cmd.exe'
- '\wscript.exe'
- '\cscript.exe'
- '\mshta.exe'
- '\curl.exe'
- '\wget.exe'
- '\rundll32.exe'
condition: selection_parent and selection_child
falsepositives:
- Task extensions or build tooling legitimately invoking shells from the integrated terminal
- Investigate command lines; integrated terminal use shows interactive shell flags
level: high
---
title: Non-Browser Process Accessing Browser Credential or Wallet Stores
description: Detects processes other than the browser itself reading Chromium/Firefox credential databases or browser wallet extension storage (MetaMask and other wallet Local Extension Settings), a hallmark of stealer malware such as that dropped by the malicious solidity-pro extensions.
references:
- https://thehackernews.com/2026/08/solidity-pro-vs-code-extensions-steal.html
- https://attack.mitre.org/techniques/T1555/003/
- https://attack.mitre.org/techniques/T1552/001/
author: Security Arsenal
status: experimental
date: 2026/08/01
logsource:
category: file_event
product: windows
detection:
selection_paths:
TargetFilename|contains:
- '\Google\Chrome\User Data\'
- '\Microsoft\Edge\User Data\'
- '\BraveSoftware\Brave-Browser\User Data\'
- '\Mozilla\Firefox\Profiles\'
selection_files:
TargetFilename|endswith:
- '\Login Data'
- '\Local State'
- '\logins.json'
- '\key4.db'
- '\nkbihfbeogaeaoehlefnkodbefgpgknn\'
- '\Local Extension Settings\'
filter_browsers:
Image|endswith:
- '\chrome.exe'
- '\msedge.exe'
- '\brave.exe'
- '\firefox.exe'
- '\MsMpEng.exe'
condition: selection_paths and selection_files and not filter_browsers
falsepositives:
- EDR/AV scanning of user profile directories
- Backup agents — exclude known backup process names after tuning
level: high
---
title: Suspicious Command Line Harvesting Secrets or Wallet Data
description: Detects command-line patterns consistent with credential and wallet theft staging — references to wallet extension IDs, browser credential files, .env files, SSH keys, or cloud credential paths in process command lines, as used by the solidity-pro stealer payload.
references:
- https://thehackernews.com/2026/08/solidity-pro-vs-code-extensions-steal.html
- https://attack.mitre.org/techniques/T1552/001/
- https://attack.mitre.org/techniques/T1005/
author: Security Arsenal
status: experimental
date: 2026/08/01
logsource:
category: process_creation
product: windows
detection:
selection:
CommandLine|contains:
- 'nkbihfbeogaeaoehlefnkodbefgpgknn'
- 'Local Extension Settings'
- 'Login Data'
- 'key4.db'
- '\.ssh\id_'
- '\.aws\credentials'
- '\.env'
- 'hardhat.config'
- 'foundry.toml'
condition: selection
falsepositives:
- Developers legitimately referencing config files in build commands
- Secret-scanning tooling (gitleaks, trufflehog) — tune by known tool image paths
level: medium
KQL — Microsoft Sentinel / Defender for Endpoint
Hunt for the malicious extension installations, suspicious VS Code child processes, and access to wallet/credential stores. Run these across the last 90 days — the extensions were live before removal, and installs may predate your awareness.
// Hunt 1: Malicious solidity-pro extension presence on endpoints
// Checks extension folders on disk and processes spawned from the extension path
let ExtIds = dynamic(["helper-beeps.solidity-pro", "web3devtoolsx.solidity-pro", "solidity-pro"]);
union isfuzzy=true
(DeviceFileEvents
| where Timestamp > ago(90d)
| where FolderPath has_any (ExtIds)
| project Timestamp, DeviceName, ActionType, FolderPath, FileName, InitiatingProcessAccountName),
(DeviceProcessEvents
| where Timestamp > ago(90d)
| where ProcessCommandLine has_any (ExtIds) or FolderPath has_any (ExtIds)
| project Timestamp, DeviceName, FileName, ProcessCommandLine, AccountName)
| order by Timestamp desc;
// Hunt 2: VS Code (or OSS forks) spawning script interpreters / downloaders
DeviceProcessEvents
| where Timestamp > ago(30d)
| where InitiatingProcessFileName has_any ("Code.exe", "Code - Insiders.exe", "cursor.exe", "windsurf.exe", "VSCodium.exe", "node.exe")
| where FileName in~ ("powershell.exe", "pwsh.exe", "cmd.exe", "wscript.exe", "cscript.exe", "mshta.exe", "curl.exe", "wget.exe", "rundll32.exe")
| where ProcessCommandLine has_any ("http", "Invoke-", "IEX", "DownloadString", "FromBase64String", "-enc", "bypass")
| project Timestamp, DeviceName, InitiatingProcessFileName, FileName, ProcessCommandLine, AccountName, SHA256
| order by Timestamp desc;
// Hunt 3: Non-browser processes touching wallet extension storage or credential stores
DeviceFileEvents
| where Timestamp > ago(30d)
| where FolderPath has_any ("Local Extension Settings", "nkbihfbeogaeaoehlefnkodbefgpgknn")
or (FileName in~ ("Login Data", "Local State", "logins.json", "key4.db") and FolderPath has_any ("Chrome\\User Data", "Edge\\User Data", "Brave-Browser", "Firefox\\Profiles"))
| where not(InitiatingProcessFileName has_any ("chrome.exe", "msedge.exe", "brave.exe", "firefox.exe", "MsMpEng.exe", "MsSense.exe"))
| project Timestamp, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, ActionType, FolderPath, FileName
| order by Timestamp desc;
Velociraptor VQL
Deploy this hunt across your fleet to identify endpoints with the malicious extension installed and to enumerate wallet/credential-store artifacts for scoping. Velociraptor is ideal here because extension presence is a filesystem fact, not a log event.
-- Hunt: Detect solidity-pro malicious VS Code extensions and wallet-store access artifacts
-- Source: Security Arsenal — Solidity Pro VS Code extension stealer (Aug 2026)
-- Part 1: Enumerate VS Code extension directories for the malicious IDs
LET ext_hits = SELECT FullPath, Mtime, Size
FROM glob(globs=[
'C:/Users/*/.vscode/extensions/*solidity-pro*/**',
'C:/Users/*/.vscode-oss/extensions/*solidity-pro*/**',
'C:/Users/*/.cursor/extensions/*solidity-pro*/**',
'C:/Users/*/.windsurf/extensions/*solidity-pro*/**',
'/home/*/.vscode/extensions/*solidity-pro*/**',
'/home/*/.vscode-oss/extensions/*solidity-pro*/**'
])
WHERE FullPath =~ 'package.json|extension.js|dist|out'
-- Part 2: Processes running with VS Code parents spawning shells/downloaders
LET proc_hits = SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE CommandLine =~ '(?i)(invoke-|iex|downloadstring|frombase64|curl |wget |certutil)'
AND Exe =~ '(?i)(powershell|pwsh|cmd|wscript|cscript|mshta|curl|wget|rundll32)'
-- Part 3: Wallet extension storage present on disk (scope exposure per endpoint)
LET wallet_scope = SELECT FullPath
FROM glob(globs=[
'C:/Users/*/AppData/Local/Google/Chrome/User Data/*/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/**',
'C:/Users/*/AppData/Local/Microsoft/Edge/User Data/*/Local Extension Settings/**',
'C:/Users/*/AppData/Local/BraveSoftware/Brave-Browser/User Data/*/Local Extension Settings/**'
])
LIMIT 200
SELECT * FROM ext_hits
UNION ALL SELECT FullPath AS FullPath, NULL AS Mtime, NULL AS Size FROM wallet_scope
Remediation
Immediate Actions (Affected Machines)
- Isolate first. Any endpoint with either extension installed goes offline immediately. The stealer may still be resident and exfiltrating.
- Assume full credential compromise for the user. Rotate, from a known-clean machine:
- All browser-stored passwords and session tokens (invalidate sessions, don't just change passwords).
- All cryptocurrency wallets: transfer funds to new wallets with freshly generated seed phrases. Never reuse a seed phrase that existed on the compromised machine — wallet vault data was a primary target.
- SSH keys, cloud CLI tokens (AWS/GCP/Azure), exchange API keys, RPC endpoint keys, GitHub PATs, and any secrets in
.envfiles or hardhat/foundry configs in the workspace.
- Remove the extension and hunt for persistence. Malicious extensions frequently drop second-stage payloads with their own persistence (Run keys, scheduled tasks, LaunchAgents). Do not assume uninstalling the extension remediates the host. If the stealer executed, reimage is the defensible answer.
- Preserve evidence. Capture the extension directory,
%USERPROFILE%\.vscode\extensions\*solidity-pro*, browser profile artifacts, and process/network telemetry before reimaging if legal/IR requirements apply.
Verification and Removal Script
Run this PowerShell script (as the affected user or via your RMM/EDR) to detect and remove the malicious extensions across VS Code and common forks:
# Security Arsenal — solidity-pro malicious extension detection & removal
# Run per-user; extension installs live in the user profile
$maliciousIds = @('helper-beeps.solidity-pro', 'web3devtoolsx.solidity-pro')
$extRoots = @(
"$env:USERPROFILE\.vscode\extensions",
"$env:USERPROFILE\.vscode-insiders\extensions",
"$env:USERPROFILE\.vscode-oss\extensions",
"$env:USERPROFILE\.cursor\extensions",
"$env:USERPROFILE\.windsurf\extensions"
)
$found = $false
foreach ($root in $extRoots) {
if (-not (Test-Path $root)) { continue }
foreach ($id in $maliciousIds) {
$matches = Get-ChildItem -Path $root -Directory -ErrorAction SilentlyContinue |
Where-Object { $_.Name -like "*$id*" -or $_.Name -like '*solidity-pro*' }
foreach ($m in $matches) {
$found = $true
Write-Host "[ALERT] Malicious extension found: $($m.FullName)" -ForegroundColor Red
# Quarantine: rename before deletion for evidence preservation
$quarantine = "$($m.FullName).QUARANTINED_$(Get-Date -Format 'yyyyMMddHHmmss')"
Rename-Item -Path $m.FullName -NewName $quarantine -Force
Write-Host "[INFO] Quarantined to: $quarantine — collect for IR, then delete" -ForegroundColor Yellow
}
}
}
if (-not $found) { Write-Host "[OK] No solidity-pro extensions found for this user." -ForegroundColor Green }
# Check for suspicious child processes spawned by editors (still-active payload)
Get-CimInstance Win32_Process |
Where-Object { $_.ParentProcessId -in (Get-Process -Name Code,cursor,windsurf,VSCodium -ErrorAction SilentlyContinue).Id -and
$_.Name -match 'powershell|pwsh|cmd|wscript|cscript|mshta|curl|wget' } |
Select-Object ProcessId, Name, CommandLine |
Format-List
# Audit installed extensions for review (supply-chain hygiene baseline)
foreach ($root in $extRoots) {
if (Test-Path $root) {
Write-Host "`n=== Installed extensions in $root ===" -ForegroundColor Cyan
Get-ChildItem $root -Directory | Select-Object -ExpandProperty Name
}
}
Organizational Hardening
There is no patch for this threat — the defense is policy, allow-listing, and monitoring:
- Enforce an extension allow-list. VS Code supports
extensions.allowedin enterprise policy; endpoint management (Intune, GPO via ADMX, or your MDM) can restrict which extensions developers may install. For most organizations, an approved catalog of 30–50 extensions covers all legitimate needs. - Block Open VSX and untrusted marketplaces for corporate endpoints; standardize on the Microsoft Visual Studio Marketplace with allow-listing, and treat any extension outside the catalog as a finding.
- Alert on extension installs. New directories under
~/.vscode/extensions/created by non-standard publishers are a high-signal, low-noise detection — especially in environments where developers rarely add extensions. - Ban secrets on developer workstations. Wallet seed phrases, production API keys, and cloud credentials should never reside in browser profiles or
.envfiles on endpoints. Enforce hardware wallets for funds, secrets managers (Vault, 1Password, cloud KMS) for API keys, and short-lived OIDC-based cloud credentials. - Monitor GitHub for re-publication. The source repository remains live. Add the extension names and publisher IDs to your threat intel watchlist and block known indicators at the proxy/DNS layer as they emerge from vendor reporting.
- Brief your Web3/blockchain teams today. This campaign targets them by name. Verify no one has installed Solidity tooling outside approved channels, and remind them that VS Code extensions execute with full user privileges — the same trust bar as running an unsigned binary.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.