Home / Desarrollo Android / Detección de errores de corrupción de memoria con HWASan

Detección de errores de corrupción de memoria con HWASan

publicado por Evgenii Stepanov, ingeniero de software de personal, herramientas dinámicas

El código nativo en lenguajes de memoria inseguros como C y C ++ a menudo es vulnerable a errores de corrupción de memoria. Nuestros datos muestran que problemas como el uso de desbordamientos de búfer de libre almacenamiento y de doble pila generalmente representan más del 65% de los errores de seguridad altos y críticos en Chrome y Android.

En años anteriores, nuestros esfuerzos de detección de errores de memoria se centraron en Address Sanitizer (ASan). ASan detecta estos errores, pero hace que la aplicación use memoria extra 2x-3x y se ejecute más lentamente.

Para abordar mejor estos problemas, desarrollamos un desinfectante de direcciones asistido por hardware (HWASan). HWASan generalmente requiere solo un 15% más de memoria. También es mucho más rápido que ASan. El rendimiento de HWASan lo hace utilizable no solo para pruebas unitarias, sino también para pruebas interactivas dirigidas por humanos. Usamos esto para encontrar problemas de memoria en el sistema operativo Android en y ahora hemos facilitado que los desarrolladores de aplicaciones también lo usen. HWASan es lo suficientemente rápido como para que algunos desarrolladores de Android lo usen en sus dispositivos de desarrollo para las actividades diarias.

Bajo el capó

HWASan se basa en la codificación de memoria y depende de la función Ignorar byte superior que se encuentra en todas las CPU ARM de 64 bits y el soporte del núcleo asociado. A cada asignación de memoria se le asigna una etiqueta aleatoria de 8 bits que se almacena en el byte más significativo (MSB) de la dirección, pero que la CPU ignora. En consecuencia, este puntero etiquetado puede usarse en lugar de un puntero normal sin cambios en el código.

Bajo el capó, HWASan utiliza memoria de sombra un mapa disperso que asigna un valor de etiqueta a cada bloque de 16 bytes de memoria de programa. El equipo de compilación de código de tiempo se utiliza para insertar controles que comparan el puntero y las etiquetas de memoria para cada acceso a la memoria y generan un error si no coinciden.

Este enfoque nos permite detectar tanto los tipos de errores posteriores como los de desbordamiento del búfer. La etiqueta de memoria sombreada se cambia a un valor aleatorio durante la asignación y la desasignación. Como resultado, intentar acceder a la memoria desasignada con un puntero colgante casi con seguridad fallará debido a una falta de coincidencia de etiquetas. Lo mismo ocurre con un intento de acceder a la memoria fuera de la región asignada, que es muy probablemente con una etiqueta diferente. Las pilas y variables globales están protegidas de manera similar.

  Detección de errores sin necesidad de usar con etiquetas de memoria.

Detección de errores de uso libre con etiquetas de memoria.

Este enfoque no es determinista: debido al número limitado de etiquetas posibles, el acceso no válido a la memoria tiene una probabilidad de 1 en 256 (alrededor del 0,4%) de pasar desapercibido. No vimos esto como un problema en la práctica, pero debido a la aleatoriedad de las etiquetas, es muy probable que la ejecución del programa la segunda vez detecte cualquier error que haya perdido la primera ejecución.

Una ventaja de HWASan sobre ASan es su capacidad para encontrar errores que ocurren lejos de su punto de origen, como el uso gratuito después del cual se accede a la memoria mucho después de que se ha desasignado o un desbordamiento de búfer con un Gran desplazamiento. Este no es el caso con ASan, que utiliza zonas rojas alrededor de las asignaciones de memoria y una cuarentena para el almacenamiento temporal de bloques de memoria recientemente desasignados. Tanto las áreas rojas como las de cuarentena tienen un tamaño limitado y la detección de errores es poco probable más allá. HWASan utiliza un enfoque diferente que no tiene estas limitaciones.

Uso

Cuando se detecta un error, el proceso finaliza y se imprime un volcado por caída en logcat. El campo "Abortar mensaje" contiene un informe HWASan, que muestra el tipo de acceso (lectura o escritura), la dirección de acceso, la ID del hilo y el seguimiento de la pila de la pila de acceso de memoria incorrecta . Esto es seguido por una traza de la pila para la asignación original y, para los errores de uso libre después, una traza de la pila que muestra dónde tuvo lugar la desasignación. Los usuarios avanzados pueden encontrar más información de depuración debajo de esto, incluido un mapa de etiquetas de memoria para ubicaciones cercanas.















señal 6 (SIGABRT), código -1 (SI_QUEUE), error agregado --------
Cancelar mensaje: & # 39; == 21586 == ERROR: HWAddressSanitizer: etiqueta-discordancia en la dirección 0x0042a0807af0 en la PC 0x007b23b8786c
ESCRIBA tamaño 1 a 0x0042a0807af0 etiqueta: db / 19 (ptr / mem) en la discusión T0
# 0 0x7b23b87868 (/data/app/com.example.myapp/lib/arm64/native.so+0x2868)
# 1 0x7b8f1e4ccc (/apex/com.android.art/lib64/libart.so+0x198ccc)
[...] 



0x0042a0807af0 se encuentra a 0 bytes a la derecha de la región de 16 bytes 



[0x0042a0807ae0.0x0042a0807af0)
asignado aquí:
# 0 0x7b92a322bc (/path/to/libclang_rt.hwasan-aarch64-android.so+0x212bc)
# 1 0x7b23b87840 (/data/app/com.example.myapp/lib/arm64/native.so+0x2840)
[...] 

Un fragmento de ejemplo de un informe de bloqueo de HWASan.

Google usa HWASan ampliamente en el desarrollo de Android, y ahora usted también puede hacerlo. Obtenga más información, incluidos detalles sobre cómo reconstruir su aplicación para usar con HWASan, en https://developer.android.com/ndk/guides/hwasan. Las imágenes predeterminadas del sistema HWASan están disponibles en el servidor de compilación AOSP (o puede crear las suyas propias). Se pueden transferir fácilmente a un dispositivo compatible utilizando la herramienta web flash recientemente anunciada.

About AndroidEditor

Check Also

El nuevo Unity 2019.3 ofrece características nuevas y potentes para desarrolladores de juegos

Unity 2019.3, la última versión del famoso motor de juegos multiplataforma, ya está disponible para …

Deja un comentario

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