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 para la memoria, como C, C++ y ensamblado, 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 esos errores es fundamental para nuestro éxito a largo plazo.
Durante los últimos años, trabajamos 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 negativamente la calidad.

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 está alineado con lo que observan nuestros colegas de Chrome (consulta la lista de errores destacados 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

Si bien es alentador saber que este no es solo un problema de Android (consulta las estadísticas de Chrome y Microsoft), debemos hacer más por la seguridad de nuestros usuarios.
El equipo de Project Zero de Google hace un seguimiento de los exploits de día cero que se usaron en ataques reales contra los usuarios como vulnerabilidades de día cero. Estos no son errores hipotéticos, sino exploits que se usan de forma activa en ataques contra los usuarios. Los errores de seguridad de la memoria (corrupción de la memoria y uso después de la liberación) representan 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 proveedor de bajo nivel, que a menudo tiene modificaciones personalizadas, aumenta significativamente los costos de corrección y pruebas. Sin embargo, detectar estos errores al principio del 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. Estamos ampliando las herramientas de seguridad de la memoria de Android y presentando nuevos requisitos que fomentan que nuestro ecosistema aborde esta categoría de errores. Con el tiempo, esto debería traducirse en una mayor calidad y seguridad para nuestros usuarios, y en costos más bajos para nuestros proveedores.

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

Requisitos para admitir la seguridad de la memoria

El documento de definición de compatibilidad de Android (CDD) recomienda usar herramientas de seguridad de la memoria durante el desarrollo.
Estamos trabajando en estrecha colaboración con nuestro ecosistema para aumentar el uso de las herramientas de seguridad de la memoria y, luego, integrarlas en los procesos de integración y pruebas continuas.
Con el tiempo, nos gustaría asegurarnos de que cada dispositivo pase una ejecución completa del conjunto de pruebas de compatibilidad (CTS) con herramientas de seguridad de la memoria, lo que demuestra que no se encontraron errores de este tipo. Por ejemplo, las plataformas Arm v9 deberán proporcionar una ejecución de CTS con la etiqueta de memoria habilitada, mientras que a las plataformas Arm v8 se les solicitará que proporcionen una ejecución de CTS con HWASAN y KASAN.

Rust como un nuevo lenguaje de programación 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 el futuro, Rust será complementario a las herramientas de seguridad de la 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 herramientas de seguridad de la memoria de Android

Nuestras herramientas abarcan una amplia variedad 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.