AddressSanitizer asistido por hardware

Consulta Cómo interpretar HWASan de seguridad para obtener información para leer fallas de HWASan.

AddressSanitizer asistido por hardware (HWASan) es un error de memoria de detección de intrusiones similares a AddressSanitizer. HWASan usa mucha menos RAM en comparación con ASan, por lo que es adecuado para la limpieza de todo el sistema. HWASan solo está disponible en Android 10 y solo en hardware AArch64.

Aunque es principalmente útil para el código C/C++, HWASan también puede ayudar a depurar el código Java que causa fallas en C/C++ que se usan para implementar interfaces de Java. Es útil porque capta la memoria errores cuando ocurren, que te dirigen directamente al código responsable.

Puedes escribir en la memoria flash imágenes de HWASan compiladas previamente en dispositivos Pixel compatibles desde ci.android.com (instrucciones de configuración detalladas).

En comparación con la versión clásica de ASan, HWASan tiene las siguientes características:

  • Sobrecarga de la CPU similar (alrededor de 2 veces más)
  • Sobrecarga del tamaño de código similar (del 40 al 50%)
  • Sobrecarga de la RAM mucho menor (del 10 al 35%)

HWASan detecta el mismo conjunto de errores que ASan:

  • Desabastecimiento de búfer de pila
  • Uso de pila después de liberación
  • Uso de pila fuera del alcance
  • Cierre doble o cierre wild

Además, HWASan detecta el uso de la pila después de la devolución.

HWASan (igual que ASan) es compatible con UBSan se pueden habilitar en un destino al mismo tiempo.

Detalles y limitaciones de la implementación

HWASan se basa en el memoria de etiquetado, en el que se asocia un pequeño valor aleatorio de la etiqueta con punteros y rangos de direcciones de memoria. Para un recuerdo para que el acceso sea válido, el puntero y las etiquetas de memoria deben coincidir. HWASan se basa en la función ARMv8 en omisión de bytes superior (TBI), también llamada etiquetado de direcciones virtuales, para almacenar la etiqueta del puntero en la los bits más altos de la dirección.

Puedes leer más sobre el diseño de HWASan en el sitio de documentación de Clang.

Por diseño, HWASan no tiene las zonas rojas de tamaño limitado de ASan para la detección de desbordamientos o la cuarentena de capacidad limitada de ASan detectar el uso después de la liberación. Por este motivo, HWASan puede detectar un error sin importar lo grande que sea el desbordamiento o cuánto tiempo pasó la memoria desasignada. Esto le da a HWASan una gran ventaja sobre ASan.

Sin embargo, HWASan tiene un número limitado de valores de etiqueta posibles (256). lo que significa que hay un 0.4% de probabilidad de pasar por alto algún error durante una ejecución del programa.

Requisitos

Versiones recientes (4.14+) de la compatibilidad con kernels comunes de Android HWASan listo para usar. Las ramas específicas de Android 10 no son compatibles con HWASan.

La compatibilidad con el espacio del usuario para HWASan está disponible a partir de Android 11.

Si trabajas con un kernel diferente, HWASan requiere que el kernel de Linux acepte punteros etiquetados en argumentos de llamada del sistema. La compatibilidad con esto se implementó en los siguientes conjuntos de parches ascendentes:

Si estás compilando con una cadena de herramientas personalizada, asegúrate de que incluya todo hasta la confirmación de LLVM. c336557f:

Usa HWASan

Usa los siguientes comandos para compilar toda la plataforma con HWASan:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

Para mayor comodidad, puedes agregar el parámetro SANITIZE_TARGET a una definición de producto. similares a aosp_coral_hwasan

Para los usuarios familiarizados con AddressSanitizer, gran parte de la complejidad de la compilación desapareció:

  • No es necesario ejecutar Make dos veces.
  • Las compilaciones incrementales están listas para usar.
  • No es necesario escribir en la memoria flash los datos del usuario.

También desaparecen algunas restricciones de AddressSanitizer:

  • Se admiten ejecutables estáticos.
  • Puedes omitir la limpieza de cualquier objetivo que no sea libc. A diferencia de ASan, hay no es necesario que, si se limpia una biblioteca, también deberá estarlo cualquier ejecutable que la vincule.

Cambiar entre HWASan y imágenes normales con el mismo número de compilación (o uno superior) puede libremente. No es necesario limpiar el dispositivo.

Para omitir la limpieza de un módulo, usa LOCAL_NOSANITIZE := hwaddress (Android.mk) o sanitize: { hwaddress: false } (Android.bp).

Limpia los destinos individuales

HWASan se puede habilitar por destino en una compilación normal (no limpia), siempre y cuando libc.so también sea y los datos se desinfectan. Agrega hwaddress: true al bloque de limpieza en "libc_defaults". en binic/libc/Android.bp. Luego, haz lo mismo en el objetivo en el que estás trabajando.

Ten en cuenta que la limpieza de libc permite etiquetar las asignaciones de memoria del montón en todo el sistema, así como el comprobación de las etiquetas para las operaciones de memoria dentro de libc.so Esto puede detectar errores incluso en objetos binarios que no se habilitó HWASan si el acceso deficiente a la memoria está en libc.so (p. ej., pthread_mutex_unlock() en una exclusión mutua delete()).

No es necesario cambiar ningún archivo de compilación si toda la plataforma se compila con HWASan.

Estación de flash

Para fines de desarrollo, puedes escribir en la memoria flash una compilación del AOSP compatible con HWASan en un dispositivo Pixel. con el bootloader desbloqueado con Flashstation. Seleccione el objetivo _hwasan, p.ej., aosp_flame_hwasan-userdebug Consulta la Documentación del NDK para HWASan para desarrolladores de apps.

Mejores seguimientos de pila

HWASan usa un desenredador rápido basado en punteros de marco para grabar una pila. realizar un seguimiento de cada evento de asignación y desasignación de memoria en la . Android habilita punteros de marco en el código AArch64 de forma predeterminada, así que esto funciona muy bien en la práctica. Si necesitas relajarte código administrado, establecer HWASAN_OPTIONS=fast_unwind_on_malloc=0 en el entorno del proceso. Observa los errores en la pila de acceso a la memoria. usan el mecanismo "lento" desenrollador predeterminado; este parámetro de configuración solo afecta de asignación y desasignación. Esta opción puede ser muy y hacen un uso intensivo de la CPU, según la carga.

Simbolización

Consulta Simbolización. en "Cómo interpretar los informes de HWASan".

HWASan en apps

Similar a AddressSanitizer, HWASan no puede ver el código Java, pero puede detectar errores en las bibliotecas JNI. Hasta Android 14, se ejecutará HWASan. Las apps en un dispositivo que no sea HWASan no era compatible.

En un dispositivo HWASan, las apps se pueden verificar con HWASan compilando su código con SANITIZE_TARGET:=hwaddress en Make o -fsanitize=hwaddress en las marcas del compilador. En un dispositivo que no es HWASan (con Android 14 o versiones posteriores), se aplica una configuración de archivo wrap.sh Se debe agregar LD_HWASAN=1. Consulta la documentación para desarrolladores de apps para obtener más información.