Vea cómo funcionan los modelos de seguridad y portabilidad de WebAssembly (WASM) en esta guía para principiantes.
Ambos son temas avanzados de WebAssembly (WASM). Le recomendamos que lea los dos temas anteriores de nuestra serie WebAssembly para principiantes.
- WebAssembly para principiantes - Parte 1: Introducción a WASM
- WebAssembly para principiantes - Parte 2: objetivos, conceptos clave y casos de uso
Empecemos.
WebAssembly Portability
La portabilidad de WebAssembly lo prepara para la Web. De hecho, puede definir WASM como una plataforma de espacio aislado portátil.
Además, su formato binario le permite ejecutarse en varias arquitecturas de conjuntos de instrucciones y sistemas operativos. Esto significa que puede usar WASM no solo en la Web sino también fuera de la Web.
Para comprender la portabilidad de WASM, analizaremos lo siguiente:
- Entorno local, limitado y no determinista.
- Características específicas del entorno de ejecución
- Portabilidad web y no web de WASM
Local, limitado y no determinista
WASM necesita una ejecución eficiente y entornos adecuados que sean locales, limitados y no deterministas. El no determinismo es computación que especifica que un algoritmo/compilador/entorno genera diferentes comportamientos o resultados incluso para la misma entrada. Es lo opuesto a un algoritmo determinista.
Los otros dos aspectos, limitado y local, están asociados con la ejecución no determinista. Para que la ejecución no determinista funcione, necesita casos de uso bien definidos que sean “limitado."
Además, estas ejecuciones son “locales” sin ningún efecto fuera del medio ambiente. Leer su oficial no determinismo en WebAssembly doc para obtener más información al respecto.
Características específicas del entorno de ejecución
Para que WebAssembly sea portátil, se supone que el entorno de ejecución ofrece las siguientes características:
- Capacidad de direccionamiento de granularidad de memoria de bytes y bytes de 8 bits.
- Enteros con signo en complemento a dos de 32 bits. Opcionalmente 64 bits.
- La emulación de software es posible a través de accesos a memoria no alineados o captura confiable.
- Compatibilidad con puntos flotantes de 32 y 64 bits según se define en IEEE 754-2008.
- Garantía para ejecutar todos los subprocesos con progreso hacia adelante.
- Para el acceso de 64 bits, wasm64 debe proporcionar operadores de memoria atómica sin bloqueo.
- Los operadores de memoria atómica sin bloqueo incluyen accesos de 8, 16 y 32 bits.
- wasm64 admite memoria lineal superior a 4 GiB con índices o punteros de 64 bits.
- Ordenación de bytes Little Endian.
Todos los principales navegadores, incluidos Chrome, Edge, Firefox y WebKit, cumplen con todos estos requisitos ambientales.
Además, WebAssembly está evolucionando a un ritmo rápido. El Grupo de la comunidad WASM y el Grupo de trabajo WebAssembly del W3C están trabajando para lograr su estandarización. Eso significa que cualquiera de estos requisitos puede cambiar en el futuro.
Portabilidad web y no web de WASM
El objetivo principal de WebAssembly es proporcionar portabilidad y rendimiento nativo en la Web y fuera de la Web. En esta sección, veremos cómo WASM lo logra.
#1. Incrustación web
WASM se integra bien con el ecosistema web, incluido el modelo de seguridad web, la portabilidad web y las API web. Además, debe tener suficiente espacio para el desarrollo creativo en el futuro (léase WebAssembly para principiantes - Parte 2 para entender sus objetivos)
Entonces, ¿cómo logra WASM la compatibilidad con la Web? Utiliza API de JavaScript, lo que permite a los desarrolladores usar JavaScript para la compilación de módulos de WebAssembly fácilmente. También se encarga de almacenar y recuperar módulos del compilador, administrar importaciones desde módulos del compilador, administrar la memoria, etc.
Para obtener más información sobre cómo WASM logra la compatibilidad web de alto nivel, lea esto: Incrustación web – WebAssembly.
#2. Incrustación no web
Como se mencionó anteriormente, WASM también funciona con entornos no web. Como desarrollador o empresa, puede crear aplicaciones de alto rendimiento o escribir secciones de su aplicación que necesiten ajustes de rendimiento. Por ejemplo, puedes usarlo en Dispositivos de IoT, servidores de centros de datos y aplicaciones de escritorio/móviles.
Como las aplicaciones que no son web no pueden usar API web, dependen de Enlace dinámico de WASM. También debe usar la prueba de funciones, un proceso de desarrollo de software que prueba las múltiples variaciones de las funciones para ver qué es lo mejor para la experiencia del usuario. Además, los desarrolladores pueden usar máquinas virtuales de JavaScript para simplificar la incrustación no web o desarrollar sus aplicaciones sin ella.
Para obtener más información, lea Incrustaciones no web: WebAssembly.
WebAssembly Security
WebAssembly es una solución de formato binario que ofrece un rendimiento nativo. Funciona muy bien en la Web, pero también se puede ajustar para que funcione en incrustaciones que no sean web. Esto hace que WASM esté ampliamente disponible en todos los servicios, soluciones y procesos. Sin embargo, esto significa más desafíos de seguridad.
Desafíos y riesgos de seguridad de WASM
Aunque WebAssembly se considera seguro y eficiente, conlleva múltiples riesgos de seguridad, que incluyen:
- Zona de pruebas de WebAssembly
- Gestión de la memoria
- Ofuscación de código
- Comprobaciones de integridad
#1. Zona de pruebas de WebAssembly
WASM se ejecuta dentro del navegador web, al igual que JavaScript. Utiliza la misma máquina virtual (VM) que JavaScript. El sandbox proporciona de manera efectiva un entorno de ejecución seguro y obstaculiza lo que se ejecuta debajo del capó.
Entonces, si el código JavaScript/WebAssembly contiene código malicioso, es difícil de detectar ya que es una caja negra. Además, el código WASM está en formato binario listo para ejecutar; corre más rápido, por lo que es difícil para soluciones antivirus para buscar cualquier código malicioso. Por ejemplo, el código puede contener anuncios no deseados o la capacidad de redirigir a los usuarios a sitios no deseados. el malware sitios.

