Proteja la memoria de su aplicación con Arm Memory Tagging Extension (MTE)

Los errores sutiles de memoria, incluidos los desbordamientos del búfer y los errores de puntero, crean bombas de tiempo en sus aplicaciones. Los actores malintencionados pueden aprovechar estas fallas para ejecutar código no autorizado, tomar el control de los sistemas para agregarlos a las redes de bots de malware o simplemente bloquear aplicaciones y sistemas. El infame gusano Morris de 1988 fue uno de los primeros ejemplos de una aplicación maliciosa que explotó un desbordamiento de búfer. Los informes de problemas de seguridad de almacenamiento que causan posibles vulnerabilidades están llegando a un ritmo alarmante, ya sea por parte de los investigadores de seguridad o que se encuentran en la naturaleza.

El impacto en los usuarios puede ser significativo. Las aplicaciones fraudulentas pueden aprovechar el almacenamiento inseguro para acceder a datos confidenciales, como credenciales de usuario y contraseñas, lo que permite el acceso a privilegios más altos en el sistema. Esto permite que los actores malintencionados obtengan acceso a datos confidenciales o hagan que el sistema forme parte de una botnet más grande. No siempre son las fuerzas externas las que causan problemas; a veces, la memoria insegura conduce a bloqueos impredecibles del sistema debido a pérdidas de memoria y problemas relacionados que frustran a los usuarios. Se estima que dos tercios de todas las violaciones de seguridad de Android se pueden atribuir a prácticas de almacenamiento inseguras.

