Mozilla, Fastly, Intel e Red Hat promovem WebAssembly como plataforma de uso universal

Mozilla, Rapidamente, Intel e Red Hat unido seus esforços no desenvolvimento de tecnologias que ajudam a tornar o WebAssembly uma plataforma universal para execução segura de código em qualquer infraestrutura, sistema operacional ou dispositivo. Foi formada uma comunidade para o desenvolvimento conjunto de runtimes e compiladores que permitem o uso do WebAssembly não apenas em navegadores web Aliança de Bytecode.

Para criar programas portáteis entregues no formato WebAssembly que possam ser executados fora do navegador, sugerimos usar a API WASI (WebAssembly System Interface), que fornece interfaces de software para interação direta com o sistema operacional (API POSIX para trabalhar com arquivos, soquetes, etc.). Uma característica distintiva do modelo de execução de aplicações usando WASI é que elas rodam em um ambiente sandbox para isolamento do sistema principal e utilizam um mecanismo de segurança baseado no gerenciamento de capacidade para ações com cada um dos recursos (arquivos, diretórios, soquetes, chamadas de sistema , etc.) o aplicativo deve receber as permissões apropriadas (apenas o acesso à funcionalidade declarada é fornecido).

Um de objetivos A aliança criada é uma solução para o problema de distribuição de aplicações modulares modernas com grande número de dependências. Nessas aplicações, cada dependência pode ser uma fonte potencial de vulnerabilidades ou ataques. Assumir o controle de uma dependência permite obter o controle de todos os aplicativos associados a ela. A confiança no aplicativo implica automaticamente a confiança em todas as dependências, mas as dependências são frequentemente desenvolvidas e mantidas por equipes terceirizadas cujas atividades não podem ser controladas. Os membros da Bytecode Alliance pretendem fornecer uma solução holística para execução segura de aplicativos WebAssembly que não são inerentemente confiáveis.

Para proteção, propõe-se a utilização do conceito de nanoprocessos, em que cada módulo de dependência é separado em um módulo WebAssembly isolado separadamente, cujos poderes são definidos em relação apenas a este módulo (por exemplo, uma biblioteca para processamento de strings não será ser capaz de abrir um soquete ou arquivo de rede). Ao contrário da separação de processos, os manipuladores WebAssembly são leves e quase não requerem recursos adicionais - a interação entre os manipuladores não é muito mais lenta do que chamar funções comuns. A separação pode ser feita não apenas ao nível dos módulos individuais, mas também ao nível dos grupos de módulos que, por exemplo, necessitam de trabalhar com áreas de memória comuns

Os poderes solicitados podem ser determinados no nível das próprias dependências e delegados às dependências ao longo da cadeia pelos módulos pai (os recursos no WASI estão associados a um tipo especial de descritor de arquivo - capacidade). Por exemplo, pode ser delegada a um módulo a capacidade de acessar um diretório específico e chamadas de sistema, e se a infraestrutura de desenvolvimento do módulo for comprometida ou uma vulnerabilidade for identificada, durante um ataque, o acesso será limitado apenas a esses recursos. As declarações de recursos feitas pelos criadores do módulo podem ser um indicador de atividade suspeita, como quando um módulo de processamento de texto solicita permissão para abrir uma conexão de rede. As permissões definidas inicialmente são verificadas e se forem alteradas, o carregamento da dependência é rejeitado até que a assinatura do módulo local seja atualizada.

Para desenvolvimento conjunto sob a proteção da Bytecode Alliance traduzido vários relacionados ao WebAssembly projetos, anteriormente desenvolvido separadamente pelas empresas fundadoras da aliança:

  • Era tempo — tempo de execução para executar aplicativos WebAssembly com extensões WASI como aplicativos independentes regulares. Ele suporta o lançamento de bytecode WebAssembly usando um utilitário de linha de comando especial e a vinculação de arquivos executáveis ​​​​prontos (o wasmtime é integrado ao aplicativo como uma biblioteca). Wasmtime possui uma estrutura modular flexível que permite dimensionar o tempo de execução para vários aplicativos, por exemplo, você pode criar uma versão simplificada para dispositivos com recursos limitados;
  • Luce — compilador e tempo de execução para execução de programas no formato WebAssembly. Distintivo característica Lucet é o uso de compilação antecipada completa (AOT, antecipadamente) em vez de JIT em código de máquina adequado para execução direta. O projeto foi desenvolvido pela Fastly e é otimizado para consumir recursos mínimos e lançar novas instâncias muito rapidamente (Fastly usa Lucet em um mecanismo de computação de borda em nuvem que usa WebAssembly para manipuladores lançados em cada solicitação). Como parte do projeto conjunto, o compilador Lucet está planejado para ser convertido para usar o Wasmtime como base;
  • Extensão WAM (WebAssembly Micro Runtime) é outro tempo de execução para execução do WebAssembly, originalmente desenvolvido pela Intel para uso em dispositivos da Internet das Coisas. WAMR é otimizado para consumo mínimo de recursos e pode ser usado em dispositivos com pequena quantidade de RAM. O projeto inclui um interpretador e uma máquina virtual para execução de bytecode WebAssembly, uma API (um subconjunto da Libc) e ferramentas para gerenciamento dinâmico de aplicações;
  • elevador de guindaste — um gerador de código que traduz uma representação intermediária independente de arquiteturas de hardware em código de máquina executável otimizado para plataformas de hardware específicas. Cranelift suporta paralelização de compilação de funções para geração de resultados muito rápida, o que permite que ele seja usado para criar compiladores JIT (JIT baseado em Cranelift é usado na máquina virtual Wasmtime);
  • WASI comum — uma implementação separada da API WASI (WebAssembly System Interface) para organizar a interação com o sistema operacional;
  • carga-wasi — um módulo para o gerenciador de pacotes Cargo que implementa um comando para compilar o código Rust no bytecode WebAssembly usando a interface WASI para usar o WebAssembly fora do navegador;
  • wat и analisador — analisadores para análise de texto (WAT, WAST) e representações binárias de bytecode WebAssembly.

Para recapitular, WebAssembly é muito parecido com Asm.js, mas diferente por ser um formato binário que não está vinculado ao JavaScript e permite que código intermediário de baixo nível compilado de várias linguagens de programação seja executado no navegador. O WebAssembly não requer um coletor de lixo porque usa gerenciamento de memória explícito. Ao usar JIT para WebAssembly, você pode atingir níveis de desempenho próximos ao código nativo. Entre os principais objetivos do WebAssembly está garantir portabilidade, comportamento previsível e execução idêntica de código em diferentes plataformas.

Fonte: opennet.ru

Adicionar um comentário