HWAddressSanitizer

Consulte Comprensión de los informes de HWASan para obtener información sobre cómo leer los bloqueos de HWASan.

AddressSanitizer asistido por hardware (HWASan) es una herramienta de detección de errores de memoria similar a AddressSanitizer . HWASan usa mucha menos RAM en comparación con ASan, lo que lo hace adecuado para la desinfección de todo el sistema. HWASan solo está disponible en Android 10 y superior, 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 bloqueos en C/C++ que se usa para implementar interfaces Java. Es útil porque detecta los errores de memoria cuando ocurren y lo señala directamente al código responsable.

Puede flashear imágenes HWASan preconstruidas a dispositivos Pixel compatibles desde ci.android.com ( instrucciones de configuración detalladas ).

Comparado con el ASan clásico, HWASan tiene:

  • Sobrecarga de CPU similar (~2x)
  • Sobrecarga de tamaño de código similar (40 - 50%)
  • Sobrecarga de RAM mucho menor (10% - 35%)

HWASan detecta el mismo conjunto de errores que ASan:

  • Desbordamiento/subdesbordamiento del búfer de pila y montón
  • Uso del montón después de gratis
  • Uso de pila fuera del alcance
  • Doble gratis/wild gratis

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

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

Detalles y limitaciones de la implementación

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

Puede 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 detectar desbordamientos ni la cuarentena de capacidad limitada de ASan para detectar el uso después de la liberación. Por esta razón, HWASan puede detectar un error sin importar cuán grande sea el desbordamiento o 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 una probabilidad del 0,4 % de que se pierda algún error durante una ejecución del programa.

Requisitos

Las versiones recientes (4.14+) del kernel común de Android son compatibles con HWASan de forma inmediata. Las sucursales específicas de Android 10 no tienen soporte para HWASan.

El soporte de espacio de usuario para HWASan está disponible a partir de Android 11 .

Si está trabajando con un kernel diferente, HWASan requiere que el kernel de Linux acepte punteros etiquetados en los argumentos de llamadas al sistema. El soporte para esto se implementó en los siguientes conjuntos de parches ascendentes:

Si está compilando con una cadena de herramientas personalizada, asegúrese de que incluya todo hasta LLVM commit c336557f .

Usando HWASan

Use los siguientes comandos para construir toda la plataforma usando HWASan:

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

Para mayor comodidad, puede agregar la configuración SANITIZE_TARGET a una definición de producto, similar a aosp_coral_hwasan .

Para los usuarios familiarizados con AddressSanitizer, se ha ido mucha complejidad de compilación:

  • No es necesario ejecutar make dos veces.
  • Las compilaciones incrementales funcionan de forma inmediata.
  • No es necesario actualizar los datos de usuario.

Algunas restricciones de AddressSanitizer también desaparecieron:

  • Se admiten ejecutables estáticos.
  • Está bien omitir la desinfección de cualquier destino que no sea libc. A diferencia de ASan, no existe el requisito de que, si se desinfecta una biblioteca, también deba serlo cualquier ejecutable que la vincule.

El cambio entre HWASan e imágenes normales con el mismo número de compilación (o superior) se puede realizar libremente. No es necesario limpiar el dispositivo.

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

Higienización de objetivos individuales

HWASan se puede habilitar por objetivo en una compilación regular (sin desinfectar), siempre que libc.so también esté desinfectado. Agregue hwaddress: true al bloque sanitize en "libc_defaults" en bionic/libc/Android.bp. Luego haga lo mismo en el objetivo en el que está trabajando.

Tenga en cuenta que la desinfección de libc permite el etiquetado de las asignaciones de memoria en montón en todo el sistema, así como la verificación de las etiquetas para las operaciones de memoria dentro libc.so Esto puede detectar errores incluso en archivos binarios en los que HWASan no estaba habilitado si el acceso a la memoria incorrecto está en libc.so (p. ej., pthread_mutex_unlock() en un mutex delete() ed).

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

estación flash

Para fines de desarrollo, puede actualizar una compilación de AOSP habilitada para HWASan en un dispositivo Pixel con el cargador de arranque desbloqueado usando Flashstation . Seleccione el objetivo _hwasan, por ejemplo, aosp_flame_hwasan-userdebug. Consulte la documentación de NDK para HWASan para desarrolladores de aplicaciones para obtener más detalles.

Mejores rastros de pila

HWASan utiliza un desbobinador rápido basado en un puntero de cuadro para registrar un seguimiento de la 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 funciona muy bien en la práctica. Si necesita relajarse a través del código administrado, establezca HWASAN_OPTIONS=fast_unwind_on_malloc=0 en el entorno de proceso. Tenga en cuenta que los seguimientos de pila de acceso a memoria incorrectos utilizan el desenrollador "lento" de forma predeterminada; esta configuración solo afecta a los seguimientos de asignación y desasignación. Esta opción puede hacer un uso intensivo de la CPU, dependiendo de la carga.

Simbolización

Consulte Simbolización en "Comprensión de los informes de HWASan".

HWASan en aplicaciones

Similar a AddressSanitizer, HWASan no puede ver el código Java, pero puede detectar errores en las bibliotecas JNI. Hasta Android 14, no se admitía la ejecución de aplicaciones HWASan en un dispositivo que no sea HWASan.

En un dispositivo HWASan, las aplicaciones se pueden comprobar con HWASan creando su código con SANITIZE_TARGET:=hwaddress en Make, o -fsanitize=hwaddress en indicadores del compilador. En un dispositivo que no sea HWASan (que ejecute Android 14 o posterior), se debe agregar una configuración de archivo wrap.sh LD_HWASAN=1 . Consulte la documentación del desarrollador de la aplicación para obtener más detalles.