Wasmtime de Bytecodealliance. Vulnerabilidades y errores

Errores CVE de Wasmtime de Bytecodealliance

Vulnerabilidades CVE de Wasmtime de Bytecodealliance

9 de Marzo del 2023

Wasmtime es un tiempo de ejecución rápido y seguro para WebAssembly

  • CVE-2023-26489 : En las versiones afectadas, el generador de código de wasmtime, Cranelift, tiene un error en los objetivos x86_64 donde el cálculo del modo de dirección calcularía por error una dirección efectiva de 35 bits en lugar de la dirección efectiva de 33 bits definida por WebAssembly. Este error significa que, con la configuración de generación de código predeterminada, una operación de carga/almacenamiento controlada por wasm podría leer/escribir direcciones de hasta 35 bits de distancia de la base de la memoria lineal.
  • Sin embargo, debido a este error, las direcciones de hasta `0xffffffff * 8 + 0x7ffffffc = 36507222004 = ~34G` bytes fuera de la base de la memoria lineal son posibles desde el código invitado. Esto significa que un módulo malicioso puede leer/escribir la memoria virtual a 6G de distancia de la base de la memoria lineal hasta ~34G de distancia. Un módulo invitado puede, sin el conocimiento del integrador, leer/escribir memoria en esta región. La memoria puede pertenecer a otras instancias de WebAssembly cuando se utiliza el asignador de agrupación, por ejemplo.
  • Se recomienda a los integradores afectados que analicen los módulos wasm preexistentes para ver si están afectados por las reglas de generación de código incorrectas y posiblemente correlacionarlo con un número anómalo de trampas durante la ejecución histórica para localizar módulos posiblemente sospechosos. El error específico en el backend x86_64 de Cranelift es que una dirección de WebAssembly que se desplaza a la izquierda en una cantidad constante de 1 a 3 se doblará en los modos de direccionamiento de x86_64 que realizan cambios.
  • Por ejemplo `(i32.load (i32.shl (local.get 0) (i32.const 3)))` se carga desde la dirección de WebAssembly `$local0 << 3`. Cuando se traduce a Cranelift, el cálculo `$local0 << 3`, un valor de 32 bits, se extiende a cero a un valor de 64 bits y luego se agrega a la dirección base de la memoria lineal. Cranelift generaría una instrucción de la forma `movl (%base, %local0, 8), %dst` que calcula `%base + %local0 << 3`.
  • El error aquí, sin embargo, es que el cálculo de la dirección ocurre con valores de 64 bits, donde se suponía que el cálculo `$local0 << 3` se truncaría a un valor de 32 bits. Esto significa que `%local0`, que puede usar hasta 32 bits para una dirección, obtiene 3 bits adicionales de espacio de direcciones para acceder a través de esta instrucción `movl`.
  • La solución en Cranelift es eliminar las reglas de reducción erróneas en el backend que manejan estas expresiones extendidas a cero. El ejemplo anterior se traduce luego a `movl %local0, %temp; shl $3, %temp; movl (%base, %temp), %dst` que trunca correctamente el cálculo intermedio de `%local0 << 3` a 32 bits dentro del registro `%temp` que luego se agrega al valor `%base`. Se lanzaron las versiones 4.0.1, 5.0.1 y 6.0.1 de Wasmtime y todas se parchearon para que ya no contengan las reglas de reducción erróneas.
  • Si bien se recomienda actualizar Wasmtime, existen varias soluciones posibles que los integradores pueden emplear para mitigar este problema si la actualización no es posible. Tenga en cuenta que ninguna de estas soluciones está activada de forma predeterminada y requiere una configuración explícita: 1. La opción `Config::static_memory_maximum_size(0)` se puede usar para forzar que todos los accesos a la memoria lineal se verifiquen explícitamente. Esto realizará una verificación de límites por separado del cálculo del modo de dirección que calcula correctamente la dirección efectiva de una carga/almacenamiento.
  • Tenga en cuenta que esto puede tener un gran impacto en el rendimiento de ejecución de los módulos de WebAssembly. 2. La opción `Config::static_memory_guard_size(1 << 36)` se puede utilizar para aumentar considerablemente las páginas de protección colocadas después de la memoria lineal. Esto garantizará que los accesos a la memoria de hasta 34 G de distancia sean semánticamente correctos al reservar memoria no asignada para la instancia. Tenga en cuenta que esto reserva una gran cantidad de memoria virtual por instancias y puede reducir en gran medida la cantidad máxima de instancias simultáneas que se ejecutan. 3.
  • Si es posible usar un host que no sea x86_64, eso también solucionará este error. Este error no afecta al backend AArch64 de Wasmtime o Cranelift, por ejemplo. Esto garantizará que los accesos a la memoria de hasta 34 G de distancia sean semánticamente correctos al reservar memoria no asignada para la instancia. Tenga en cuenta que esto reserva una gran cantidad de memoria virtual por instancias y puede reducir en gran medida la cantidad máxima de instancias simultáneas que se ejecutan. 3. Si es posible usar un host que no sea x86_64, eso también solucionará este error.
  • Este error no afecta al backend AArch64 de Wasmtime o Cranelift, por ejemplo. Esto garantizará que los accesos a la memoria de hasta 34 G de distancia sean semánticamente correctos al reservar memoria no asignada para la instancia. Tenga en cuenta que esto reserva una gran cantidad de memoria virtual por instancias y puede reducir en gran medida la cantidad máxima de instancias simultáneas que se ejecutan. 3. Si es posible usar un host que no sea x86_64, eso también solucionará este error. Este error no afecta al backend AArch64 de Wasmtime o Cranelift, por ejemplo.

Sitios de referencia

  • CVE-2023-26489: https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-ff4p-7xrq-q5r8

Otras paginas de vulnerabilidades CVE

¿Quieres encontrar más vulnerabilidades?.

Sin usted, esta web no existiria. Gracias por visitarme, espero que le haya gustado y vuelva. Muchas gracias ☺️

Fecha actualización el 2023-03-12. Fecha publicación el 2023-03-12. Autor: Oscar olg Mapa del sitio Fuente: cve report