{"id":4138,"date":"2026-11-10T09:50:38","date_gmt":"2026-11-10T17:50:38","guid":{"rendered":"https:\/\/cyber.mag212.com\/?p=4138"},"modified":"2026-11-10T09:50:38","modified_gmt":"2026-11-10T17:50:38","slug":"bee-js-swarm-desktop-supply-chain-compromise-signed-malware","status":"publish","type":"post","link":"https:\/\/cyber.mag212.com\/fr\/bee-js-swarm-desktop-supply-chain-compromise-signed-malware\/","title":{"rendered":"Signed, Provenanced and Malicious: Hijacked Accounts Shipped Malware in bee-js 13.3.0 and Swarm Desktop 0.56.2"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">For about 75 minutes on 9 November, anyone who installed version 13.3.0 of the npm package <code>@ethersphere\/bee-js<\/code> received malware, and Swarm Desktop 0.56.2 shipped the same loader in signed, notarized builds for Linux, macOS and Windows. Socket, which published the primary research, says the attacker used two hijacked GitHub accounts to run the project\u2019s own release workflows, so the npm provenance is valid and the desktop apps carry genuine signatures (<a href=\"https:\/\/socket.dev\/blog\/bee-js-compromise\" target=\"_blank\" rel=\"noopener\">Socket<\/a>).<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Malicious releases<\/strong><\/td><td><code>@ethersphere\/bee-js<\/code> 13.3.0 (npm); Swarm Desktop 0.56.2 (GitHub releases)<\/td><\/tr><tr><td><strong>Safe versions<\/strong><\/td><td>bee-js <strong>13.2.0<\/strong>; Swarm Desktop 0.56.3 recommended (not yet published at 10:30 UTC on 9 Nov, per Socket)<\/td><\/tr><tr><td><strong>Exposure window<\/strong><\/td><td>npm: 00:09:50\u201301:24:58 UTC on 9 Nov 2026<\/td><\/tr><tr><td><strong>Payload<\/strong><\/td><td>Steals Swarm <code>config.yaml<\/code> and <code>swarm.key<\/code>; Go backdoor (macOS\/Linux) or ScreenConnect as SYSTEM (Windows)<\/td><\/tr><tr><td><strong>Attribution<\/strong><\/td><td>Socket assesses the same actor as the SleepyDuck\/EtherDuck Open VSX campaign<\/td><\/tr><tr><td><strong>Evidence<\/strong><\/td><td>Confirmed (Socket primary research)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What happened<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Socket says compromised maintainer accounts pushed the malicious bee-js release to npm, where it was removed about 75 minutes later, and a trojanized Swarm Desktop release to GitHub, whose 0.56.2 tag was deleted at 09:04 UTC. Socket links the operation to the SleepyDuck\/EtherDuck campaign that targeted Open VSX extensions, based on matching on-chain activity, shared payload hashes, and identical persistence names and remote-access instance (<a href=\"https:\/\/socket.dev\/blog\/bee-js-compromise\" target=\"_blank\" rel=\"noopener\">Socket<\/a>; <a href=\"https:\/\/thehackernews.com\/2026\/11\/hackers-compromise-etherspheres-bee-js.html\" target=\"_blank\" rel=\"noopener\">The Hacker News<\/a>). We don\u2019t know how the GitHub accounts were compromised, how many times 13.3.0 was downloaded, or whether Ethersphere has issued its own advisory.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Timeline (UTC, 9 November 2026)<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Time<\/th><th>Event<\/th><\/tr><\/thead><tbody><tr><td>00:09:50<\/td><td>Malicious bee-js 13.3.0 published to npm<\/td><\/tr><tr><td>01:24:58<\/td><td>13.3.0 removed from npm, about 75 minutes later<\/td><\/tr><tr><td>09:04<\/td><td>Swarm Desktop 0.56.2 release tag deleted<\/td><\/tr><tr><td>10:30<\/td><td>Swarm Desktop 0.56.3 still not published, per Socket<\/td><\/tr><tr><td>14:52<\/td><td>Socket publishes its research<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Source: <a href=\"https:\/\/socket.dev\/blog\/bee-js-compromise\" target=\"_blank\" rel=\"noopener\">Socket<\/a>. The command-and-control domain was registered on 6 November, three days before the releases.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Who is affected<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The direct victims are developers, CI pipelines and Swarm Desktop users who installed the two malicious versions, along with any credentials those machines could reach. <strong>MAG212 CYBER analysis:<\/strong> the wider lesson applies to every organisation that publishes software, because the attack worked through release automation that many projects share.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How the attack works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Socket\u2019s account (<a href=\"https:\/\/socket.dev\/blog\/bee-js-compromise\" target=\"_blank\" rel=\"noopener\">Socket<\/a>):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>The accounts:<\/strong> <code>nugaon<\/code>, a maintainer with force-push rights to an unprotected <code>master<\/code> branch, and <code>bee-worker<\/code>, the release-automation account.<\/li>\n\n\n<li><strong>bee-js:<\/strong> an unsigned commit turned a version-generation script into a loader and changed the <code>prepare<\/code> hook to <code>postinstall<\/code>. A GitHub release then triggered the project\u2019s legitimate npm publishing workflow, whose publish environment had no required reviewers and no tag policy.<\/li>\n\n\n<li><strong>Swarm Desktop:<\/strong> an unsigned branch named <code>emergency\/0.56.2<\/code> added the loader, and a manually dispatched pre-release workflow that accepts any branch and holds Apple and Windows signing certificates built, signed and notarized the trojanized app.<\/li>\n\n\n<li><strong>Payload:<\/strong> the loader fetches code from <code>api.frameworkmetrics[.]xyz<\/code>, steals the Swarm node\u2019s configuration (which holds a plaintext password) and key, then installs a Go backdoor under <code>~\/.solidity\/<\/code> on macOS and Linux that reads its server address from an Ethereum contract. On Windows it attempts a UAC bypass, adds a Defender exclusion and silently installs ConnectWise ScreenConnect as a SYSTEM service.<\/li>\n\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"729\" src=\"https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/08-bee-js-swarm-desktop-supply-chain-compromise-signed-malware-diagram.jpg\" alt=\"Attack chain: hijacked GitHub accounts, unsigned changes, legitimate release workflows and trusted-looking releases, followed by loader, theft and persistence stages; a bar marks the 75-minute npm window on 9 November.\" class=\"wp-image-4137\" srcset=\"https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/08-bee-js-swarm-desktop-supply-chain-compromise-signed-malware-diagram.jpg 1600w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/08-bee-js-swarm-desktop-supply-chain-compromise-signed-malware-diagram-300x137.jpg 300w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/08-bee-js-swarm-desktop-supply-chain-compromise-signed-malware-diagram-1024x467.jpg 1024w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/08-bee-js-swarm-desktop-supply-chain-compromise-signed-malware-diagram-768x350.jpg 768w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/08-bee-js-swarm-desktop-supply-chain-compromise-signed-malware-diagram-1536x700.jpg 1536w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/08-bee-js-swarm-desktop-supply-chain-compromise-signed-malware-diagram-18x8.jpg 18w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">From hijacked accounts to signed malware. Based on Socket\u2019s research. Diagram: MAG212 CYBER<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What to look for<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Key indicators published by Socket; the full list, including commit hashes and the npm integrity string, is in its post (<a href=\"https:\/\/socket.dev\/blog\/bee-js-compromise\" target=\"_blank\" rel=\"noopener\">Socket<\/a>):<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Type<\/th><th>Indicator<\/th><\/tr><\/thead><tbody><tr><td>Package<\/td><td><code>@ethersphere\/bee-js@13.3.0<\/code><\/td><\/tr><tr><td>Domain<\/td><td><code>api.frameworkmetrics[.]xyz<\/code><\/td><\/tr><tr><td>Hub IPs (port 4912)<\/td><td><code>193.57.9[.]155<\/code>, <code>193.57.9[.]17<\/code>, <code>178.16.54[.]222<\/code>, <code>107.189.27[.]223<\/code>, <code>107.189.27[.]46<\/code>, <code>91.108.240[.]156<\/code>, <code>107.189.16[.]215<\/code><\/td><\/tr><tr><td>ScreenConnect relay<\/td><td><code>185.232.84[.]169:8041<\/code><\/td><\/tr><tr><td>Ethereum contract<\/td><td><code>0xf8a900Db50b3331be6B768bA460BB59f3E40C344<\/code><\/td><\/tr><tr><td>Persistence<\/td><td><code>~\/.solidity\/<\/code>; <code>solidity-langsupport-runner.service<\/code>; LaunchAgent <code>com.solidity.langsupport.runner<\/code>; service <code>ScreenConnect Client (5cbe79c9c25524df)<\/code><\/td><\/tr><tr><td>Desktop log<\/td><td><code>Bee Desktop version: 0.56.2 (production)<\/code> in <code>bee-desktop.log<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Investigate, contain and fix<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Search lockfiles, caches and internal registries for bee-js 13.3.0; pin 13.2.0 and purge mirrors.<\/li>\n\n\n<li>Treat any machine or CI job that installed 13.3.0 with install scripts enabled during the exposure window as compromised, even if the install failed.<\/li>\n\n\n<li>Rotate every credential those machines or jobs could reach, including cloud credentials trusted through CI OIDC.<\/li>\n\n\n<li>Swarm Desktop users: assume the node password and key are stolen and move funds to a new key from a clean machine.<\/li>\n\n\n<li>Manually remove <code>~\/.solidity\/<\/code>, the LaunchAgent, the systemd unit and the ScreenConnect service; reinstalling the app does not remove them.<\/li>\n\n\n<li>Hunt in DNS and proxy logs for the domain and IP addresses above.<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><em>All steps from <a href=\"https:\/\/socket.dev\/blog\/bee-js-compromise\" target=\"_blank\" rel=\"noopener\">Socket<\/a>. No vendor commands were published, so none are given.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to confirm you\u2019re clean<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lockfiles and builds resolve bee-js to 13.2.0.<\/li>\n\n\n<li>The persistence files, services and ScreenConnect client are gone, and stay gone after a reboot.<\/li>\n\n\n<li>No further connections appear to the hub or relay addresses.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Lessons for maintainers, admins and leaders<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Maintainers:<\/strong> require reviewers on publish environments, restrict which tags can deploy, protect release branches, and never expose signing credentials to manually dispatched workflows. Scope release-bot tokens narrowly and rotate them (Socket\u2019s recommendations).<\/li>\n\n\n<li><strong>Security teams:<\/strong> valid provenance and notarization prove which pipeline built the code, not that the code is safe.<\/li>\n\n\n<li><strong>Leaders:<\/strong> GitHub plans to block <code>pull_request_target<\/code> workflows by default from 2 December (<a href=\"https:\/\/socket.dev\/blog\/github-to-block-pull-request-target\" target=\"_blank\" rel=\"noopener\">Socket<\/a>); use it as a prompt to review who can trigger your own release pipelines.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What we still don\u2019t know<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>How the two GitHub accounts were compromised.<\/li>\n\n\n<li>How many installs of 13.3.0 occurred during the window.<\/li>\n\n\n<li>Whether Swarm Desktop 0.56.3 has shipped and whether Ethersphere has published its own advisory.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Related on MAG212 CYBER<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cyber.mag212.com\/mag212-cyber-daily-2026-11-10-openssh-sshole-sonicwall-qubole\/\">MAG212 CYBER Daily, 10 November 2026<\/a><\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/socket.dev\/blog\/bee-js-compromise\" target=\"_blank\" rel=\"noopener\">Socket: bee-js compromise (9 Nov 2026)<\/a><\/li>\n\n\n<li><a href=\"https:\/\/thehackernews.com\/2026\/11\/hackers-compromise-etherspheres-bee-js.html\" target=\"_blank\" rel=\"noopener\">The Hacker News: Ethersphere bee-js and Swarm Desktop compromised (9 Nov 2026)<\/a><\/li>\n\n\n<li><a href=\"https:\/\/socket.dev\/blog\/github-to-block-pull-request-target\" target=\"_blank\" rel=\"noopener\">Socket: GitHub to block pull_request_target by default (5 Nov 2026)<\/a><\/li>\n\n<\/ul>\n\n","protected":false},"excerpt":{"rendered":"<p>Hijacked maintainer and release-bot accounts ran Ethersphere\u2019s own workflows to publish malicious bee-js 13.3.0 with valid npm provenance and signed Swarm Desktop 0.56.2 builds. How it worked, Socket\u2019s indicators, who must treat machines as compromised and the CI\/CD lessons.<\/p>","protected":false},"author":1,"featured_media":4136,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,15],"tags":[269,298,285,149,56],"class_list":["post-4138","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cyber-incidents","category-threat-intelligence","tag-github","tag-malware","tag-npm","tag-supply-chain","tag-supply-chain-attack"],"_links":{"self":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts\/4138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/comments?post=4138"}],"version-history":[{"count":1,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts\/4138\/revisions"}],"predecessor-version":[{"id":4146,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts\/4138\/revisions\/4146"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/media\/4136"}],"wp:attachment":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/media?parent=4138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/categories?post=4138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/tags?post=4138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}