The Ethersphere project — maintainer of the core tooling for the Swarm decentralized storage network — has confirmed a supply chain compromise in which attackers abused the project's own release automation to publish trojanized versions of two widely used packages: bee-js 13.3.0 (the official JavaScript client library for Swarm's Bee node API) and Swarm Desktop 0.56.2 (the desktop application used to run and manage Swarm nodes).
This is not a theoretical risk. These releases were published through legitimate channels, meaning anyone who installed or updated during the exposure window received attacker-controlled code signed by the trust of the project's own pipeline. The malicious payload does two things defenders should treat as critical: it steals the wallet private key that Swarm Desktop maintains for the node, along with the stored password that unlocks that keystore, and it installs a persistent unauthorized access mechanism (backdoor) on the compromised host.
If your organization runs Swarm infrastructure, develops against the Swarm network, or has bee-js anywhere in a dependency tree, treat this as an active incident. The wallet theft alone enables direct financial loss and node impersonation; the backdoor converts a single dependency update into a full host compromise with unknown downstream impact.
Technical Analysis
Affected Products and Versions
- bee-js 13.3.0 — the malicious npm release of the official Swarm JavaScript client library. Any project that installed or updated bee-js to 13.3.0, or any transitive dependency resolving to it, executed attacker code at install or runtime.
- Swarm Desktop 0.56.2 — the malicious desktop release. The installer/updater itself fetches and executes the wallet-stealing payload.
No CVE identifier has been assigned to this compromise at the time of writing, and none appears in the original reporting. That is typical for supply chain incidents — the weakness is process integrity (release automation), not a code-level vulnerability.
How the Attack Works
The distinguishing characteristic of this incident is the delivery vector: the attackers did not typosquat, did not hijack an abandoned maintainer account, and did not publish a look-alike package. They compromised Ethersphere's own release automation — the CI/CD machinery the project trusts to build and publish artifacts. This is the same class of attack we saw in the SolarWinds build-system compromise and the 3CX desktop application poisoning, and it defeats the most common consumer-side mitigations (pinning to 'official' publishers, trusting signed release channels) because the malicious output is the official output.
The attack chain, from a defender's perspective:
- Poisoned publication. Malicious versions of bee-js 13.3.0 and Swarm Desktop 0.56.2 are built and released through the compromised automation pipeline.
- Payload retrieval. Both releases contain logic that downloads and executes second-stage code. For bee-js, this typically means an install-time or post-install script executing under Node.js; for Swarm Desktop, the application itself or its updater fetches the payload.
- Credential theft. The payload locates the Swarm node keystore maintained by Swarm Desktop — the encrypted wallet key file and the stored password used to decrypt it — and exfiltrates both. Possession of the key plus its password gives the attacker full control of the node's wallet: funds, chequebook contracts, and node identity on the Swarm network.
- Backdoor installation. The payload drops a persistent unauthorized access mechanism, giving the operators continued remote access independent of the wallet theft.
Exploitation Status
This is confirmed active exploitation in the wild. The malicious versions were published to live distribution channels and delivered to real users through normal install and update flows. Any system that ran bee-js 13.3.0 or Swarm Desktop 0.56.2 must be considered compromised, not merely vulnerable. The wallet credentials and the backdoor mean the blast radius extends beyond the moment of installation — remediation requires credential rotation and host-level investigation, not just a package downgrade.
Detection & Response
The detections below target the behaviors described in the reporting: Node.js/npm processes performing unexpected network fetches or file reads against Swarm keystores, Swarm Desktop spawning unusual child processes, access to wallet keystore material, and persistence artifacts consistent with a dropped backdoor. Tune to your environment, but these are intentionally scoped to reduce noise.
---
title: Node.js or npm Process Accessing Swarm Desktop Keystore
description: Detects Node.js, npm, or Swarm Desktop processes reading Swarm wallet keystore files, consistent with the bee-js 13.3.0 / Swarm Desktop 0.56.2 wallet theft payload.
references:
- https://thehackernews.com/2026/11/hackers-compromise-etherspheres-bee-js.html
- https://attack.mitre.org/techniques/T1552/
author: Security Arsenal
date: 2026/11/10
status: experimental
tags:
- attack.credential_access
- attack.t1552.001
logsource:
category: file_event
product: windows
detection:
selection_path:
TargetFilename|contains:
- '\swarm-desktop\'
- '\.swarm\'
- '\bee\keys\'
selection_sensitive:
TargetFilename|contains:
- 'keystore'
- 'wallet'
- 'password'
filter_legit:
Image|endswith:
- '\swarm-desktop.exe'
- '\bee.exe'
condition: selection_path and selection_sensitive and not filter_legit
falsepositives:
- Legitimate Swarm tooling upgrades touching keystore directories
level: high
---
title: Swarm Desktop or Node.js Spawning Script or Download Child Processes
description: Detects Swarm Desktop or Node.js/npm processes spawning shells, script interpreters, or download utilities, consistent with the second-stage payload retrieval and backdoor installation observed in the Ethersphere supply chain compromise.
references:
- https://thehackernews.com/2026/11/hackers-compromise-etherspheres-bee-js.html
- https://attack.mitre.org/techniques/T1195/
author: Security Arsenal
date: 2026/11/10
status: experimental
tags:
- attack.initial_access
- attack.t1195.002
- attack.execution
- attack.t1059
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith:
- '\node.exe'
- '\npm.cmd'
- '\swarm-desktop.exe'
selection_child:
Image|endswith:
- '\powershell.exe'
- '\pwsh.exe'
- '\cmd.exe'
- '\curl.exe'
- '\wscript.exe'
- '\cscript.exe'
- '\rundll32.exe'
- '\regsvr32.exe'
- '\mshta.exe'
condition: selection_parent and selection_child
falsepositives:
- Legitimate npm lifecycle scripts during package installation
- Swarm Desktop update mechanisms spawning shell commands
level: medium
---
title: npm Postinstall Script Performing Network Download of Executable Content
description: Detects Node.js child processes fetching remote content during package installation, consistent with the bee-js 13.3.0 install-time payload retrieval behavior.
references:
- https://thehackernews.com/2026/11/hackers-compromise-etherspheres-bee-js.html
- https://attack.mitre.org/techniques/T1105/
author: Security Arsenal
date: 2026/11/10
status: experimental
tags:
- attack.command_and_control
- attack.t1105
- attack.execution
- attack.t1059.007
logsource:
category: process_creation
product: windows
detection:
selection:
CommandLine|contains:
- 'node -e'
- 'Invoke-WebRequest'
- 'Invoke-RestMethod'
- 'curl '
- 'wget '
- 'certutil -urlcache'
filter_registry:
CommandLine|contains:
- 'registry.npmjs.org'
condition: selection and not filter_registry
falsepositives:
- Build pipelines that legitimately fetch tooling during npm install
level: medium
Microsoft Sentinel / Defender Hunting (KQL)
The following query hunts across process execution telemetry for the combination most characteristic of this compromise: Node.js or Swarm Desktop parent processes spawning download-capable or script-capable children, plus processes touching Swarm keystore paths. Run it over the period covering your dependency update window.
let lookback = 30d;
let SwarmPaths = dynamic(["swarm-desktop", ".swarm", "bee"]);
let SuspiciousChildren = dynamic(["powershell.exe", "pwsh.exe", "cmd.exe", "curl.exe", "wscript.exe", "cscript.exe", "rundll32.exe", "regsvr32.exe", "mshta.exe", "certutil.exe"]);
union
(DeviceProcessEvents
| where TimeGenerated >= lookback
| where InitiatingProcessFileName in~ ("node.exe", "npm.cmd", "swarm-desktop.exe", "bee.exe")
| where FileName in~ (SuspiciousChildren)
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, ProcessCommandLine, AccountName
| extend Hunt = "Swarm/Node spawned suspicious child"),
(DeviceProcessEvents
| where TimeGenerated >= lookback
| where ProcessCommandLine has_any (SwarmPaths)
and ProcessCommandLine has_any ("keystore", "wallet", "password", "keys")
| where not(InitiatingProcessFileName in~ ("swarm-desktop.exe", "bee.exe"))
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, ProcessCommandLine, AccountName
| extend Hunt = "Non-Swarm process referencing wallet material"),
(DeviceNetworkEvents
| where TimeGenerated >= lookback
| where InitiatingProcessFileName in~ ("node.exe", "swarm-desktop.exe")
| where not(RemoteUrl has_any ("registry.npmjs.org", "github.com", "ethswarm.org", "swarm"))
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, RemotePort
| extend Hunt = "Swarm/Node outbound to non-standard destination")
| order by TimeGenerated desc
For environments ingesting Linux build runners and developer workstations via Syslog, correlate Syslog and CommonSecurityLog for node or npm processes executing curl, wget, or shell invocations during CI build windows, particularly where the build resolved bee-js at version 13.3.0.
Velociraptor Endpoint Hunt (VQL)
Use this artifact on suspected compromised hosts to identify Swarm-related processes with suspicious command lines, unexpected child processes of Node/Swarm binaries, and evidence of keystore access or dropped backdoor artifacts in user-writable persistence locations.
-- Ethersphere bee-js 13.3.0 / Swarm Desktop 0.56.2 compromise hunt
-- Identifies suspicious Node/Swarm child processes and wallet material access
SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE (
-- Node or Swarm spawning shells, downloaders, or script engines
(CommandLine =~ '(?i)node|swarm-desktop|bee'
AND CommandLine =~ '(?i)powershell|cmd\.exe|curl|wget|rundll32|regsvr32|mshta|wscript')
OR
-- Any process referencing Swarm keystore/wallet paths
CommandLine =~ '(?i)swarm-desktop|\.swarm'
AND CommandLine =~ '(?i)keystore|wallet|password|keys'
)
-- Enrich with parent context
LET parents = SELECT Pid AS ParentPid, Name AS ParentName, Exe AS ParentExe
FROM pslist()
SELECT * FROM {
SELECT a.*, p.ParentName, p.ParentExe
FROM scope() a
LEFT JOIN parents p ON a.Ppid = p.ParentPid
}
Follow up on hits with a file-system sweep for recently created executables and scripts in user-writable directories (%APPDATA%, %LOCALAPPDATA%\Temp, ~/.config, /tmp) created within the compromise window, and review persistence keys (HKCU\Software\Microsoft\Windows\CurrentVersion\Run, systemd user units, cron entries) for entries created around the same timestamps.
Triage and Containment Script
The script below checks a Windows host for installation of the malicious versions, enumerates suspicious child-process history indicators via installed package state, and blocks reinstallation of the poisoned versions. Run it on developer workstations and any host running Swarm Desktop. Adapt paths for Linux/macOS Swarm Desktop installations.
#Requires -RunAsAdministrator
# Ethersphere supply chain compromise - triage and containment
# Checks for bee-js 13.3.0 and Swarm Desktop 0.56.2 exposure
$ErrorActionPreference = 'SilentlyContinue'
$report = @()
# 1. Check globally and locally installed npm packages for malicious bee-js version
Write-Host '[*] Checking for bee-js 13.3.0 in npm dependency trees...' -ForegroundColor Cyan
$npmRoots = @("$env:APPDATA\npm\node_modules", "$env:ProgramFiles\nodejs\node_modules")
$npmRoots += Get-ChildItem -Path "C:\Users\*\*\node_modules" -Directory -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
foreach ($root in $npmRoots | Select-Object -Unique) {
$pkg = Join-Path $root 'bee-js\package.json'
if (Test-Path $pkg) {
$ver = (Get-Content $pkg -Raw | ConvertFrom-Json).version
if ($ver -eq '13.3.0') {
$report += [pscustomobject]@{ Finding = 'MALICIOUS bee-js 13.3.0'; Path = $pkg; Severity = 'CRITICAL' }
Write-Host "[!!] Malicious bee-js 13.3.0 found at $pkg" -ForegroundColor Red
}
}
}
# 2. Check installed Swarm Desktop version
Write-Host '[*] Checking Swarm Desktop version...' -ForegroundColor Cyan
$swarm = Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' |
Where-Object { $_.DisplayName -like '*Swarm*' }
foreach ($app in $swarm) {
if ($app.DisplayVersion -eq '0.56.2') {
$report += [pscustomobject]@{ Finding = 'MALICIOUS Swarm Desktop 0.56.2'; Path = $app.InstallLocation; Severity = 'CRITICAL' }
Write-Host '[!!] Malicious Swarm Desktop 0.56.2 installed' -ForegroundColor Red
}
}
# 3. Sweep user-writable persistence locations for recently created executables
Write-Host '[*] Sweeping persistence locations for recent artifacts...' -ForegroundColor Cyan
$window = (Get-Date).AddDays(-45)
$persistPaths = @("$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup", "$env:LOCALAPPDATA\Temp")
foreach ($p in $persistPaths) {
Get-ChildItem $p -Recurse -Include *.exe,*.dll,*.ps1,*.bat,*.js -ErrorAction SilentlyContinue |
Where-Object { $_.CreationTime -gt $window } |
ForEach-Object { $report += [pscustomobject]@{ Finding = 'Recent executable in persistence path'; Path = $_.FullName; Severity = 'REVIEW' } }
}
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run' |
ForEach-Object { $_.PSObject.Properties } | Where-Object { $_.Name -notlike 'PS*' } |
ForEach-Object { Write-Host " Run key: $($_.Name) = $($_.Value)" }
# 4. Pin/block malicious versions via npm overrides (defense in depth)
Write-Host '[*] Adding npm audit block guidance: pin bee-js to a known-good release.' -ForegroundColor Cyan
$report | Format-Table -AutoSize
if ($report | Where-Object Severity -eq 'CRITICAL') {
Write-Host '[ACTION REQUIRED] Malicious version detected. Isolate host, rotate wallet keys, begin IR.' -ForegroundColor Red
exit 1
} else {
Write-Host '[OK] No malicious Ethersphere versions detected on this host.' -ForegroundColor Green
exit 0
}
Remediation
Treat every host that executed bee-js 13.3.0 or Swarm Desktop 0.56.2 as compromised, not exposed. The correct response is incident response, not patch management.
- Immediately remove the malicious versions. Uninstall Swarm Desktop 0.56.2 and remove bee-js 13.3.0 from all dependency trees. Verify with
npm ls bee-jsacross repositories and CI build caches — build caches and lockfiles frequently preserve poisoned versions long after the registry entry is pulled. - Rotate wallet credentials — assume theft. Any wallet key stored by an affected Swarm Desktop installation, along with its password, must be considered exfiltrated. Migrate funds and node identity to a newly generated wallet on a clean host. Do not reuse the password anywhere; credential reuse across node management, exchange accounts, and infrastructure is the standard escalation path.
- Rebuild or reimage compromised hosts. The payload installed a backdoor. Removing the package does not remove the persistence mechanism. For developer workstations, that means IR triage at minimum and reimage for any host with confirmed execution. For CI runners, rotate all secrets that were present in the build environment — the backdoor had access to everything the runner could reach.
- Audit egress for the exposure window. Review DNS and proxy logs for outbound connections from Node.js and Swarm Desktop processes to non-standard destinations during the window in which the malicious versions were live. Identify the payload staging infrastructure and block it at the perimeter.
- Pin and verify dependencies going forward. Enforce lockfile integrity, use
npm ciwith provenance attestation (--provenance/ Sigstore verification where available), and consider blocking fresh package versions for a cooling-off period via a private registry proxy (e.g., an artifact repository with delay policies). Release-automation compromise means even 'official' channels deserve verification. - Monitor Ethersphere's official channels. Track the Ethersphere/Swarm project announcements and the original reporting at The Hacker News for confirmed clean release versions, indicators of compromise, and forensic details as the project completes its investigation of the automation compromise.
Related Resources
Security Arsenal Incident Response Services AlertMonitor Platform Book a SOC Assessment incident-response Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.