Qual é o nível de segurança do WebAssembly? 5 riscos de segurança exclusivos do WebAssembly
Marcelo Oliveira
28 de julho de 2023
0 minutos de leituraWebAssembly, às vezes chamado de Wasm, é um formato portátil de instruções em código binário de baixo nível, executado em uma máquina virtual (VM) do navegador. Ele permite que os desenvolvedores escrevam código de alto desempenho em várias linguagens e funciona em conjunto com JavaScript.
Os desenvolvedores adotam o WebAssembly por sua capacidade de acelerar algoritmos complexos, viabilizar jogos e aplicações multimídia e oferecer um ambiente isolado e seguro para executar código não confiável. No entanto, antes de adotar o WebAssembly, é fundamental considerar suas implicações de segurança e como reduzir os riscos.
Principais riscos de segurança do WebAssembly
Os desenvolvedores podem compilar muitas linguagens de programação modernas para WebAssembly. Mas, apesar de suas vantagens, o WebAssembly pode contornar as medidas de segurança tradicionais e, potencialmente, executar código malicioso no navegador.
Vamos analisar mais de perto os problemas de segurança específicos do WebAssembly criando um app de exemplo com Blazor, um framework web de código aberto. O Blazor permite escrever código C# em vez de JavaScript para nossas páginas. O código C# é compilado em bibliotecas de vínculo dinâmico (DLLs) e arquivos WebAssembly (.wasm), que são executados no navegador do cliente.
Pré-requisitos
Antes de começar este tutorial, confira se você tem:
Baixe e instale o Visual Studio ou o VS Code. Esse é o ambiente de desenvolvimento integrado (IDE) que você usará para escrever e executar o código WebAssembly. Se escolher o VS Code, baixe e instale também o .NET SDK e a extensão C#.
Instale a extensão do Visual Studio ou a extensão do Snyk para VS Code. Esse plugin fará a varredura do nosso código WebAssembly e fornecerá uma análise de segurança.
Baixe o projeto de exemplo.
Execute o projeto de exemplo
Se você escolheu o Visual Studio como IDE, abra o Visual Studio Installer e marque a opção .NET WebAssembly Build Tools:

Abra o menu Tools > Options > Snyk e, em seguida, General Settings. Depois, clique no botão Connect Visual Studio to Snyk.io.

Se você escolheu o VS Code como IDE, clique no ícone do Snyk na barra de ferramentas à esquerda. Depois, clique em Confiar no espaço de trabalho e conectar.

Execute o programa no Visual Studio ou no VS Code para abrir o app de exemplo, que aparece na captura de tela abaixo, com o título "Human Resources", uma imagem e um texto.

Risco de segurança nº 1: isolamento de módulos WebAssembly
Para manter a segurança das aplicações web que usam essa tecnologia, é preciso manter os módulos WebAssembly isolados. Isolar os módulos entre si e do ambiente hospedeiro significa que cada um opera de forma independente, sem interferir no comportamento dos outros módulos ou da aplicação hospedeira. O isolamento de módulos é fundamental ao executar código não confiável: ele impede que códigos maliciosos acessem dados ou recursos confidenciais.
Duas práticas recomendadas para implementar o isolamento de módulos são o uso de sandbox e a compartimentalização.
O uso de sandbox consiste em colocar cada módulo em um ambiente isolado e separado, que limita o acesso ao sistema hospedeiro e aos outros módulos. A imagem abaixo mostra um projeto com dois módulos WebAssembly (Finance e Human Resources). Quando o projeto é compilado e implantado no navegador, os módulos WebAssembly são executados em um ambiente de sandbox, separado do runtime hospedeiro.

A compartimentalização consiste em dividir a aplicação hospedeira e seus módulos em compartimentos separados, cada um com seus próprios recursos e privilégios de acesso.
Tanto o uso de sandbox quanto a compartimentalização criam um ambiente seguro para executar código não confiável sem comprometer a segurança do sistema hospedeiro ou de outros módulos.
Em seguida, use a extensão Snyk para Visual Studio Code para verificar se há vulnerabilidades no código WebAssembly. Abra o menu Extensions > Snyk e clique em Scan.

O Snyk analisa o arquivo e identifica problemas de qualidade de código conhecidos no WebAssembly, além de vulnerabilidades relacionadas à segurança de código e de código aberto. Se encontrar problemas ou vulnerabilidades, o Snyk apresenta os detalhes e recomendações para corrigi-los.

Risco de segurança nº 2: modelo de memória linear do WebAssembly
O modelo de memória linear é uma técnica de endereçamento que usa um único espaço de endereços contíguo para organizar a memória. Essa abordagem permite que a unidade de processamento acesse diretamente e em sequência os locais de memória. A imagem abaixo mostra um objeto compartilhado entre código JavaScript e WebAssembly, que ocupa um espaço na memória linear.

