Ce qui se passe
Le 9 novembre 2026, deux versions piégées d'outils du projet Ethersphere, qui développe le réseau de
stockage décentralisé Swarm, ont été publiées : @ethersphere/bee-js 13.3.0 sur npm et Swarm Desktop
0.56.2 sur GitHub. Les attaquants sont passés par l'automatisation de publication du projet, le compte
bee-worker, avec des identifiants de CI volés selon l'un des mainteneurs ; on ignore comment ils l'ont été.
Les deux versions sont depuis retirées. L'avis GHSA-hh7j-5m3j-23pf est sans nuance : toute machine qui a
installé ou fait tourner ce paquet doit être tenue pour entièrement compromise.
La fenêtre d'exposition
- bee-js 13.3.0 : dernière version sur npm de 00 h 09 à 01 h 25 UTC, soit environ 75 minutes. Socket estime à une dizaine ses téléchargements, scanners et miroirs compris.
- Swarm Desktop 0.56.2 : publié vers 00 h 36 UTC, retiré environ 8 h 30 plus tard, avec 65 téléchargements à 08 h 27 UTC, chercheurs compris. Le programme de mise à jour intégré pouvait le proposer aux Windows x64 et aux Mac Apple Silicon dans les dix minutes ; jamais aux Mac Intel, et les installations Linux ne se mettent pas à jour seules.
swarm-cli,bee-dashboardet le code source de Swarm Desktop acceptaient une plage de versions qui incluait 13.3.0 : une installation neuve dans la fenêtre pouvait la tirer sans que vous l'ayez demandé.
Le mécanisme
Les deux versions portent le même chargeur, quelques lignes qui téléchargent du code sur
api.frameworkmetrics[.]xyz et l'exécutent avec vos droits. Dans bee-js, c'est le script postinstall, que
npm lance tout seul à l'installation tant que les scripts ne sont pas désactivés : il n'est pas nécessaire
d'importer la bibliothèque. Dans Swarm Desktop, il s'exécute à chaque démarrage.
Le code récupéré cherche deux fichiers dans le dossier de données de Swarm Desktop, config.yaml et
data-dir/keys/swarm.key. La clé est un keystore Ethereum chiffré, mais son mot de passe est écrit en clair
dans config.yaml : avec les deux, l'attaquant peut vider les xDAI, les xBZZ, le chequebook et la mise en
jeu du nœud. Il installe ensuite une porte dérobée :
- Linux et macOS : un shell distant écrit en Go,
evjawbreaker, dans le dossier caché~/.solidity, lancé en service utilisateur (Linux) ou en LaunchAgent (macOS). Il lit l'adresse de son serveur de contrôle dans un contrat Ethereum, donc modifiable à tout instant. - Windows : un vrai client ScreenConnect, signé par ConnectWise, installé en service système. Pour un administrateur, le code contourne l'invite UAC par une méthode connue, ajoute une exclusion à Microsoft Defender et installe le client sans bruit.
Pourquoi la provenance n'a rien dit
L'attaquant a créé une release GitHub, ce qui a déclenché le workflow de publication npm du projet : aucune
approbation requise, paquet publié en 73 secondes. Comme c'est le vrai workflow qui l'a construit, le
paquet porte une provenance valide. Elle atteste où un paquet a été fabriqué, pas que quelqu'un a relu le
code qu'il contient. Côté Swarm Desktop, la build a été lancée à la main sur un workflow qui détenait les
certificats de signature Apple et Windows : l'application macOS était signée du Developer ID du projet et
notariée, si bien que macOS n'a affiché que l'invite habituelle du premier lancement. Les mainteneurs ont depuis
soumis les jobs de signature à l'approbation de l'équipe DevOps et les limitent à la branche main.
Comment s'y prendre
Si vous utilisez bee-js dans un projet ou une CI :
grep -n -A2 "ethersphere/bee-js" package-lock.json pnpm-lock.yaml yarn.lock 2>/dev/null | grep "13.3.0"
npm install @ethersphere/bee-js@13.2.0 --save-exact- Cherchez
@ethersphere/bee-js@13.3.0dans les lockfiles, les caches de paquets, les registres internes et les journaux d'installation de la CI, y compris quand un autre paquet l'a tiré. - Épinglez 13.2.0, la version saine redevenue la dernière sur npm, et purgez les copies de 13.3.0, miroirs compris.
- Si 13.3.0 a été installée scripts activés, tenez la machine ou le runner pour compromis, même si le journal n'affiche aucune erreur : le code masque ses erreurs réseau. Depuis une machine saine, changez tous les mots de passe, jetons et clés que l'utilisateur ou le job pouvait lire.
Si vous utilisez Swarm Desktop :
- Cherchez la ligne
Bee Desktop version: 0.56.2 (production)dansbee-desktop.log, écrite à chaque lancement juste avant l'exécution du code malveillant :~/Library/Logs/Swarm Desktop/(macOS),%LOCALAPPDATA%\Swarm Desktop\Log\(Windows),~/.local/state/Swarm Desktop/(Linux). - Installez 0.56.3, qui est le code de 0.56.1 resigné avec un nouveau certificat Developer ID ; l'updater y migre les 0.56.2, sauf sous Linux où il faut remplacer le paquet à la main.
- Si 0.56.2 a tourné une seule fois, considérez la clé et son mot de passe comme volés et déplacez fonds, chequebook et mise en jeu vers une nouvelle clé, depuis une machine saine.
Sur toute machine où le code a tourné, supprimez ~/.solidity/, le service utilisateur
solidity-langsupport-runner.service (Linux), le LaunchAgent com.solidity.langsupport.runner (macOS) et le
service ScreenConnect Client (5cbe79c9c25524df) (Windows). Mettre à jour, réinstaller ou supprimer
l'application ne les enlève pas ; reconstruire la machine depuis une image de confiance vaut mieux que la
nettoyer sur place.
Indicateurs de compromission
domaine api.frameworkmetrics[.]xyz (retirez les crochets pour chercher)
chemins /v1/analytics (chargeur bee-js) /v1/electron (chargeur Swarm Desktop)
/v1/assets/ (autres charges) /v1/swarm/report (fichiers de portefeuille volés)
en-tête HTTP X-Ethersphere: 1
IP:port 193.57.9.155:4912 (serveur de contrôle d'evjawbreaker)
IP:port 185.232.84.169:8041 (relais ScreenConnect)
contrat 0xf8a900Db50b3331be6B768bA460BB59f3E40C344
SHA-256 9b73e7cd4e1425e770392549d8df46c706139ef476f4f7b9ac405165dc8d9696 linux_amd64
b601776817363b96295119f7221338a122d5247a35a77a64b04f286e1bbcc565 linux_arm64
80d2672e2599732d3c0ae2a4cd0d1e3fe4d555a60273ce33feb99db3f34d250f darwin_amd64
fae61f31f00988fdc5cc9e7272b51e08af2e245d81003237875415930fd27358 darwin_arm64
37d14bff30762ca701e9c1f8bc6c57c065bb20ae3a2208cb7411a6530610f08e invoke.ps1
7527e86d70e7c9493db4356f1c3775380431b310000f2602c1e993cf435d01da app.msiUn acteur déjà connu
Les charges partagent un contrat Ethereum, un relais ScreenConnect et des noms de fichiers avec de fausses extensions pour développeurs Solidity apparues sur Open VSX en septembre, décrites par Pluto Security dans son analyse EtherDuck du 1er octobre. Pluto les rattache « avec un haut niveau de confiance » au groupe de l'extension SleepyDuck de 2025, et Socket attribue à ce même groupe les versions de bee-js et de Swarm Desktop. Aucun vol de fonds n'était signalé au moment de la rédaction.
Source : The Hacker News, qui cite l'analyse de Socket, celle de SafeDep et l'avis GHSA-hh7j-5m3j-23pf. Sources en anglais.