WebAssembly est-il sécurisé ? 5 risques de sécurité propres à WebAssembly
Marcelo Oliveira
28 juillet 2023
0 minutes de lectureWebAssembly, 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 :
Téléchargez et installez Visual Studio ou VS Code. Vous utiliserez cet environnement de développement intégré (IDE) pour écrire et exécuter le code WebAssembly. Si vous choisissez VS Code, téléchargez et installez ensuite le .NET SDK et l’extension C#.
Installez l’extension Visual Studio ou l’extension Snyk pour VS Code. Ce plugin analysera notre code WebAssembly et en évaluera la sécurité.
Téléchargez le projet exemple.
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 :

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

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.

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.

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.

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.

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.

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.

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 :
Le compilateur JIT transforme ensuite cette instruction en une série d’instructions natives en code x86 :
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.

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.

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.

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



