Consulte Comprender los informes de HWASan para obtener información sobre cómo leer los fallos de HWASan.
AddressSanitizer asistido por hardware (HWASan) es una herramienta de detección de errores de memoria similar a AddressSanitizer . HWASan utiliza 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 código C/C++, HWASan también puede ayudar a depurar código Java que causa fallas en C/C++ utilizado para implementar interfaces Java. Es útil porque detecta errores de memoria cuando ocurren y le indica directamente el código responsable.
Puede actualizar imágenes HWASan prediseñadas en dispositivos Pixel compatibles desde ci.android.com ( instrucciones de configuración detalladas ).
En comparación con el ASan clásico, el HWASan tiene:
- Gastos generales de CPU similares (~2x)
- Gastos generales de tamaño de código similar (40 – 50%)
- Gasto de RAM mucho menor (10 % – 35 %)
HWASan detecta el mismo conjunto de errores que ASan:
- Desbordamiento/desbordamiento insuficiente del búfer de pila y montón
- Uso del montón después de gratis
- Uso de pila fuera del alcance
- Doble gratis/libre salvaje
Además, HWASan detecta el uso de la pila después del retorno.
HWASan (igual que ASan) es compatible con UBSan , ambos se pueden habilitar en un objetivo al mismo tiempo.
Detalles y limitaciones de 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 de ignorar byte superior (TBI) de ARMv8, también llamada etiquetado de direcciones virtuales , para almacenar la etiqueta de 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 etiquetas posibles (256), lo que significa que existe una probabilidad del 0,4% de pasar por alto algún error durante una ejecución del programa.
Requisitos
Las versiones recientes (4.14+) del kernel común de Android admiten HWASan desde el primer momento. Las ramas específicas de Android 10 no son compatibles con HWASan.
La compatibilidad con el 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 las llamadas al sistema. La compatibilidad con esto se implementó en los siguientes conjuntos de parches ascendentes:
- dirección etiquetada arm64 ABI
- arm64: desetiqueta los punteros de usuario pasados al kernel
- mm: Evite crear alias de direcciones virtuales en brk()/mmap()/mremap()
- arm64: Valida direcciones etiquetadas en access_ok() llamadas desde subprocesos del kernel
Si está compilando con una cadena de herramientas personalizada, asegúrese de que incluya todo hasta el compromiso LLVM c336557f .
Usando HWASan
Utilice 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, gran parte de la complejidad de compilación ha desaparecido:
- No es necesario ejecutar make dos veces.
- Las compilaciones incrementales funcionan de inmediato.
- No es necesario actualizar los datos del usuario.
Algunas restricciones de AddressSanitizer también han desaparecido:
- Se admiten ejecutables estáticos.
- Está bien omitir la desinfección de cualquier objetivo que no sea libc. A diferencia de ASan, no existe el requisito de que si una biblioteca se desinfecta, cualquier ejecutable que la vincule también deba serlo.
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 desinfección de un módulo, use LOCAL_NOSANITIZE := hwaddress
(Android.mk) o sanitize: { hwaddress: false }
(Android.bp).
Desinfección de objetivos individuales
HWASan se puede habilitar por objetivo en una compilación normal (no desinfectada), siempre que libc.so
también esté desinfectado. Agregue hwaddress: true
al bloque sanitize en "libc_defaults"
en bionic/libc/Android.bp. Luego haz lo mismo en el objetivo en el que estás trabajando.
Tenga en cuenta que sanear libc permite etiquetar las asignaciones de memoria dinámica en todo el sistema, así como verificar las etiquetas para operaciones de memoria dentro de libc.so
Esto puede detectar errores incluso en archivos binarios en los que HWASan no estaba habilitado si el acceso incorrecto a la memoria está en libc.so
(por ejemplo, pthread_mutex_unlock()
en un delete()
y mutex).
No es necesario cambiar ningún archivo de compilación si toda la plataforma se construye con HWASan.
estación flash
Para fines de desarrollo, puede actualizar una compilación de AOSP habilitada para HWASan en un dispositivo Pixel con un gestor de arranque desbloqueado usando Flashstation . Seleccione el destino _hwasan, por ejemplo, aosp_flame_hwasan-userdebug. Consulte la documentación del NDK para HWASan para desarrolladores de aplicaciones para obtener más detalles.
Mejores seguimientos de pila
HWASan utiliza un desenrollador rápido basado en punteros de fotogramas para registrar un seguimiento de la pila para cada evento de asignación y desasignación de memoria en el programa. Android habilita punteros de marco en el código AArch64 de forma predeterminada, por lo que funciona muy bien en la práctica. Si necesita desenredarse mediante código administrado, configure HWASAN_OPTIONS=fast_unwind_on_malloc=0
en el entorno del proceso. Tenga en cuenta que los seguimientos de pila de acceso incorrecto a la memoria utilizan el desenrollador "lento" de forma predeterminada; Esta configuración solo afecta 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 "Comprensión de los informes HWASan".
HWASan en aplicaciones
Al igual que 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 fuera HWASan.
En un dispositivo HWASan, las aplicaciones se pueden verificar con HWASan creando su código con SANITIZE_TARGET:=hwaddress
en Make, o -fsanitize=hwaddress
en los indicadores del compilador. En un dispositivo que no sea HWASan (con Android 14 o posterior), se debe agregar una configuración de archivo wrap.sh LD_HWASAN=1
. Consulte la documentación para desarrolladores de aplicaciones para obtener más detalles.