Índice

    Extensión para activar el etiquetado de memoria

    Las soluciones basadas en software, incluido Address Sanitizer (Asan), ayudan a aliviar estos problemas de memoria al integrar la detección de corrupción de memoria en los compiladores modernos. Sin embargo, Asan requiere agregar instrumentación de software al código de la aplicación, lo que puede ralentizar significativamente el tiempo de ejecución de la aplicación y aumentar el uso de la memoria, lo que es particularmente problemático con los sistemas móviles e integrados.

    Lo que se necesita es una solución para identificar y minimizar los errores de memoria con un impacto mínimo en el rendimiento y el uso de la memoria. La implementación adecuada de un método basado en hardware para detectar el uso de memoria potencialmente inseguro dará como resultado un menor uso de la memoria y un mejor rendimiento, al tiempo que mejora la confiabilidad y seguridad del sistema.

    Arm introdujo su extensión de etiquetado de memoria como parte del conjunto de instrucciones Armv8.5. MTE ahora está integrado en CPU compatibles con Armv9 anunciadas recientemente por Arm, como Cortex-X2, Cortex-A710 y Cortex-A510. Las CPU futuras basadas en Armv9 también integrarán MTE. Todos ellos incluyen el etiquetado de memoria como parte fundamental de la arquitectura.

    La idea detrás del etiquetado de memoria es bastante simple: agregue un pequeño conjunto de bits a bloques de memoria para identificarlos como seguros para el uso de la aplicación. Arm implementa el etiquetado de memoria como un sistema de dos fases conocido como candado y llave:

    • Etiquetado de direcciones. Esto agregará cuatro bits al comienzo de cada puntero en el proceso. El etiquetado de direcciones solo funciona con aplicaciones de 64 bits porque usa Top-Byte-Ignore, una función de 64 bits de Arm. Las etiquetas de dirección actúan como una "clave" virtual.
    • Etiquetado de memoria. Las etiquetas de memoria también están formadas por cuatro bits, pero están asociadas con cada área alineada de 16 bytes en el área de memoria de la aplicación. Arm se refiere a estas regiones de 16 bytes como Etiqueta el granulado. Estos cuatro bits no se utilizan para datos de aplicaciones y se almacenan por separado. La etiqueta de memoria es el "candado".

    Una etiqueta de dirección virtual (llave) debe coincidir con la etiqueta de memoria (candado). De lo contrario, se produce un error.

    Ilustración 1. Muestra un ejemplo de acceso con llave y cerradura a la memoria.

    Dado que la etiqueta de dirección tiene que coincidir con la etiqueta de memoria, lo primero que puede notar es que 4 bits son solo 16 variaciones. Esto significa que MTE es un proceso estocástico, lo que significa que una llave puede asignarse incorrectamente a otra cerradura. Según Arm, la probabilidad de que esto ocurra es inferior al 8%.

    Dado que las etiquetas de dirección y memoria a menudo se crean y destruyen durante el funcionamiento, las unidades de asignación de memoria garantizan que las etiquetas de memoria secuenciales siempre difieran. MTE también admite la generación de etiquetas aleatorias. La combinación del asignador de memoria, que entiende que las etiquetas secuenciales deben ser diferentes, y la función de generación de etiquetas aleatorias significa que la frecuencia real de colisiones de etiquetas es bastante baja. Además, la implementación de MTE en una flota de millones (o miles de millones) de dispositivos puede proporcionar una sólida detección de fallas para el software de aplicaciones y sistemas.

    Arquitectura subyacente

    Armv8.5 y v9 implementan un nuevo tipo de memoria que Arm sincroniza con la memoria etiquetada normal. La CPU puede determinar la seguridad de un acceso a la memoria comparando una etiqueta de dirección con la etiqueta de memoria correspondiente. Los desarrolladores pueden optar por que una discrepancia de etiquetas dé como resultado una excepción sincrónica o que se informe de forma asincrónica para que la aplicación pueda continuar. La Figura 2 muestra cómo se implementa MTE en los diseños de CPU ARM.


    Figura 2. Arm Total Compute Solution (Armv9)

    Los detalles de discrepancias asincrónicas se acumulan en un registro del sistema. Esto significa que el sistema operativo puede aislar las desviaciones de ciertos subprocesos de ejecución y tomar decisiones en función de las operaciones en curso.

    Las excepciones síncronas pueden identificar directamente la carga específica o la instrucción de la tienda que causa discrepancias en las etiquetas. Arm agregó una variedad de nuevas instrucciones al conjunto de instrucciones para manipular etiquetas, manejar puntero y etiquetado de pila, y para uso del sistema de bajo nivel.

    Implementar Arm-MTE

    MTE se maneja en hardware; Los comandos de carga y guardado se han modificado para verificar que la etiqueta de dirección coincida con la etiqueta de memoria, y la asignación de memoria del hardware garantiza que las etiquetas de dirección y memoria se creen aleatoriamente. Esto tiene diferentes implicaciones para los desarrolladores de sistemas operativos y los programadores de aplicaciones de usuario final.

    Arm ha actualizado su enlace coherente AMBA 5 para admitir MTE. La lógica de verificación de etiquetas generalmente está integrada en la caché a nivel del sistema, y ​​la verificación de etiquetas y el almacenamiento en caché de etiquetas ocurren antes de la interfaz DRAM. La figura 3 muestra un diagrama de bloques ejemplar.


    figura 3: Diagrama de bloques de ejemplo que muestra cómo se podría implementar MTE en un diseño de SoC. (Fuente: Arm)

    Los sistemas operativos deben cambiarse para que sean totalmente compatibles con MTE. Arme primero un prototipo de MTE compilando una versión del kernel de Linux que implementó etiquetas. Google ha anunciado su intención de agregar MTE a Android y está trabajando con los desarrolladores de SoC para garantizar la compatibilidad.

    A los desarrolladores de aplicaciones de usuario final les resulta más fácil adoptar el soporte del sistema operativo para MTE. Debido a que MTE ocurre entre bastidores del sistema operativo y el hardware, las aplicaciones no requieren cambios en el código fuente. El etiquetado MTE para memoria de pila no requiere ningún esfuerzo adicional. Sin embargo, etiquetar la memoria en tiempos de ejecución existentes utilizando memoria de pila requiere la ayuda del compilador, por lo que los binarios existentes deben recompilarse. Es sencillo porque los desarrolladores de aplicaciones móviles a menudo lanzan actualizaciones de todos modos. La Figura 4 muestra el cronograma de desarrollo de software para la implementación de MTE.


    Figura 4: Calendario para el desarrollo de software con MTE

    Para garantizar que la memoria esté protegida, es posible que los objetos de la memoria deban alinearse con el gránulo de la etiqueta (alineación de 16 bytes). Esto puede aumentar el uso de memoria y pila, aunque el impacto parece ser relativamente menor.

    ¿Por qué utilizar Arm-MTE?

    MTE ofrece a los desarrolladores varias mejoras en la calidad de vida. MTE permite a los programadores encontrar rápidamente errores relacionados con la memoria, lo que acelera el proceso de depuración y desarrollo de aplicaciones. Debido a que los errores de memoria se pueden encontrar y corregir más rápidamente, es menos probable que surjan problemas como pérdidas de memoria, carreras de memoria y otras fallas relacionadas con la memoria. Esto, a su vez, mejora la experiencia del usuario final.

    Los errores de seguridad del almacenamiento representan alrededor de dos tercios de todos los errores comunes de vulnerabilidad y exposición (CVE), por lo que MTE permite a las empresas entregar aplicaciones más rápido y con menos errores. Los usuarios finales a menudo pueden dudar en actualizar a un nuevo hardware o software del sistema operativo, pero MTE les da razones específicas para actualizar, incluida una estabilidad mejorada y seguridad general.

    Información Adicional

    Puede encontrar información más detallada sobre las extensiones de etiquetado de memoria de Arm en varias fuentes.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir