¿Qué tan seguro es WebAssembly? 5 riesgos de seguridad propios de WebAssembly
Marcelo Oliveira
28 de julio de 2023
0 minutos de lecturaWebAssembly, a veces llamado Wasm, es un formato portátil de instrucciones de código binario de bajo nivel que se ejecuta en la máquina virtual (VM) de un navegador web. Permite a los desarrolladores escribir código de alto rendimiento en varios lenguajes y se ejecuta junto con JavaScript.
Los desarrolladores están adoptando WebAssembly por su capacidad para acelerar algoritmos complejos, habilitar aplicaciones de juegos y multimedia, y ofrecer un entorno aislado seguro para ejecutar código que no es de confianza. Sin embargo, antes de adoptar WebAssembly, es fundamental considerar sus implicaciones de seguridad y cómo mitigar los riesgos.
Principales riesgos de seguridad de WebAssembly
Los desarrolladores pueden compilar muchos lenguajes de programación modernos en WebAssembly. Pero, a pesar de sus ventajas, WebAssembly puede eludir las medidas de seguridad tradicionales y llegar a ejecutar código malicioso en el navegador.
Analicemos más de cerca los problemas de seguridad propios de WebAssembly creando una aplicación de ejemplo con Blazor, el framework web de código abierto. Blazor nos permite escribir código C# en lugar de JavaScript para nuestras páginas web. El código C# se compila en bibliotecas de vínculos dinámicos (DLL) y archivos WebAssembly (.wasm) que se ejecutan en el navegador del cliente.
Requisitos previos
Antes de comenzar este tutorial, asegúrate de tener lo siguiente:
Descarga e instala Visual Studio o VS Code. Este es el entorno de desarrollo integrado (IDE) que usarás para escribir y ejecutar el código de WebAssembly. Si eliges VS Code, descarga e instala después el .NET SDK y la extensión de C#.
Instala la extensión de Visual Studio o la extensión de Snyk para VS Code. Este complemento analizará nuestro código de WebAssembly y ofrecerá un análisis de seguridad.
Descarga el proyecto de ejemplo.
Ejecuta el proyecto de ejemplo
Si elegiste Visual Studio como IDE, abre Visual Studio Installer y marca la opción .NET WebAssembly Build Tools:

Abre el menú Tools > Options > Snyk y luego General Settings. Después, haz clic en el botón Connect Visual Studio to Snyk.io.

Si elegiste VS Code como IDE, haz clic en el ícono de Snyk en la barra de herramientas izquierda. Luego, haz clic en Trust workspace and connect.

Ejecuta el programa en Visual Studio o VS Code para iniciar la aplicación de ejemplo. Se verá como la captura de pantalla de abajo, con el título «Human Resources», una imagen y texto.

Riesgo de seguridad n.º 1: aislamiento de módulos de WebAssembly
Para mantener la seguridad de las aplicaciones web que usan esta tecnología, debes mantener aislados los módulos de WebAssembly. Aislar los módulos entre sí y del entorno host significa que cada uno opera de forma independiente, sin interferir en el comportamiento de otros módulos ni de la aplicación host. El aislamiento de módulos es fundamental al ejecutar código que no es de confianza: impide que el código malicioso acceda a datos o recursos confidenciales.
Dos prácticas recomendadas para implementar el aislamiento de módulos son el uso de entornos aislados y la compartimentación.
El uso de entornos aislados consiste en colocar cada módulo en un entorno separado y aislado que limita el acceso al sistema host y a otros módulos. La imagen de abajo muestra un proyecto con dos módulos de WebAssembly (Finanzas y Recursos Humanos). Al compilar e implementar el proyecto en el navegador web, los módulos de WebAssembly se ejecutan en un entorno aislado, separado del entorno de ejecución host.

La compartimentación consiste en dividir la aplicación host y sus módulos en compartimentos separados, cada uno con sus propios recursos y privilegios de acceso.
Tanto el uso de entornos aislados como la compartimentación crean un entorno seguro que permite ejecutar código que no es de confianza sin poner en riesgo la seguridad del sistema host ni de otros módulos.
A continuación, usa la extensión de Snyk para Visual Studio Code para verificar si el código de WebAssembly es vulnerable. Abre el menú Extensions > Snyk y haz clic en Scan.

Snyk analiza el archivo e identifica problemas conocidos de calidad del código en WebAssembly y vulnerabilidades relacionadas con el código abierto y la seguridad del código. Si encuentra problemas o vulnerabilidades, Snyk ofrece detalles y recomendaciones para corregirlos.

Riesgo de seguridad n.º 2: modelo de memoria lineal de WebAssembly
El modelo de memoria lineal es una técnica de direccionamiento de memoria que usa un único espacio de direcciones contiguo para organizarla. Este enfoque permite que la unidad de procesamiento acceda a las ubicaciones de memoria de forma directa y secuencial. La imagen de abajo muestra un objeto —compartido entre JavaScript y el código de WebAssembly— que ocupa espacio en la memoria lineal.

