WebAssembly - Sécurité

Selon le site officiel de WebAssembly.org, disponible sur https://webassembly.org/docs/security/ l'objectif principal de WebAssembly en termes de sécurité est le suivant -

Le modèle de sécurité de WebAssembly a deux objectifs importants -

  • Protégez les utilisateurs contre les modules bogués ou malveillants, et

  • Fournissez aux développeurs des primitives et des atténuations utiles pour développer des applications sûres, dans les limites de (1).

Le code compilé, c'est-à-dire WASM de C / C ++ / Rust, n'est pas directement exécuté dans le navigateur et utilise les API Javascript. Le code WASM est sandbox, c'est-à-dire exécuté via le wrapper API Javascript et le navigateur parle à WASM en utilisant l'API.

Voici un exemple d'utilisation d'un fichier .wasm dans le navigateur.

Exemple - C Program

#include<stdio.h> 
int square(int n) { 
   return n*n; 
}

Nous utiliserons l'explorateur WASM pour obtenir le code wasm -

Téléchargez le code WASM et utilisez-le pour tester les API.

Exemple

<script type="text/javascript"> 
   const importObj = {
      module: {}
   }; 
   fetch("findsquare.wasm")      
      .then(bytes => bytes.arrayBuffer())          
      .then(module => WebAssembly.instantiate(module,importObj))                 
      .then(finalcode => {
         
      console.log(finalcode); console.log(finalcode.instance.exports.square(25)); 
   }); 
</script>

Production

Vous obtiendrez la sortie suivante -

Les objets exports ont une référence à la fonction à appeler. Pour appeler la fonction square, vous devrez le faire comme suit -

console.log(finalcode.instance.exports.square(25));

Problèmes avec le code compilé WASM

Voici les problèmes avec le code compilé WASM -

  • Il est difficile de vérifier si un code malveillant est inséré lors de la compilation du code vers wasm. Il n'y a pas d'outils disponibles pour le moment pour valider le code.

  • Wasm est difficile à analyser et le code bogué / malveillant peut être facilement exécuté dans le navigateur.