WebAssembly - Segurança

De acordo com o site oficial da WebAssembly.org, que está disponível em https://webassembly.org/docs/security/ o principal objetivo do WebAssembly em termos de segurança é o seguinte -

O modelo de segurança do WebAssembly tem dois objetivos importantes -

  • Proteja os usuários de módulos maliciosos ou com bugs e

  • Fornecer aos desenvolvedores primitivos e atenuações úteis para o desenvolvimento de aplicativos seguros, dentro das restrições de (1).

O código compilado, ou seja, WASM de C / C ++ / Rust, não é executado diretamente no navegador e faz uso de APIs de Javascript. O código WASM é colocado em sandbox, ou seja, executado por meio do wrapper Javascript API e o navegador se comunica com o WASM usando a API.

Aqui está um exemplo de como usar um arquivo .wasm dentro do navegador.

Exemplo - C Program

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

Faremos uso do WASM explorer para obter o código do wasm -

Baixe o código WASM e use-o para testar as APIs.

Exemplo

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

Resultado

Você obterá a seguinte saída -

Os objetos de exportação têm uma referência à função a ser chamada. Para chamar o quadrado de função, você terá que fazer o seguinte -

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

Problemas com o código compilado WASM

A seguir estão os problemas com o código compilado WASM -

  • É difícil verificar se há algum código malicioso sendo inserido, ao compilar o código para o wasm. Não há ferramentas disponíveis no momento para validar o código.

  • O Wasm é difícil de analisar e o código malicioso / com bugs pode ser facilmente executado dentro do navegador.