veilletech.fr
10 nov. Feed du jour
#01 SÉCURITÉ Faille

bee-js 13.3.0 : un postinstall vole votre clé Swarm

Une provenance valide ne dit pas que le code est sain.

Le 9 novembre 2026, des attaquants ont publié, avec des identifiants de CI volés, @ethersphere/bee-js 13.3.0 sur npm et Swarm Desktop 0.56.2. Un script postinstall télécharge un chargeur qui vole la clé du portefeuille du nœud et installe une porte dérobée sur Windows, macOS et Linux. Les deux versions sont retirées, mais ce retrait ne nettoie pas une machine déjà touchée.

5 min de lectureintermédiairevidéo 1:18
Partager
Sommaire8 sections
  1. Ce qui se passe
  2. La fenêtre d'exposition
  3. Le mécanisme
  4. Pourquoi la provenance n'a rien dit
  5. Comment s'y prendre
  6. Indicateurs de compromission
  7. Un acteur déjà connu
  8. À retenir

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

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 :

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 :

Terminal
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
  1. Cherchez @ethersphere/bee-js@13.3.0 dans 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é.
  2. Épinglez 13.2.0, la version saine redevenue la dernière sur npm, et purgez les copies de 13.3.0, miroirs compris.
  3. 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 :

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

TEXT
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.msi

Un 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.