Mozilla, Fastly, Intel y Red Hat Nos comprometemos a desarrollar tecnologías que ayuden a transformar WebAssembly en una plataforma universal para la ejecución segura de código en todas las infraestructuras, sistemas operativos y dispositivos. Se ha formado una comunidad para desarrollar conjuntamente entornos de ejecución y compiladores que permitan usar WebAssembly en más que solo navegadores web. .
Para crear programas portátiles entregados en formato WebAssembly que puedan ejecutarse fuera del navegador, se propone utilizar la API (Interfaz del Sistema WebAssembly), que proporciona interfaces de programación para la interacción directa con el sistema operativo (API POSIX para trabajar con archivos, sockets, etc.). Una característica distintiva del modelo de ejecución WASI es que las aplicaciones se ejecutan en un entorno aislado del sistema principal y utilizan un mecanismo de seguridad basado en la gestión de capacidades: para acceder a cada recurso (archivos, directorios, sockets, llamadas al sistema, etc.), la aplicación debe tener los permisos adecuados (solo se concede acceso a la funcionalidad declarada).
Uno de El objetivo de la alianza es abordar el problema de la distribución de aplicaciones modulares modernas con numerosas dependencias. En estas aplicaciones, cada dependencia puede ser una fuente potencial de vulnerabilidades o ataques. Controlar una dependencia permite controlar todas las aplicaciones vinculadas a ella. Confiar en una aplicación implica automáticamente confiar en todas sus dependencias, pero estas dependencias suelen ser desarrolladas y mantenidas por equipos externos cuyas actividades son imposibles de controlar. Los miembros de Bytecode Alliance buscan desarrollar una solución integral para la ejecución segura de aplicaciones WebAssembly, que por naturaleza no son de confianza.
Para evitar esto, proponemos usar el concepto de nanoprocesos, en el que cada módulo de dependencia se separa en un módulo WebAssembly independiente y aislado, cuyos permisos se definen únicamente para ese módulo (por ejemplo, una biblioteca de procesamiento de cadenas no puede abrir un socket de red ni un archivo). A diferencia de la separación de procesos, los controladores de WebAssembly son ligeros y prácticamente no requieren recursos adicionales; la interacción entre controladores no es significativamente más lenta que la llamada a funciones regulares. La separación puede implementarse no solo a nivel de módulos individuales, sino también a nivel de grupos de módulos que, por ejemplo, necesitan trabajar con áreas de memoria compartida.
Los permisos solicitados pueden definirse tanto a nivel de dependencia como delegarse a dependencias anteriores por los módulos principales (en WASI, los recursos se asocian a un tipo especial de descriptor de archivo, una capacidad). Por ejemplo, a un módulo se le puede delegar la capacidad de acceder a un directorio específico y realizar llamadas al sistema. Si la infraestructura de desarrollo del módulo se ve comprometida o se descubre una vulnerabilidad, el acceso a estos recursos se limitará durante un ataque. Las declaraciones de recursos por parte de los creadores de módulos pueden ser un indicador de actividad sospechosa; por ejemplo, cuando un módulo de procesamiento de texto solicita permiso para abrir una conexión de red. Se comprueban los permisos asignados inicialmente y, si cambian, se rechaza la dependencia hasta que se actualice la firma local del módulo.
Para el desarrollo conjunto bajo el ala de Bytecode Alliance Varios relacionados con WebAssembly , previamente desarrollado por separado por las empresas fundadoras de la alianza:
- — un entorno de ejecución para ejecutar aplicaciones WebAssembly con extensiones WASI como aplicaciones independientes. Se admite tanto la ejecución de código de bytes de WebAssembly mediante una utilidad de línea de comandos dedicada como la creación de archivos ejecutables predefinidos (wasmtime se integra en la aplicación como una biblioteca). Wasmtime tiene una estructura flexible y modular que permite escalar el entorno de ejecución para diversas aplicaciones; por ejemplo, se puede crear una versión simplificada para dispositivos con recursos limitados.
- — un compilador y entorno de ejecución para ejecutar programas en formato WebAssembly. Distintivo Lucet es una implementación basada en JIT de compilación anticipada (AOT) completa en código máquina nativo, apta para ejecución directa. El proyecto fue desarrollado por Fastly y está optimizado para minimizar el consumo de recursos y acelerar el inicio de nuevas instancias (Fastly utiliza Lucet en su motor de computación en el borde de la nube, que utiliza WebAssembly para los controladores por solicitud). Como parte del proyecto colaborativo, se planea migrar el compilador de Lucet para usar Wasmtime como base.
- (WebAssembly Micro Runtime) es otro entorno de ejecución para WebAssembly, desarrollado originalmente por Intel para su uso en dispositivos IoT. WAMR está optimizado para minimizar el consumo de recursos y puede utilizarse en dispositivos con RAM limitada. El proyecto incluye un intérprete y una máquina virtual para ejecutar el bytecode de WebAssembly, una API (un subconjunto de Libc) y herramientas para la gestión dinámica de aplicaciones.
- — un generador de código que traduce una representación intermedia independiente del hardware a código máquina ejecutable, optimizado para plataformas de hardware específicas. Cranelift admite la compilación de funciones paralelas para una generación de resultados extremadamente rápida, lo que lo hace ideal para crear compiladores justo a tiempo (JIT) (la máquina virtual Wasmtime utiliza un JIT basado en Cranelift).
- — una implementación separada de la API WASI (WebAssembly System Interface) para organizar la interacción con el sistema operativo;
- — un módulo para el administrador de paquetes Cargo que implementa un comando para compilar código Rust en código de bytes WebAssembly usando la interfaz WASI para usar WebAssembly fuera del navegador;
- и — analizadores para analizar texto (WAT, WAST) y representaciones binarias del código de bytes de WebAssembly.
Como recordatorio, WebAssembly es muy similar a Asm.js, pero WebAssembly es un formato binario independiente de JavaScript que permite ejecutar en el navegador código intermedio de bajo nivel compilado desde varios lenguajes de programación. WebAssembly elimina la necesidad de recolección de elementos no utilizados, ya que utiliza una gestión explícita de memoria. Al aprovechar el motor Just-in-Time (JIT), WebAssembly puede alcanzar niveles de rendimiento cercanos al código nativo. Entre los principales objetivos de WebAssembly se encuentran la portabilidad, el comportamiento predecible y la ejecución consistente del código en diferentes plataformas.
Fuente: opennet.ru
