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, lo que lo hace adecuado para la limpieza de todo el sistema. HWASan solo está disponible en Android 10 y solo en hardware AArch64.

Aunque es útil principalmente 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 usa para implementar interfaces de Java. Es útil porque detecta errores de memoria cuando ocurren y te dirige 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 (al igual que ASan) es compatible con UBSan, y ambos 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 que un acceso a la memoria sea válido, las etiquetas del puntero y de la memoria deben coincidir. HWASan se basa en la función de omisión de bytes superiores (TBI) de ARMv8, también llamada etiquetado de direcciones virtuales, para almacenar la etiqueta del puntero en 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.

De forma predeterminada, HWASan no tiene las zonas rojas de tamaño limitado de ASan para detectar desbordamientos ni la cuarentena de capacidad limitada de ASan para detectar el uso después de liberar. Por este motivo, HWASan puede detectar un error, sin importar el tamaño del desbordamiento ni cuánto tiempo hace que se desasignó la memoria. 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

Las versiones recientes (4.14 y posteriores) del kernel común de Android admiten HWASan de forma predeterminada. 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 upstream:

Si compilas 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 funcionan de inmediato.
  • No es necesario escribir en la memoria flash los datos del usuario.

También se quitaron 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 ser 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).

Cómo limpiar objetivos individuales

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

Ten en cuenta que la limpieza de libc habilita el etiquetado de las asignaciones de memoria del montón en todo el sistema, así como la verificació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.

Flashstation

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. Selecciona 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 registrar un seguimiento de pila para cada evento de asignación y desasignación de memoria en el programa. Android habilita los punteros de marco en el código AArch64 de forma predeterminada, por lo que esto funciona muy bien en la práctica. Si necesitas descomprimir el código administrado, configura HWASAN_OPTIONS=fast_unwind_on_malloc=0 en el entorno de proceso. Ten en cuenta que los seguimientos de pila de acceso a memoria incorrectos usan el desenredador "lento" de forma predeterminada. Este parámetro de configuración solo afecta los seguimientos 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.