Skip to main content

WebAssembly est-il sécurisé ? 5 risques de sécurité propres à WebAssembly

Écrit par

Marcelo Oliveira

feature Cloud Compliance

28 juillet 2023

0 minutes de lecture

WebAssembly, parfois appelé Wasm, est un format d’instructions binaires portable de bas niveau, exécuté dans la machine virtuelle (VM) d’un navigateur Web. Il permet aux développeurs d’écrire du code performant dans différents langages et fonctionne en parallèle de JavaScript. 

Les développeurs adoptent WebAssembly pour sa capacité à accélérer les algorithmes complexes, à prendre en charge les jeux et les applications multimédias, et à fournir un environnement isolé sécurisé pour exécuter du code non fiable. Toutefois, avant d’adopter WebAssembly, il est essentiel d’en examiner les implications en matière de sécurité et de savoir comment atténuer les risques.

Principaux risques de sécurité liés à WebAssembly

Les développeurs peuvent compiler de nombreux langages de programmation modernes en WebAssembly. Malgré ses avantages, WebAssembly peut contourner les mesures de sécurité traditionnelles et exécuter du code malveillant dans le navigateur. 

Examinons de plus près les problèmes de sécurité propres à WebAssembly en créant un exemple d’application avec Blazor, le framework Web open source. Blazor nous permet d’écrire du code C# plutôt que du JavaScript pour nos pages Web. Le code C# est compilé en bibliothèques de liens dynamiques (DLL) et en fichiers WebAssembly (.wasm), qui s’exécutent dans le navigateur client.  

Prérequis

Avant de commencer ce tutoriel, assurez-vous de disposer des éléments suivants :

Exécuter le projet exemple

Si vous avez choisi Visual Studio comme IDE, ouvrez Visual Studio Installer et cochez l’option Outils de build .NET WebAssembly :

Liste des composants du programme d’installation, avec .NET WebAssembly Build Tools sélectionné

Ouvrez le menu Outils > Options > Snyk, puis Paramètres généraux. Cliquez ensuite sur le bouton Connecter Visual Studio à Snyk.io.

Fenêtre des options de Visual Studio affichant les paramètres généraux de Snyk, notamment le jeton, le point de terminaison personnalisé, l’organisation et les commandes de connexion

Si vous avez choisi VS Code comme IDE, cliquez sur l’icône Snyk dans la barre d’outils à gauche. Cliquez ensuite sur Faire confiance à l’espace de travail et se connecter.

Visual Studio Code affiche un panneau de bienvenue Snyk invitant les utilisateurs à faire confiance à l’espace de travail et à se connecter pour lancer une première analyse de sécurité.

Exécutez le programme dans Visual Studio ou VS Code pour lancer l’exemple d’application, qui ressemble à la capture d’écran ci-dessous : elle comporte le titre « Ressources humaines », une image et du texte.

Illustration de trois employés aux profils variés au-dessus d’une page Web de ressources humaines avec des liens de navigation vers Accueil, Récupérer les données, Ressources humaines et Marketing

Risque de sécurité n° 1 : isolation des modules WebAssembly

Pour garantir la sécurité des applications Web qui utilisent cette technologie, vous devez isoler les modules WebAssembly. Isoler les modules les uns des autres et de l’environnement hôte signifie qu’ils fonctionnent chacun indépendamment, sans interférer avec le comportement des autres modules ni de l’application hôte. L’isolation des modules est essentielle lors de l’exécution de code non fiable : elle empêche le code malveillant d’accéder à des données ou ressources sensibles.

Deux bonnes pratiques permettent de mettre en œuvre l’isolation des modules : le sandboxing et la compartimentation.

Le sandboxing consiste à placer chaque module dans un environnement distinct et isolé, qui limite son accès au système hôte et aux autres modules. L’image ci-dessous montre un projet comportant deux modules WebAssembly (Finance et Ressources humaines). Lors de la compilation et du déploiement du projet dans le navigateur Web, les modules WebAssembly s’exécutent dans un environnement sandboxé, séparé de l’environnement d’exécution hôte.

Explorateur de solutions de Visual Studio affichant la solution SnykWebAssembly avec les projets Core, ModuleHumanResources et ModuleMarketing.

La compartimentation consiste à répartir l’application hôte et ses modules dans des compartiments distincts, chacun disposant de ses propres ressources et droits d’accès. 

Le sandboxing et la compartimentation créent tous deux un environnement sécurisé capable d’exécuter du code non fiable sans compromettre la sécurité du système hôte ni celle des autres modules.

Utilisez ensuite l’extension Snyk pour Visual Studio Code afin de vérifier si du code WebAssembly présente des vulnérabilités. Ouvrez le menu Extensions > Snyk, puis cliquez sur Analyser.

