Google is committed to advancing racial equity for Black communities. See how.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

HWAddressSanitizer

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 en hardware AArch64. Puede flashear imágenes HWASan predefinidas en dispositivos Pixel compatibles desde ci.android.com ( instrucciones de configuración detalladas ).

En comparación 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 la pila fuera del alcance
  • Doble libre / salvaje libre

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

Detalles y limitaciones de la implementación

HWASan se basa en el enfoque de etiquetado de memoria , en el que 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, las etiquetas de puntero y memoria deben coincidir. HWASan se basa en la función ARMv8 de 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 redzones de tamaño limitado de ASan para detectar desbordamientos o la cuarentena de capacidad limitada de ASan para detectar el uso después de que esté libre. 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 posibles valores de etiqueta (256), lo que significa que hay un 0,4% de probabilidad de perder algún error durante una ejecución del programa.

HWASan requiere que el kernel de Linux acepte punteros etiquetados en los argumentos de las llamadas al sistema. El soporte está disponible en kernels prediseñados para dispositivos Pixel 2, 3, 3a y 4 en Android 10 y ramas superiores, y en las ramas de origen correspondientes en el repositorio de fuentes del kernel de AOSP . Se sabe que Pixel 2, 3, 3a y 4 funcionan con un sistema completo construido con HWASan.

El soporte para dispositivos que no son Pixel está disponible en el kernel común de Android en android-4.14 y ramas superiores, pero no en ramas específicas de Android 10 como android-4.14-q . También debe actualizar la cadena de herramientas LLVM a r370808 seleccionando la nueva cadena de herramientas en CL 1182220 y el cambio de sistema de compilación correspondiente en CL 1164431 .

Usando HWASan

Utilice los siguientes comandos para construir la plataforma completa usando HWASan:

lunch aosp_walleye-userdebug # (or any other product)
make SANITIZE_TARGET=hwaddress

A diferencia de ASan, con HWASan no es necesario compilar dos veces. Las compilaciones incrementales simplemente funcionan, no hay instrucciones especiales de flasheo o requisitos de borrado, se admiten ejecutables estáticos y está bien omitir la desinfección de cualquier biblioteca que no sea libc . Tampoco existe el requisito de que si una biblioteca se desinfecta, cualquier ejecutable que se vincule a ella también debe desinfectarse.

Para omitir la desinfección de un módulo, use LOCAL_NOSANITIZE := hwaddress o sanitize: { hwaddress: false } .

Los módulos individuales se pueden desinfectar con HWASan, con la salvedad de que libc también se puede limpiar con HWAS. Esto se puede hacer agregando sanitize: { hwaddress: true } a la definición del módulo Android.bp respectivo. Toda la plataforma Android se construye con HWASan cuando se usa una _hwasan con _hwasan _hwasan (incluida libc ) y, como tal, no es necesario desinfectar manualmente libc para las compilaciones de HWASan.

Mejores seguimientos de pila

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

Simbolización

Consulte Simbolización en la documentación de ASan.

HWASan en aplicaciones

Al igual que AddressSanitizer, HWASan no puede ver el código Java, pero puede detectar errores en las bibliotecas JNI. A diferencia de ASan, no se admite la ejecución de aplicaciones HWASan en un dispositivo que no sea ​​HWASan.

En un dispositivo HWASan, las aplicaciones se pueden verificar con HWASan construyendo su código con SANITIZE_TARGET:=hwaddress en Make, o -fsanitize=hwaddress en los indicadores del compilador.