Además, la dependencia excesiva de WebAssembly en JavaScript para ejecutarse en la Web también significa que hereda vulnerabilidades de JavaScript. Por eso, como desarrollador, debe seguir las precauciones y medidas de seguridad de JavaScript al codificar WASM.
#2. Gestión de la memoria
La gestión de memoria en WASM es complicada. En primer lugar, no accede directamente a la memoria física ya que se ejecuta dentro de la VM. Es por eso que usa la memoria de la máquina host.
En segundo lugar, la limpieza de la memoria en WASM requiere un proceso explícito, mientras que, en comparación, JavaScript se limpia solo.
Además, cuando una función WASM devuelve la salida a JavaScript, devuelve un puntero a la posición dentro del espacio de memoria WASM asignado. Por lo tanto, si la memoria declarada se llena, el programa WASM puede bloquearse y arruinar la experiencia del usuario. Para evitarlo, los programadores deben usar desinfectantes para depurar su código o usar cadenas de herramientas como emscripten.

#3. Ofuscación de código
La ejecución de sandbox de WASM hace que su código sea ofuscado. Además, el formato binario WASM tampoco es legible por humanos, lo que dificulta ingeniería inversa, que es necesario para identificar el código malicioso.
Estos hacen que el código WebAssembly sea difícil de depurar debido a su falta de formato legible por humanos. Esto abre muchas lagunas de seguridad, incluyendo los piratas informáticos' capacidad para ocultar código que roba información confidencial o inyecta código para hacerse cargo de la máquina host.
#4. Controles de Integridad
Cualquier dato transferido a través de la Web es vulnerable a la manipulación de datos. Por ejemplo, los piratas informáticos pueden realizar un ataque de intermediario para cambiar los valores de los datos. Es un problema para WASM, ya que no tiene una forma adecuada de realizar comprobaciones de integridad.
Sin embargo, puede funcionar con JavaScript para realizar comprobaciones de integridad. Otra forma de identificar posibles vulnerabilidades del código WASM es utilizar herramientas de integración como Jit. Garantiza que el código esté libre de malos actores y no pueda afectar las aplicaciones o la infraestructura de la nube circundante.

Descripción del modelo de seguridad WASM
WebAssembly se toma la seguridad muy en serio. Es por eso que, en los documentos oficiales de WASM, mencionaron que su modelo de seguridad se ocupa de dos objetivos importantes:
- Asegúrese de que ningún módulo con errores o malicioso afecte a los usuarios
- Asegúrese de que los desarrolladores puedan mitigar cualquier riesgo de seguridad y crear aplicaciones seguras mientras se asegura que el punto 1 siempre se mantenga.
El modelo de seguridad WASM sabe que las aplicaciones de WebAssembly se ejecutan de forma independiente y no pueden escapar de su entorno de espacio aislado. Sin embargo, las API pueden abrir una forma de atacar el entorno del host.
Otra técnica tolerante a fallas incluye la ejecución de aplicaciones de forma determinista con expectativas limitadas. Al garantizar ambas condiciones, la mayoría de las ejecuciones de aplicaciones se consideran seguras.
Para mejorar la seguridad, los desarrolladores deben aplicar la política del mismo origen para el flujo de información. Si está desarrollando para no web, debe usar el modelo de seguridad POSIX. Si quieres leer más sobre su modelo de seguridad, echa un vistazo a: Seguridad – WebAssembly.
La interfaz del sistema WebAssembly (WASI)
WASI (la interfaz del sistema WebAssembly) también juega un papel crucial en la incorporación no web de WASM, ya que mejora la seguridad. Es una interfaz de sistema modular que ofrece interesantes características de seguridad y portabilidad.
De hecho, ahora es parte del Estatuto del subgrupo de la interfaz del sistema WebAssembly y por lo tanto estandarizado. Gracias a WASI, WASM se adopta ampliamente en diferentes áreas informáticas de servidor/perímetro. Además, WASI simplifica la seguridad cuando se pasa a una integración no web desde un entorno de integración web.
Palabras finales
La portabilidad y la seguridad de WebAssembly son dos grandes temas. En la parte 3 del WebAssembly para principiantes, tratamos de simplificarlo y dividirlo, especialmente para principiantes.
A continuación, puede consultar Hojas de trucos de JavaScript para desarrolladores y estudiantes.