martes , diciembre 1 2020
Home / Desarrollo Android / Use HWASan para detectar errores de corrupción de memoria

Use HWASan para detectar errores de corrupción de memoria

Publicado por Evgenii Stepanov, ingeniero de software sénior, herramientas dinámicas.

El código nativo escrito en lenguajes no seguros para la memoria (como C y C ++) a menudo es vulnerable a errores de corrupción de memoria. Nuestros datos indican que problemas como el uso posterior al lanzamiento, el lanzamiento doble y el desbordamiento del búfer de almacenamiento dinámico a menudo constituyen más del 65% de las vulnerabilidades de seguridad graves y de alto riesgo en Chrome y Android.

En los últimos años, nuestros esfuerzos de detección de errores de memoria se han centrado en Address Sanitizer (ASan). ASan detectó estos errores, pero hizo que su aplicación usara 2 a 3 veces la memoria extra y se ejecutara más lentamente.

Para resolver mejor estos problemas, desarrollamos un limpiador de direcciones asistido por hardware (HWASan). HWASan generalmente solo necesita un 15% más de memoria. También es mucho más rápido que ASan. El rendimiento de HWASan lo hace útil no solo para pruebas unitarias, sino también para pruebas interactivas impulsadas por humanos. Lo usamos para encontrar problemas de memoria en el sistema operativo Android en sí, y ahora lo hacemos fácil para los desarrolladores de aplicaciones. HWASan es lo suficientemente rápido como para que algunos desarrolladores de Android lo usen para sus tareas diarias en sus dispositivos de desarrollo.

Insider

HWASan se basa en etiquetas de memoria y se basa en la función "ignorar byte alto" y el soporte de kernel relacionado proporcionado en todas las CPU ARM de 64 bits. 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 la CPU la ignora. Como resultado, este puntero etiquetado se puede usar en lugar de un puntero normal sin ningún cambio de código.

En el fondo, HWASan utiliza memoria de sombra un mapa disperso que asigna un valor de etiqueta a cada bloque de 16 bytes de memoria de programa. La detección de código en tiempo de compilación se utiliza para las comprobaciones de inserción para comparar punteros y etiquetas de memoria para cada acceso a la memoria, y generar un error si no coinciden.

Este método nos permite detectar dos tipos de uso posterior al lanzamiento y desbordamiento del búfer. Durante la asignación y la desasignación, las etiquetas de memoria en las sombras cambian a valores aleatorios. Como resultado, los intentos de acceder a la memoria liberada con punteros colgantes casi fallarán debido a etiquetas no coincidentes . Lo mismo es cierto al tratar de acceder a la memoria fuera del área asignada, muy probablemente con una etiqueta diferente. La pila y las variables globales están protegidas de manera similar.

 Detección de vulnerabilidad posterior al lanzamiento con etiqueta de memoria.

Detección de vulnerabilidad posterior al lanzamiento con etiqueta de memoria.

Este método es indeterminado: debido al número limitado de etiquetas posibles, los accesos no válidos a la memoria tienen la posibilidad de fallar la detección una vez en 256 (aproximadamente 0.4%). De hecho, no encontramos que esto sea un problema, pero debido a la aleatoriedad de las etiquetas, es probable que la segunda ejecución del programa encuentre errores que faltan en la primera ejecución.

Una ventaja de HWASan sobre ASan es que puede detectar errores que se producen fuera de su punto de origen, por ejemplo, usar después de mucho tiempo libre después de acceder a la memoria de forma gratuita o desbordamiento del búfer. Gran desplazamiento. Este no es el caso de ASan, que usa áreas rojas alrededor de las asignaciones de memoria y usa cuarentenas para el almacenamiento temporal de bloques de memoria lanzados recientemente. Tanto el tamaño de la zona roja como la zona de cuarentena son limitados, y la probabilidad de detección falsa no es mayor que esto. HWASan usa otro método que no tiene estas limitaciones.

Uso

Cuando se encuentra un error, el proceso finaliza y se imprime un volcado por caída en logcat. El campo "Abortar mensaje" contiene el informe HWASan, que muestra el tipo de acceso (lectura o escritura), dirección de acceso, ID de subproceso y seguimiento de pila de mal acceso a la memoria. Esto es seguido por la traza original de la pila asignada y la traza de la pila para los errores utilizados después del lanzamiento, que muestra dónde ocurrió la reasignación. Los usuarios avanzados pueden encontrar información de depuración adicional a continuación, incluidos mapas de etiquetas de memoria para ubicaciones cercanas.

 Señal 6 (SIGABRT), código -1 (SI_QUEUE), sumador de fallas --------
Mensaje de cancelación: & # 39; == 21586 == Error: HWAddressSanitizer: la etiqueta de dirección 0x0042a0807af0 en la PC 0x007b23b8786c no coincide
Escriba una etiqueta de tamaño 1 en la etiqueta 0x0042a0807af0: db / 19 (ptr / mem) en el hilo T0
# 0 0x7b23b87868 (/data/app/com.example.myapp/lib/arm64/native.so+0x2868)
# 1 0x7b8f1e4ccc (/apex/com.android.art/lib64/libart.so+0x198ccc)
[...]

0x0042a0807af0 es el byte 0 en el lado derecho del área de 16 bytes [0x0042a0807ae0,0x0042a0807af0)
Asignar aquí:
# 0 0x7b92a322bc (/path/to/libclang_rt.hwasan-aarch64-android.so+0x212bc)
# 1 0x7b23b87840 (/data/app/com.example.myapp/lib/arm64/native.so+0x2840)
[...]

Fragmento de muestra del informe de bloqueo HWASan.

Google usa HWASan ampliamente en el desarrollo de Android, y ahora usted también puede hacerlo. Obtenga más información en https://developer.android.com/ndk/guides/hwasan, incluidos detalles sobre cómo reconstruir aplicaciones para su uso con HWASan. Una imagen del sistema HWASan precompilada está disponible en el servidor de compilación AOSP (o puede crear la suya propia). Con la herramienta de actualización web recientemente lanzada, puede actualizarlos fácilmente en dispositivos compatibles.

Deja un comentario

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