LavaMoat est un outil gratuit et open-source destiné à toute équipe de développement JavaScript soucieuse de la sécurité de sa chaîne d'approvisionnement logicielle. Cette création du cofondateur de MetaMask, Kumavis, répond simultanément aux préoccupations de sécurité dans le Web3 et aux problèmes structurels de longue date liés à la sécurité dans l'écosystème open-source.
Si vous développez en JavaScript (JS en abrégé), vous devez comprendre les enjeux de sécurité liés à ce langage et à ses dépendances. Les développeurs JS construisent rarement une application « from scratch » ; ils importent généralement des morceaux de code existants, appelés « dépendances », dans leur projet pour les utiliser comme des briques de construction. C'est idéal pour la collaboration et la rapidité de développement, mais que se passe-t-il si du code malveillant se trouve dans l'une de ces dépendances ?
La sécurité de la chaîne d'approvisionnement logicielle englobe tout ce qui touche à une application (comme les dépendances) ou qui joue un rôle dans son développement (comme les outils de build ou les systèmes CI). JavaScript est le langage le plus populaire auprès des développeurs de loin, et il est également très vulnérable aux attaques sur la chaîne d'approvisionnement. Cette chronologie des vulnérabilités datant de 2017 montre qu'une bonne moitié des attaques provient de npm, une source populaire de packages JS open-source :
Source : SonaType
JavaScript est ciblé en raison de :
Sa popularité : Il est utilisé aussi bien côté front-end que back-end
Son autorité ambiante : Lorsque vous exécutez du JavaScript, vous avez accès à de nombreuses ressources, comme l'accès réseau
Sa mutabilité : Tout est modifiable par défaut
Le piratage du portefeuille Copay en 2018 a poussé Kumavis à s'attaquer à ce problème et constitue le cas d'étude principal ayant guidé la conception de LavaMoat. Copay était un portefeuille Bitcoin self-custodial de BitPay qui a été la cible d'un piratage de chaîne d'approvisionnement ayant entraîné le vol de fonds d'utilisateurs. Une dépendance npm utilisée par le portefeuille était contrôlée par un attaquant, lui permettant de déployer l'attaque.
Alors, quelle est la solution ? Plusieurs arguments ont été avancés pour résoudre ce problème.
Ne jamais utiliser de dépendances ? Non.
Certes, ce serait peut-être plus sûr, mais allez-vous renoncer à l'open-source — cette richesse commune qui constitue les fondations sur lesquelles nous construisons tous ? Au partage et à la collaboration ? Si vous cherchez à construire quelque chose de complexe, voulez-vous vraiment passer du temps à réinventer la roue ?
Nous non plus.
Auditer toutes les dépendances en permanence ? Non.
C'est une bonne idée, mais combien de dépendances avez-vous ? Des centaines ? Des milliers ? Des dizaines de milliers ? Ce n'est pas réaliste — même si vous souhaitez effectuer un audit manuel, LavaMoat vous aidera à prioriser les plus dangereuses (nous y reviendrons plus tard).
Et même si vous avez le temps d'examiner attentivement le package, serez-vous en mesure de détecter une faille de sécurité ?
Difficile de parier là-dessus. Explorons donc une solution différente :
LavaMoat ? Oui.
Plutôt que de ne jamais utiliser de dépendances ou de les auditer toutes en permanence, examinons le noyau de sécurité de LavaMoat, qui enveloppe les packages dans des compartiments et ne leur accorde accès qu'à ce dont ils ont besoin.
Car rappelons-le : pour qu'un code malveillant puisse attaquer votre système, il a besoin d'une autorisation pour le faire. Le noyau de LavaMoat parcourt le code tiers que vous intégrez à votre projet, détermine ce dont les dépendances ont besoin pour fonctionner, et ne leur accorde que cela**.**
LavaMoat protège actuellement des dizaines de millions d'utilisateurs chez MetaMask et intervient à trois moments distincts de chaque processus de développement : l'installation des dépendances, le build et l'exécution.
Pour mieux visualiser les choses, consultez ce tableau de bord de visualisation des graphes de dépendances :
La liste de vos dépendances apparaît à gauche, et le graphe est représenté sous forme de réseau neuronal à droite. Les couleurs sont basées sur une heuristique de dangerosité : par exemple, les éléments en vert n'importent aucune API de plateforme puissante.
L'objectif ici est de vous aider à prioriser l'audit de vos dépendances.
Comment mettre cela en œuvre ?
En tenant compte des trois phases de développement :
Installation : @lavamoat/allow-scripts
Build : lavamoat-node
Exécution : plugin lavamoat-x pour votre bundler
Cela devrait agir comme un fossé contre le code malveillant.
Développer des logiciels à grande échelle
Si vous souhaitez nous aider, LavaMoat est open-source ! Nous cherchons à créer des plugins pour le plus grand nombre de bundlers possible et souhaitons faciliter la révision des politiques et l'application de restrictions strictes lors de l'octroi d'accès réseau aux packages. Vous pouvez contribuer ici.
Et inscrivez-vous à notre newsletter développeur pour plus de mises à jour ! Bonne construction.