Skip to main content

¿Qué tan seguro es WebAssembly? 5 riesgos de seguridad propios de WebAssembly

Escrito por

Marcelo Oliveira

feature Cloud Compliance

28 de julio de 2023

0 minutos de lectura

WebAssembly, 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:

Ejecuta el proyecto de ejemplo

Si elegiste Visual Studio como IDE, abre Visual Studio Installer y marca la opción .NET WebAssembly Build Tools:

Lista de componentes del instalador de software con Herramientas de compilación de .NET WebAssembly seleccionadas

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

Ventana de opciones de Visual Studio que muestra la configuración general de Snyk, incluidos el token, el punto de conexión personalizado, la organización y los controles de conexión

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.

Visual Studio Code muestra un panel de bienvenida de Snyk que solicita a los usuarios confiar en el espacio de trabajo y conectarse para realizar un primer análisis de seguridad.

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.

Ilustración de tres empleados diversos sobre una página web de Recursos Humanos con enlaces de navegación a Inicio, Obtener datos, Recursos Humanos y Marketing

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.

Explorador de soluciones de Visual Studio que muestra la solución SnykWebAssembly con los proyectos Core, ModuleHumanResources y ModuleMarketing.

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.

Captura de pantalla del menú Extensiones de un editor de código con opciones de Snyk para analizar, detener, limpiar y configurar

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.

Panel de Snyk que muestra cero vulnerabilidades de código abierto, vulnerabilidades de seguridad en el código y problemas de calidad del código

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.

Diagrama que muestra cómo JavaScript y WASM intercambian objetos mediante regiones resaltadas de memoria lineal compartida.

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:

var a = (0x11223344^0x44332211^0x44332211^ ...);

Luego, el compilador JIT transforma esa instrucción en una serie de instrucciones de código nativo x86:

0000:  b8 44 33 22 11      mov $0x11223344,%eax    mov eax,0x11223344
0005:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211
000a:  35 11 22 33 44      xor $0x44332211,%eax    xor eax,0x44332211

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.

Diagrama que muestra a un atacante inyectando una constante en WebAssembly y aprovechando la compilación JIT para mover el puntero de ejecución y ejecutar código malicioso.

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.

Diagrama que muestra un ataque XSS: un atacante inyecta un script en una aplicación web, que se ejecuta para los usuarios y envía sus datos confidenciales al atacante.

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.

Diagrama que muestra a un atacante de intermediario que intercepta las conexiones entre los usuarios y una aplicación web.

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.

Leer más

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

Blog

Por qué los agentes de programación con IA siguen generando fallas de control de acceso

Los agentes de programación con IA pueden generar lógica de autorización que compila y supera la revisión, pero expone los datos de un inquilino a otro. Descubre por qué es difícil detectar el control de acceso roto y cómo prevenirlo.