Advertencias de seguridad

Acceso a la memoria debido a un fallo de generación de código en el módulo de Cranelift

21 de mayo de 2021

A continuación podrás consultar un aviso de seguridad de Fastly (FSecA) que describe la investigación sobre CVE-2021-32629, un error en 0.73.0 del backend de Cranelift x64, que se usa para compilar módulos de WebAssembly (también por parte de clientes de Fastly que utilizan Compute@Edge). Este error fue revelado en una publicación reciente de la Bytecode Alliance[1].


El objetivo de este FSecA es exponer que comprendemos claramente la aplicabilidad y el impacto de esta investigación y describir la solución que se ha implementado.


Aplicabilidad


Este aviso de seguridad concierne a los clientes que utilizan Compute@Edge y cuyos módulos se cargaron entre el 8 de marzo de 2021 y el 22 de abril de 2021. No es aplicable a todos los clientes ni tampoco a los módulos que no se cargaron durante dicho periodo.


Resumen


El error identificado en el backend x64 de Cranelift realiza una extensión de signo en lugar de una extensión de ceros en un valor cargado desde el stack cuando el asignador de registros vuelve a cargar un valor entero desbordado inferior a 64 bits. Este comportamiento choca con otra optimización: el selector de instrucciones elide un operador de extensión de ceros de 32 a 64 bits cuando sabemos que una instrucción que produce un valor de 32 bits en realidad pasa a cero los 32 bits superiores de su registro de destino. Así, el compilador x64 se basa en estos bits a cero, pero el tipo del valor sigue siendo i32, y el spill/reload reconstituye esos bits como la extensión de signo del bit más importante (MSB) de i32.


El problema, pues, ocurriría cuando:



  • un valor i32 es mayor o igual a 0x8000_0000;

  • el valor es desbordado y recargado por el asignador de registros debido a la gran presión de registros que hay en el programa entre la definición del valor y su uso;

  • el valor se produce por una instrucción que sabemos que es «especial» al pasar a cero los 32 bits superiores de su destino: add, sub, mul, and, or;

  • acto seguido, el valor se extiende con ceros hasta los 64 bits;

  • se utiliza el valor resultante de 64 bits.


En esta situación, existe un posible escape del entorno aislado cuando el valor i32 es un puntero. El código emitido normalmente para acceder al montón de la memoria extiende con ceros la dirección del montón de WebAssembly, la añade a la base del montón de 64 bits y accede a la dirección resultante. Si la extensión de ceros se convierte en una extensión de signo, el programa podría retroceder y acceder a la memoria hasta 2 GiB antes del comienzo del montón.


Como consecuencia, si se ejecutara un módulo malicioso, el servicio caería debido a una aserción desde LUCET_MAGIC no válido, si la ranura de la instancia previa no hubiera estado ejecutándose, o el proceso terminaría por una trampa fuera de límite. Fastly ha descubierto que un módulo de WebAssembly creado expresamente podría atacar la versión vulnerable del compilador Cranelift durante el proceso de compilación de Compute@Edge. Si se diera la circunstancia, el módulo de WebAssembly podría acceder a partes de la memoria en otro entorno aislado, o subvertir el flujo de control del demonio de Compute@Edge.


La vulnerabilidad se descubrió durante la supervisión rutinaria de comportamientos inusuales de módulos de WebAssembly en Compute@Edge, y se identificó mediante el análisis de un módulo cargado por el investigador de seguridad Javier Cabrera Arteaga del KTH Royal Institute of Technology. En el transcurso de la investigación de ese comportamiento inusual, los ingenieros de Fastly identificaron el error y determinaron que se podía aprovechar, y trabajaron con la Bytecode Alliance en su difusión coordinada.


Corrección


Hemos auditado los módulos de WebAssembly en Compute@Edge y hemos confirmado que no hay ningún módulo de WebAssembly en Compute@Edge que esté creado de manera que se pueda aprovechar este fallo.


No se requiere ninguna acción por parte de los clientes de Compute@Edge. El problema se ha solucionado por completo, con las siguientes notas:



  • Los módulos afectados no atendieron ninguna petición de los clientes.

  • Se ha corregido la vulnerabilidad en la implementación de Cranelift de Compute@Edge.

  • Se han recompilado todos los módulos de WebAssembly de los clientes utilizando el compilador actualizado.


Agradecimientos


Los desarrolladores de Fastly identificaron este fallo tras recibir información del mismo por parte de Javier Cabrera Arteaga, del KTH Royal Institute of Technology, que contó con el apoyo del proyecto Trustful de Stiftelsen för Strategisk Forskning.
Referencias
[1] https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-hpqh-2wqx-7qp5


Información de contacto


Si tienes más preguntas, ponte en contacto con el Servicio de Asistencia de Ingeniería de Fastly escribiendo a support@fastly.com o con el equipo de Seguridad de Fastly a través de security@fastly.com.

Suscríbete a las advertencias de seguridad.

Al enviar la solicitud, das tu consentimiento para que tus datos se envíen a Fastly en los Estados Unidos y sean tratados conforme a nuestra Política de privacidad.

¿List@ para empezar?

Ponte en contacto o crea una cuenta.