La función de modelo de memoria lineal de WebAssembly permite que los módulos asignen y accedan a un bloque contiguo de memoria, de forma similar a un arreglo tradicional. Si bien este modelo ofrece una manera rápida y eficiente de administrar la memoria en las aplicaciones de WebAssembly, también presenta riesgos de seguridad.
Por ejemplo, si un módulo accede a memoria fuera del rango que tiene asignado, podría dañar la memoria de otros módulos o del sistema host. Esto podría provocar una falla o una brecha de seguridad.
Para mitigar los riesgos de seguridad relacionados con el modelo de memoria lineal en las aplicaciones de WebAssembly, sigue estas prácticas recomendadas:
Usa la verificación de límites para garantizar que los módulos solo accedan a la memoria dentro del rango que tienen asignado.
Evita las funciones inseguras para prevenir vulnerabilidades de corrupción de memoria.
Implementa mecanismos de protección de memoria, como la aleatorización del diseño del espacio de direcciones (ASLR) y la prevención de ejecución de datos (DEP).
Riesgo de seguridad n.º 3: compilación JIT de WebAssembly
La compilación justo a tiempo (JIT) de WebAssembly compila el código Wasm en código máquina durante la ejecución, en lugar de hacerlo con anticipación. Aunque este proceso ofrece importantes beneficios de rendimiento, también presenta posibles riesgos de seguridad.
La naturaleza dinámica de la compilación JIT dificulta la detección y prevención de ataques. Los actores maliciosos pueden inyectar código malicioso en el proceso de compilación y ejecutarlo en el entorno host. Por ejemplo, un hacker podría crear una constante aparentemente inofensiva escrita en un lenguaje de programación de alto nivel:
Luego, el compilador JIT transforma esa instrucción en una serie de instrucciones de código nativo x86:
El atacante aprovecha un error conocido para mover el puntero de ejecución a la dirección 0001. Esto ejecuta un conjunto de instrucciones maliciosas, cuidadosamente elaborado e inyectado en la constante anterior.

Para mitigar los riesgos de seguridad de la compilación JIT en las aplicaciones de WebAssembly, implementa las siguientes prácticas recomendadas para administrar el proceso de compilación:
Usar la compilación anticipada (AOT) para compilar el código Wasm en código máquina antes de la ejecución. Este enfoque elimina los riesgos asociados con la compilación dinámica.
Aplicar parches de seguridad para las vulnerabilidades conocidas en los compiladores JIT.
Riesgo de seguridad n.º 4: API web y scripting entre sitios (XSS)
WebAssembly puede interactuar con las API web para acceder a recursos y datos de navegadores web, servidores y otras plataformas. Sin embargo, estas interacciones pueden presentar riesgos de seguridad, como los ataques de scripting entre sitios (XSS). En estos ataques, los hackers inyectan código malicioso en páginas o aplicaciones web. Después, los usuarios pueden ejecutarlo sin saberlo, lo que provoca accesos no autorizados o el robo de datos.

Para mitigar los riesgos de los ataques XSS en las aplicaciones de WebAssembly, implementa prácticas recomendadas para validar las entradas y codificar las salidas:
La validación de entradas revisa los datos ingresados por el usuario en busca de código o caracteres potencialmente maliciosos y rechaza cualquier entrada que no cumpla con criterios específicos.
La codificación de salidas consiste en codificar las entradas o salidas del usuario para evitar que se ejecute código malicioso.
Además, usa HTTPS para cifrar los datos que se transmiten entre el servidor y el cliente, y así evitar que los atacantes los intercepten y modifiquen durante la transmisión.
Riesgo de seguridad n.º 5: entrega de contenido insegura en WebAssembly
La entrega segura de contenido es fundamental para las aplicaciones de WebAssembly, ya que garantiza que los usuarios reciban código auténtico e inalterado a través de un canal confiable. La entrega de contenido insegura puede presentar riesgos de seguridad, como ataques de intermediario (MITM) y manipulación de código.
En los ataques MITM, los atacantes interceptan y modifican el código mientras se transmite entre el servidor y el cliente. Esta técnica permite inyectar código malicioso en la aplicación, que puede ejecutarse en el navegador o en el entorno de ejecución de Wasm.

Para proteger la entrega de contenido en las aplicaciones de WebAssembly, sigue estas prácticas recomendadas:
Usa HTTPS para cifrar los datos entre el servidor y el cliente, y garantizar que el código se transmita de forma segura y sin alteraciones.
Usa verificaciones de integridad del contenido, como sumas de verificación o firmas digitales, para confirmar la autenticidad del código.
Implementa mecanismos de control de acceso para limitar el acceso al código a usuarios autorizados.
Compila con seguridad
Los desarrolladores han adoptado con entusiasmo WebAssembly, una tecnología que les permite crear aplicaciones de alto rendimiento en navegadores web. Sin embargo, los beneficios de WebAssembly vienen acompañados de importantes riesgos de seguridad.
En este artículo analizamos algunos problemas de seguridad de WebAssembly: aislamiento inadecuado de módulos, falta de protección en el modelo de memoria lineal, vulnerabilidades del compilador JIT, ataques de scripting entre sitios y entrega de contenido insegura en WebAssembly.
Por suerte, varias prácticas recomendadas permiten mitigar las vulnerabilidades que introduce WebAssembly. Seguir estas medidas de seguridad ayuda a proteger a los usuarios y sus aplicaciones de WebAssembly.
Para proteger tus sistemas y usuarios, también es fundamental mantenerte al día sobre las amenazas de seguridad más recientes que afectan a WebAssembly. Las herramientas de desarrollo pueden ayudarte. Por ejemplo, la plataforma de Snyk mantiene un amplio catálogo de vulnerabilidades conocidas y ofrece información práctica para mitigar estos riesgos. Herramientas como Snyk Code y Snyk Open Source te permiten detectar y resolver rápidamente problemas de seguridad en el código. Crea tu cuenta gratuita hoy mismo.
Empieza a proteger tus aplicaciones JavaScript
Encuentra y corrige vulnerabilidades de JavaScript gratis con Snyk.
No necesitas tarjeta de crédito.
O regístrate con Azure AD Docker ID Bitbucket
Al usar Snyk, aceptas cumplir nuestras políticas, incluidos nuestros Términos del servicio y nuestra Política de privacidad.