O recurso de memória linear do WebAssembly permite que os módulos aloquem e acessem um bloco contíguo de memória, como em um array tradicional. Embora esse modelo ofereça uma maneira rápida e eficiente de gerenciar a memória em aplicações WebAssembly, ele também introduz riscos de segurança.
Por exemplo, se um módulo acessar a memória fora do intervalo alocado, poderá corromper a memória de outros módulos ou do sistema hospedeiro. Isso pode causar uma falha ou uma violação de segurança.
Para reduzir os riscos de segurança relacionados ao modelo de memória linear em aplicações WebAssembly, siga estas práticas recomendadas:
Use verificações de limites para garantir que os módulos acessem apenas a memória dentro do intervalo alocado.
Evite funções inseguras para prevenir vulnerabilidades que possam corromper a memória.
Implemente mecanismos de proteção de memória, como a randomização do layout do espaço de endereços (ASLR) e a prevenção de execução de dados (DEP).
Risco de segurança nº 3: compilação JIT do WebAssembly
A compilação just-in-time (JIT) do WebAssembly transforma o código Wasm em código de máquina durante a execução, em vez de compilá-lo antecipadamente. Embora esse processo ofereça ganhos significativos de desempenho, também introduz possíveis riscos de segurança.
A natureza dinâmica da compilação JIT dificulta a detecção e a prevenção de ataques. Pessoas mal-intencionadas podem injetar código malicioso no processo de compilação e executá-lo no ambiente hospedeiro. Por exemplo, um hacker poderia criar uma constante aparentemente inofensiva em uma linguagem de programação de alto nível:
Em seguida, o compilador JIT transforma essa instrução em uma série de instruções de código nativo x86:
O invasor usa um bug conhecido para mover o ponteiro de execução para o endereço 0001. Isso executa um conjunto de instruções maliciosas, cuidadosamente elaborado e injetado na constante acima.

Para reduzir os riscos de segurança da compilação JIT em aplicações WebAssembly, adote estas práticas recomendadas para gerenciar o processo de compilação:
Use a compilação antecipada (AOT) para compilar o código Wasm em código de máquina antes da execução. Essa abordagem elimina os riscos associados à compilação dinâmica.
Aplique patches de segurança para vulnerabilidades conhecidas em compiladores JIT.
Risco de segurança nº 4: APIs da web e cross-site scripting (XSS)
O WebAssembly pode interagir com APIs da web para acessar recursos e dados de navegadores, servidores e outras plataformas. No entanto, essas interações podem introduzir riscos de segurança, como ataques de cross-site scripting (XSS). Em ataques XSS, hackers injetam código malicioso em páginas ou aplicações web. Depois, os usuários podem executar esse código sem saber, permitindo acessos não autorizados ou o roubo de dados.

Para reduzir os riscos de ataques XSS em aplicações WebAssembly, adote práticas recomendadas de validação de entrada e codificação de saída:
A validação de entrada verifica se os dados fornecidos pelo usuário contêm código ou caracteres potencialmente maliciosos e rejeita qualquer entrada que não atenda a critérios específicos.
A codificação de saída codifica os dados de entrada ou saída do usuário para impedir a execução de código malicioso.
Além disso, use HTTPS para criptografar os dados transmitidos entre o servidor e o cliente, impedindo que invasores interceptem e modifiquem os dados durante a transmissão.
Risco de segurança nº 5: entrega insegura de conteúdo WebAssembly
A entrega segura de conteúdo é fundamental para aplicações WebAssembly, pois garante que os usuários recebam código autêntico e inalterado por um canal confiável. Uma entrega insegura pode introduzir riscos de segurança, incluindo ataques man-in-the-middle (MITM) e adulteração de código.
Em ataques MITM, invasores interceptam e modificam o código enquanto ele é transmitido entre o servidor e o cliente. Essa técnica permite injetar código malicioso na aplicação, que pode ser executado pelo navegador ou pelo runtime Wasm.

Para proteger a entrega de conteúdo em aplicações WebAssembly, siga estas práticas recomendadas:
Use HTTPS para criptografar os dados entre o servidor e o cliente, garantindo a transmissão segura e íntegra do código.
Use verificações de integridade do conteúdo, como checksums ou assinaturas digitais, para confirmar a autenticidade do código.
Implemente mecanismos de controle de acesso para restringir o acesso ao código a usuários autorizados.
Compile com segurança
Os desenvolvedores adotaram o WebAssembly com entusiasmo, pois essa tecnologia permite criar aplicações de alto desempenho em navegadores. No entanto, os benefícios do WebAssembly também vêm acompanhados de riscos de segurança significativos.
Este artigo abordou alguns problemas de segurança do WebAssembly: isolamento inadequado de módulos, falta de proteção no modelo de memória linear, vulnerabilidades em compiladores JIT, ataques de cross-site scripting e entrega insegura de conteúdo WebAssembly.
Felizmente, várias práticas recomendadas ajudam a reduzir as vulnerabilidades introduzidas pelo WebAssembly. Seguir essas medidas de segurança ajuda a proteger os usuários e as aplicações WebAssembly.
Para proteger seus sistemas e usuários, também é fundamental acompanhar as ameaças de segurança mais recentes que afetam o WebAssembly. Ferramentas de desenvolvimento ajudam nessa tarefa. Por exemplo, a plataforma Snyk mantém um amplo catálogo de vulnerabilidades conhecidas e oferece insights práticos para reduzir esses riscos. Ferramentas como Snyk Code e Snyk Open Source ajudam você a detectar e resolver rapidamente problemas de segurança no código. Crie sua conta gratuita hoje mesmo.
Comece a proteger seus aplicativos JavaScript
Encontre e corrija vulnerabilidades em JavaScript gratuitamente com o Snyk.
Não é necessário informar um cartão de crédito.
Ou cadastre-se com o Azure AD Docker ID Bitbucket
Ao usar o Snyk, você concorda em cumprir nossas políticas, incluindo os Termos de Serviço e a Política de Privacidade.