Capture d’écran du menu Extensions d’un éditeur de code avec les options Snyk pour analyser, arrêter, nettoyer et accéder aux paramètres

Snyk analyse le fichier et détecte les problèmes connus de qualité du code WebAssembly ainsi que les vulnérabilités liées à l’open source et à la sécurité du code. En cas de problème ou de vulnérabilité, Snyk fournit des détails et des recommandations pour y remédier.

Tableau de bord Snyk affichant zéro vulnérabilité open source, vulnérabilité de sécurité du code ou problème de qualité du code

Risque de sécurité n° 2 : modèle de mémoire linéaire de WebAssembly

Le modèle de mémoire linéaire est une technique d’adressage mémoire qui utilise un espace d’adressage contigu unique pour organiser la mémoire. Cette approche permet à l’unité de traitement d’accéder directement et séquentiellement aux emplacements mémoire. L’image ci-dessous montre un objet — partagé entre le code JavaScript et WebAssembly — qui utilise un espace de la mémoire linéaire.

Schéma montrant JavaScript et WASM échangeant des objets par l’intermédiaire de zones mises en évidence de la mémoire linéaire partagée.

La fonctionnalité de mémoire linéaire de WebAssembly permet aux modules d’allouer et d’accéder à un bloc de mémoire contigu, à la manière d’un tableau classique. Si ce modèle permet de gérer la mémoire efficacement et rapidement dans les applications WebAssembly, il introduit également des risques de sécurité.

Par exemple, si un module accède à une zone mémoire située en dehors de la plage qui lui est allouée, il peut corrompre la mémoire d’autres modules ou du système hôte. Cela peut entraîner un plantage ou une faille de sécurité.

Pour atténuer les risques de sécurité liés au modèle de mémoire linéaire dans les applications WebAssembly, suivez ces bonnes pratiques : 

  • Effectuez une vérification des limites pour garantir que les modules n’accèdent qu’à la plage mémoire qui leur est allouée. 

  • Évitez les fonctions non sécurisées pour prévenir les vulnérabilités liées à la corruption de la mémoire. 

  • Mettez en œuvre des mécanismes de protection de la mémoire, tels que la randomisation de l’espace d’adressage (ASLR) et la prévention de l’exécution des données (DEP).

Risque de sécurité n° 3 : compilation JIT de WebAssembly

La compilation à la volée (JIT) de WebAssembly convertit le code Wasm en code machine au moment de l’exécution, plutôt qu’à l’avance. Bien que ce processus offre des gains de performance importants, il introduit également des risques de sécurité potentiels.

La nature dynamique de la compilation JIT complique la détection et la prévention des attaques. Des acteurs malveillants peuvent injecter du code malveillant dans le processus de compilation et l’exécuter dans l’environnement hôte. Par exemple, un pirate pourrait créer une constante apparemment inoffensive dans un langage de programmation de haut niveau :

var a = (0x11223344^0x44332211^0x44332211^ ...);

Le compilateur JIT transforme ensuite cette instruction en une série d’instructions natives en code x86 :

0000:  b8 44 33 22 11      mov $0x11223344,%eax    mov eax,0x11223344
0005:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211
000a:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211

L’attaquant exploite un bogue connu pour déplacer le pointeur d’exécution vers l’adresse 0001. Cela déclenche l’exécution d’un ensemble d’instructions malveillantes, soigneusement conçues et injectées dans la constante ci-dessus.

Schéma montrant un attaquant injectant une constante dans WebAssembly et exploitant la compilation JIT pour déplacer le pointeur d’exécution et exécuter du code malveillant.

Pour atténuer les risques de sécurité liés à la compilation JIT dans les applications WebAssembly, appliquez les bonnes pratiques suivantes afin de gérer le processus de compilation :

  • Utilisez la compilation anticipée (AOT) pour compiler le code Wasm en code machine avant l’exécution. Cette approche élimine les risques liés à la compilation dynamique. 

  • Appliquez les correctifs de sécurité pour les vulnérabilités connues des compilateurs JIT.

Risque de sécurité n° 4 : API Web et cross-site scripting (XSS)

WebAssembly peut interagir avec les API Web pour accéder aux ressources et aux données des navigateurs Web, des serveurs et d’autres plateformes. Toutefois, ces interactions peuvent entraîner des risques de sécurité, comme les attaques par cross-site scripting (XSS). Dans les attaques XSS, les pirates injectent du code malveillant dans des pages ou des applications Web. Les utilisateurs peuvent ensuite exécuter ce code à leur insu, entraînant un accès non autorisé ou un vol de données.

Schéma illustrant une attaque XSS : un attaquant injecte un script dans une application web. Celui-ci s’exécute pour les utilisateurs et envoie leurs données sensibles à l’attaquant.

