Skip to main content

Qual é o nível de segurança do WebAssembly? 5 riscos de segurança exclusivos do WebAssembly

Escrito por

Marcelo Oliveira

feature Cloud Compliance

28 de julho de 2023

0 minutos de leitura

WebAssembly, à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:

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:

Lista de componentes do instalador de software, com .NET WebAssembly Build Tools selecionado

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

Janela de opções do Visual Studio exibindo as configurações gerais do Snyk, incluindo token, endpoint personalizado, organização e controles de conexão

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.

O Visual Studio Code exibe um painel de boas-vindas do Snyk que solicita aos usuários que confiem no workspace e se conectem para fazer uma primeira análise de segurança.

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.

Ilustração de três funcionários diversos acima de uma página de Recursos Humanos com links de navegação para Início, Buscar dados, Recursos Humanos e Marketing

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.

Gerenciador de Soluções do Visual Studio exibindo a solução SnykWebAssembly com os projetos Core, ModuleHumanResources e ModuleMarketing.

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.

Captura de tela do menu Extensões de um editor de código, com opções do Snyk para analisar, interromper, limpar e acessar as configurações

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.

Painel do Snyk mostrando zero vulnerabilidades de código aberto, vulnerabilidades de segurança no código e problemas de qualidade do código

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.

Diagrama que mostra JavaScript e WASM trocando objetos por meio de regiões destacadas compartilhadas da 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:

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

Em seguida, o compilador JIT transforma essa instrução em uma série de instruções de código nativo 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

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.

Diagrama que mostra um invasor injetando uma constante no WebAssembly e explorando a compilação JIT para mover o ponteiro de execução e executar código malicioso.

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.

Diagrama que mostra um ataque XSS: um invasor injeta um script em uma aplicação web, que é executado para os usuários e envia seus dados confidenciais ao invasor.

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.

Diagrama que mostra um invasor intermediário interceptando conexões entre usuários e um aplicativo web.

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.

Leia mais

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.

feature insights context
Blog

Os ataques autônomos já chegaram. A defesa precisa acompanhar o ritmo.

Os atacantes autônomos estão reduzindo o tempo disponível para a defesa. Saiba como a descoberta, a correção, a validação e a prevenção contínuas ajudam as equipes de segurança a acompanhar esse ritmo.

Blog

Por que agentes de programação com IA continuam criando falhas de controle de acesso

Agentes de programação com IA podem gerar uma lógica de autorização que compila e passa pela revisão, mas permite que um tenant acesse os dados de outro. Saiba por que é difícil detectar falhas de controle de acesso e como evitá-las.