Mozilla, Fastly, Intel e Red Hat Estamos empenhados em desenvolver tecnologias que ajudarão a transformar o WebAssembly em uma plataforma universal para execução segura de código em todas as infraestruturas, sistemas operacionais e dispositivos. Uma comunidade foi formada para desenvolver em conjunto ambientes de execução e compiladores que permitirão que o WebAssembly seja usado em mais do que apenas navegadores da web. .
Para criar programas portáteis distribuídos em formato WebAssembly que possam ser executados fora do navegador, propõe-se o uso da API. (WebAssembly System Interface), que fornece interfaces de programação para interação direta com o sistema operacional (API POSIX para trabalhar com arquivos, sockets, etc.). Uma característica distintiva do modelo de execução WASI é que os aplicativos são executados em um ambiente isolado (sandbox) do sistema principal e utilizam um mecanismo de segurança baseado em gerenciamento de capacidades — para acessar cada recurso (arquivos, diretórios, sockets, chamadas de sistema, etc.), o aplicativo deve receber as permissões apropriadas (apenas o acesso à funcionalidade declarada é concedido).
Um de O objetivo da aliança é abordar o problema da distribuição de aplicações modulares modernas com inúmeras dependências. Nessas aplicações, cada dependência pode ser uma fonte potencial de vulnerabilidades ou ataques. Obter controle sobre uma dependência permite o controle sobre todas as aplicações a ela vinculadas. Confiar em uma aplicação implica automaticamente confiança em todas as suas dependências, mas essas dependências são frequentemente desenvolvidas e mantidas por equipes terceirizadas cujas atividades são impossíveis de controlar. Os membros da Bytecode Alliance pretendem desenvolver uma solução abrangente para a execução segura de aplicações WebAssembly, que são inerentemente não confiáveis.
Para evitar esse problema, propomos o uso do conceito de nanoprocessos, no qual cada módulo de dependência é separado em um módulo WebAssembly isolado, cujas permissões são definidas apenas para esse módulo (por exemplo, uma biblioteca de processamento de strings não pode abrir um socket de rede ou um arquivo). Ao contrário da separação de processos, os manipuladores WebAssembly são leves e praticamente não exigem recursos adicionais — a interação entre manipuladores não é significativamente mais lenta do que a chamada de funções regulares. A separação pode ser implementada não apenas no nível de módulos individuais, mas também no nível de grupos de módulos que, por exemplo, precisam trabalhar com áreas de memória compartilhada.
As permissões solicitadas podem ser definidas tanto no nível da dependência quanto delegadas a dependências upstream por módulos pai (recursos no WASI são associados a um tipo especial de descritor de arquivo, uma capacidade). Por exemplo, um módulo pode ter a capacidade delegada de acessar um diretório específico e fazer chamadas de sistema. Se a infraestrutura de desenvolvimento do módulo for comprometida ou uma vulnerabilidade for descoberta, o acesso a esses recursos será limitado durante um ataque. Declarações de recursos feitas pelos criadores de módulos podem indicar atividades suspeitas, por exemplo, quando um módulo de processamento de texto solicita permissão para abrir uma conexão de rede. As permissões atribuídas inicialmente são verificadas e, se forem alteradas, a dependência é rejeitada até que a assinatura local do módulo seja atualizada.
Para desenvolvimento conjunto sob a égide da Bytecode Alliance. vários relacionados ao WebAssembly , anteriormente desenvolvidas separadamente pelas empresas fundadoras da aliança:
- — um ambiente de execução para executar aplicações WebAssembly com extensões WASI como aplicações independentes comuns. Suporta tanto a execução de bytecode WebAssembly usando um utilitário de linha de comando dedicado quanto a criação de arquivos executáveis prontos para uso (o wasmtime está incorporado à aplicação como uma biblioteca). O wasmtime possui uma estrutura modular e flexível que permite que o ambiente de execução seja dimensionado para diversas aplicações; por exemplo, uma versão simplificada pode ser criada para dispositivos com recursos limitados.
- — um compilador e ambiente de execução para executar programas no formato WebAssembly. Distintivo Lucet é uma implementação baseada em JIT (Just-in-Time) de compilação antecipada (AOT) completa em código de máquina nativo, adequado para execução direta. O projeto foi desenvolvido pela Fastly e é otimizado para consumo mínimo de recursos e inicialização extremamente rápida de novas instâncias (a Fastly usa o Lucet em seu mecanismo de computação de borda em nuvem, que utiliza WebAssembly para manipuladores por requisição). Como parte do projeto colaborativo, está previsto migrar o compilador Lucet para usar o Wasmtime como base.
- O WebAssembly Micro Runtime (WAMR) é outro ambiente de execução para WebAssembly, originalmente desenvolvido pela Intel para uso em dispositivos IoT. O WAMR é otimizado para consumo mínimo de recursos e pode ser usado em dispositivos com memória RAM limitada. O projeto inclui um interpretador e uma máquina virtual para executar bytecode WebAssembly, uma API (um subconjunto da Libc) e ferramentas para gerenciamento dinâmico de aplicações.
- — um gerador de código que traduz uma representação intermediária independente de hardware em código de máquina executável otimizado para plataformas de hardware específicas. O Cranelift suporta compilação paralela de funções para geração de resultados extremamente rápida, tornando-o adequado para a criação de compiladores just-in-time (JIT) (um JIT baseado em Cranelift é usado na máquina virtual Wasmtime);
- — uma implementação separada da API WASI (WebAssembly System Interface) para organizar a interação com o sistema operacional;
- — um módulo para o gerenciador de pacotes Cargo que implementa um comando para compilar código Rust em bytecode WebAssembly usando a interface WASI para usar WebAssembly fora do navegador;
- и — analisadores sintáticos para análise de texto (WAT, WAST) e representações binárias de bytecode WebAssembly.
Só para lembrar, WebAssembly é muito semelhante ao Asm.js, mas WebAssembly é um formato binário independente de JavaScript, que permite a execução de código intermediário de baixo nível, compilado a partir de diversas linguagens de programação, no navegador. O WebAssembly elimina a necessidade de coleta de lixo, pois utiliza gerenciamento explícito de memória. Ao aproveitar o mecanismo Just-in-Time (JIT), o WebAssembly pode atingir níveis de desempenho próximos ao código nativo. Entre os principais objetivos do WebAssembly estão a portabilidade, o comportamento previsível e a execução consistente de código em diferentes plataformas.
Fonte: opennet.ru
