Seguridad de la memoria

Falta de seguridad de la memoria

Los errores de seguridad de la memoria, que son errores en el manejo de la memoria en lenguajes de programación nativos, son el problema más común en las bases de código de Android. Representan más del 60% de las vulnerabilidades de seguridad de gravedad alta y millones de fallas visibles para el usuario.

 Los errores de seguridad de la memoria afectan la experiencia del usuario, los costos y la seguridad.
Figura 1: Errores de seguridad de la memoria y su impacto negativo en la calidad, la seguridad y los costos

Los errores de seguridad de la memoria afectan de forma negativa la calidad y la estabilidad, y representan una parte significativa de las fallas observadas en los dispositivos de los usuarios finales. Por lo tanto, una alta densidad de errores de seguridad de la memoria se correlaciona directamente con una experiencia del usuario deficiente.
El código nativo, escrito en lenguajes no seguros en la memoria, como C, C++ y Assembly, representa más del 70% del código de la plataforma de Android y está presente en aproximadamente el 50% de las apps de Google Play Store.
Debido a la complejidad cada vez mayor del código, si no se controla, los errores de seguridad de la memoria aumentarán con el tiempo. Por lo tanto, proporcionar a nuestro ecosistema las herramientas y tecnologías que pueden detectar y mitigar tales errores es fundamental para nuestro éxito a largo plazo.
Durante los últimos años, hemos trabajado en estrecha colaboración con nuestros socios de hardware para desarrollar tecnologías de hardware, como el etiquetado de memoria de Arm, y también introdujeron Rust en la base de código de Android.
Estas tecnologías acelerarán nuestro camino hacia la seguridad de la memoria y ayudarán a la industria de software en general a abordar un área problemática clave.

Los errores de seguridad de la memoria afectan la calidad de forma negativa

Los errores de seguridad latentes de la memoria pueden causar resultados no deterministas, según el estado del sistema. Este comportamiento impredecible genera fallas y molestias para nuestros usuarios.

Todos los días, observamos millones de fallas nativas en dispositivos de usuarios finales y, con la introducción de GWP-ASan, rastreamos la mayoría de ellas hasta errores de seguridad de la memoria.
Este dato valida la correlación entre la calidad y la densidad de los errores de seguridad de la memoria y concuerda con lo que observan nuestros colegas de Chrome (consulta la lista de errores de GWP-ASan de Chrome).

Los errores de seguridad de la memoria afectan negativamente la seguridad.

Los errores de seguridad de la memoria siempre han sido el principal factor de las vulnerabilidades de seguridad de Android, desde la primera versión del sistema operativo.

Los errores de seguridad de la memoria afectan negativamente
  la seguridad.
Figura 2: Contribución de los errores de seguridad de la memoria a las vulnerabilidades de Android

Aunque resulte alentador saber que este problema no se trata solo de Android (consulta las estadísticas de Chrome y Microsoft), debemos tomar más medidas para proteger a los usuarios.
El equipo de Project Zero de Google realiza un seguimiento de los exploits de día cero que se usaron en ataques reales contra usuarios como vulnerabilidades de día cero. No son errores hipotéticos, sino que se usan activamente en ataques contra usuarios. Los errores de seguridad de la memoria (corrupción de la memoria y uso después de la liberación) comprenden una gran mayoría.

Los errores de seguridad de la memoria aumentan los costos

Mantener los dispositivos actualizados con correcciones de seguridad protege a nuestros usuarios, pero tiene un costo monetario para nuestro ecosistema.

La alta densidad de errores de seguridad de la memoria en el código de bajo nivel del proveedor, que a menudo tiene modificaciones personalizadas, aumenta de manera significativa los costos de la solución y las pruebas. Sin embargo, detectar estos errores con anticipación durante el ciclo de desarrollo puede reducir estos costos.

Las investigaciones muestran que detectar errores con anticipación puede reducir los costos hasta seis veces. Sin embargo, debido a la complejidad de nuestro ecosistema, la cantidad promedio de bases de código que mantiene un proveedor y la complejidad cada vez mayor del software, los ahorros podrían ser mayores.

Seguridad de la memoria

A partir de Android 12, realizamos cambios sistémicos para reducir la densidad de errores de seguridad de la memoria en las bases de código de Android. Extenderemos las herramientas de seguridad de la memoria de Android y agregaremos nuevos requisitos que alienten a nuestro ecosistema a abordar esta categoría de errores. Con el tiempo, estos cambios deberían traducirse en mayor calidad y seguridad para los usuarios, y en costos más bajos para nuestros proveedores.

Es probable que la seguridad de la memoria se convierta en un diferenciador de la calidad y la seguridad en los próximos años, y Android planea tomar la iniciativa.

Requisitos para admitir la seguridad de la memoria

En el Documento de definición de compatibilidad de Android (CDD), se recomienda usar herramientas de seguridad de la memoria durante el desarrollo.
Trabajamos en estrecha colaboración con nuestro ecosistema para aumentar el uso de herramientas de seguridad de la memoria y poder integrarlas en los procesos de integración y prueba continuas.
Con el tiempo, nos gustaría asegurarnos de que cada dispositivo se ejecute por completo en el conjunto de pruebas de compatibilidad (CTS) usando herramientas de seguridad de la memoria, lo que demuestra que no se encontraron esos errores. Por ejemplo, las plataformas ARM v9 deberán proporcionar una ejecución de CTS con el etiquetado de memoria habilitado, mientras que las plataformas Arm v8 deberán proporcionar una ejecución de CTS con HWASAN y KASAN.

Rust como lenguaje de programación nuevo para el código de la plataforma

Android 12 introdujo Rust como un lenguaje de plataforma. Rust proporciona seguridad de memoria y subprocesos en niveles de rendimiento similares a C/C++. Esperamos que Rust sea la opción preferida para la mayoría de los proyectos nativos nuevos. Sin embargo, no es factible reescribir todo el código no seguro para la memoria, que actualmente representa más del 70% del código de la plataforma de Android, en Rust. En adelante, Rust se complementará con las herramientas de seguridad de memoria.

Herramientas de seguridad de la memoria

Android admite una amplia variedad de herramientas que ayudan a detectar errores de seguridad de la memoria. En la siguiente figura, se presenta una taxonomía de las herramientas de seguridad de la memoria disponibles de Android.

Los errores de seguridad de la memoria afectan negativamente
  la seguridad.
Figura 3: Panorama de las herramientas de seguridad de la memoria de Android

Nuestras herramientas abarcan una amplia gama de situaciones y objetivos de implementación. En la siguiente documentación, se describe cada herramienta y se proporciona una referencia para usarlas en tus productos.