Pour atténuer les risques d’attaques XSS dans les applications WebAssembly, appliquez les bonnes pratiques de validation des entrées et d’encodage des sorties :

  • La validation des entrées consiste à vérifier si les données saisies par l’utilisateur contiennent du code ou des caractères potentiellement malveillants, puis à rejeter toute entrée qui ne répond pas à des critères précis. 

  • L’encodage des sorties consiste à encoder les données saisies par l’utilisateur ou les données de sortie afin d’empêcher l’exécution de code malveillant. 

Utilisez également HTTPS pour chiffrer les données échangées entre le serveur et le client et empêcher les attaquants de les intercepter et de les modifier en transit.

Risque de sécurité n° 5 : distribution non sécurisée du contenu WebAssembly

La distribution sécurisée du contenu est essentielle pour les applications WebAssembly : elle garantit aux utilisateurs de recevoir un code authentique et intact, transmis par un canal de confiance. Une distribution non sécurisée peut entraîner des risques de sécurité, notamment des attaques de l’homme du milieu (MITM) et la falsification du code. 

Lors d’une attaque MITM, les attaquants interceptent et modifient le code échangé entre le serveur et le client. Ils peuvent ainsi injecter du code malveillant dans l’application, que le navigateur ou l’environnement d’exécution Wasm peut alors exécuter.

Schéma montrant un attaquant de type homme du milieu qui intercepte les connexions entre des utilisateurs et une application web.

Pour sécuriser la distribution du contenu dans les applications WebAssembly, suivez ces bonnes pratiques :

  • Utilisez HTTPS pour chiffrer les données échangées entre le serveur et le client et garantir une transmission sécurisée du code sans altération.

  • Utilisez des contrôles d’intégrité du contenu, tels que des sommes de contrôle ou des signatures numériques, pour vérifier l’authenticité du code. 

  • Mettez en œuvre des mécanismes de contrôle d’accès afin de réserver l’accès au code aux utilisateurs autorisés.

Compilez en toute sécurité

Les développeurs ont adopté avec enthousiasme WebAssembly, une technologie qui leur permet d’écrire des applications performantes dans les navigateurs Web. Toutefois, les avantages de WebAssembly s’accompagnent de risques de sécurité importants.

Cet article a présenté plusieurs problèmes de sécurité liés à WebAssembly : une isolation inadéquate des modules, l’absence de protection dans le modèle de mémoire linéaire, les vulnérabilités des compilateurs JIT, les attaques par cross-site scripting et la distribution non sécurisée du contenu WebAssembly.

Heureusement, plusieurs bonnes pratiques permettent d’atténuer les vulnérabilités introduites par WebAssembly. En suivant ces mesures de sécurité, vous contribuez à protéger les utilisateurs et leurs applications WebAssembly.

Pour protéger vos systèmes et vos utilisateurs, il est également essentiel de suivre l’évolution des dernières menaces de sécurité qui touchent WebAssembly. Les outils de développement peuvent vous aider. Par exemple, la plateforme Snyk tient à jour un vaste catalogue de vulnérabilités connues et propose des conseils concrets pour atténuer les risques. Des outils comme Snyk Code et Snyk Open Source vous permettent de détecter et de résoudre rapidement les problèmes de sécurité du code. Créez votre compte gratuit dès aujourd’hui.

Sécurisez vos applications JavaScript dès maintenant

Détectez et corrigez gratuitement les vulnérabilités JavaScript avec Snyk. 

Aucune carte de crédit requise.

Ou inscrivez-vous avec Azure AD Docker ID Bitbucket

En utilisant Snyk, vous acceptez de respecter nos politiques, notamment nos Conditions d’utilisation et notre Politique de confidentialité.

Lire la suite

Blog

Les modèles de pointe ont trouvé les vulnérabilités. Seul l’attaquant a trouvé les chaînes d’exploitation.

L’analyse statique a détecté les failles, mais seuls des tests d’attaque en conditions réelles ont prouvé comment elles pouvaient être enchaînées pour provoquer des compromissions. Comparaison d’Evo COS, de Claude Security et de Claude Code Security.

feature insights context
Blog

Les attaques autonomes sont déjà là. La défense doit suivre leur rythme.

Les attaquants autonomes réduisent la fenêtre de défense. Découvrez comment la découverte, la correction, la validation et la prévention continues peuvent aider les équipes de sécurité à suivre le rythme.

Blog

Pourquoi les agents de codage IA créent-ils sans cesse des failles de contrôle d’accès ?

Les agents de codage IA peuvent générer une logique d’autorisation qui compile et passe la revue, tout en exposant les données d’un tenant à un autre. Découvrez pourquoi les failles de contrôle d’accès sont difficiles à détecter et comment les prévenir.