<ph type="x-smartling-placeholder"></ph> Voir Comprendre HWASan pour savoir comment lire les plantages HWASan.
HWASan (Hardware-assisted AddressSanitizer) est un outil de détection des erreurs de mémoire semblable à AddressSanitizer. HWASan utilise beaucoup moins de RAM que ASan, ce qui le rend adapté à la désinfection de l'ensemble du système. HWASan n'est disponible que sur Android 10 ou version ultérieure, et uniquement sur du matériel AArch64.
Bien qu'il soit principalement utile pour le code C/C++, HWASan peut également aider à déboguer le code Java qui provoque plantages en C/C++ utilisés pour implémenter des interfaces Java. Il est utile, car il détecte les erreurs de mémoire lorsqu'elles se produisent et vous dirige directement vers le code responsable.
Vous pouvez flasher des images HWASan prédéfinies sur les appareils Pixel compatibles depuis ci.android.com (instructions de configuration détaillées).
Par rapport à la version classique d'ASan, HWASan offre les avantages suivants:
- Surcharge processeur similaire (environ 2 fois)
- Surcharge de la taille du code similaire (40–50 %)
- Surcharge de RAM beaucoup plus faible (10 à 35 %)
HWASan détecte le même ensemble de bugs qu'ASan :
- Débordement positif/négatif de la pile et du tampon de tas de mémoire
- Bugs "use-after-free" au niveau des tas de mémoire
- Utilisation de la pile en dehors du champ d'application
- Bugs de type "double free"/"wild free"
De plus, HWASan détecte l'utilisation de la pile après le retour.
HWASan (comme ASan) est compatible avec UBSan. Les deux peuvent être activés sur une cible en même temps.
Détails et limites de l'implémentation
HWASan est basé sur l'approche de marquage de mémoire, où une petite valeur de balise aléatoire est associée à la fois à des pointeurs et à des plages d'adresses mémoire. Pour un souvenir pour être valide, le pointeur et les tags de mémoire doivent correspondre. HWASan s'appuie sur le paramètre TBI (Feature Top Byte ignore) d'ARMv8, également appelé taggage d'adresses virtuelles pour stocker le tag de pointeur dans le bits les plus élevés de l'adresse.
Pour en savoir plus sur la conception de HWASan, consultez le site de documentation de Clang.
HWASan n'a pas de zones rouges de taille limitée pour ASan pour détecter les dépassements ou la zone de quarantaine d'ASan à capacité limitée pour pour détecter l'utilisation après libération. Pour cette raison, HWASan peut détecter un bug, quelle que soit la taille du débordement ou la durée de désallocation de la mémoire. HWASan dispose ainsi d'un avantage considérable sur ASan.
Cependant, HWASan a un nombre limité de valeurs de balises possibles (256), ce qui signifie qu'il y a une probabilité de 0,4% de manquer un bug. lors d'une exécution du programme.
Conditions requises
Versions récentes (4.14+) des Compatibilité avec les noyaux Android courants Prêt à l'emploi de HWASan. Les branches spécifiques à Android 10 ne sont pas compatibles avec HWASan.
La prise en charge de HWASan dans l'espace utilisateur est disponible à partir d'Android 11.
Si vous travaillez avec un noyau différent, HWASan exige que le noyau Linux accepte les pointeurs tagués dans des arguments d'appel système. Cette fonctionnalité a été implémentée dans les correctifs en amont suivants :
- ABI d'adresse taguée arm64
- arm64 : suppression des tags des pointeurs utilisateur transmis au noyau
- mm: évitez de créer des alias d'adresse virtuelle dans brk()/mmap()/mremap()
- arm64 : validation des adresses taguées dans access_ok() appelé à partir de threads du kernel
Si vous effectuez une compilation avec une chaîne d'outils personnalisée, assurez-vous qu'elle inclut tout jusqu'au commit LLVM c336557f.
Utiliser HWASan
Exécutez les commandes suivantes pour créer la plate-forme complète à l'aide de HWASan:
lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j
Pour plus de commodité, vous pouvez ajouter le paramètre SANITIZE_TARGET à une définition de produit, similaire à aosp_coral_hwasan.
Pour les utilisateurs qui connaissent AddressSanitizer, la complexité de la compilation est beaucoup moins importante :
- Il n'est pas nécessaire d'exécuter make deux fois.
- Les builds incrémentiels sont prêts à l'emploi.
- Il n'est pas nécessaire de flasher les données utilisateur.
Certaines restrictions AddressSanitizer ont également disparu :
- Les exécutables statiques sont acceptés.
- Vous pouvez ignorer le nettoyage de toute cible autre que libc. Contrairement à ASan, aucune obligation que si une bibliothèque est nettoyée, tous les exécutables qui la relient doivent également l'être.
Il est possible de passer de HWASan à des images standards avec le même numéro de build (ou un numéro supérieur). librement. Il n'est pas nécessaire d'effacer l'appareil.
Pour ignorer le nettoyage d'un module, utilisez
LOCAL_NOSANITIZE := hwaddress
(Android.mk) ou
sanitize: { hwaddress: false }
(Android.bp).
Nettoyer les cibles individuelles
HWASan peut être activé par cible dans un build standard (non nettoyé), à condition que libc.so
soit également
désinfectées. Ajouter hwaddress: true
au bloc "Sanitize" dans "libc_defaults"
dans bionic/libc/Android.bp. Ensuite, faites de même dans la cible sur laquelle vous travaillez.
Notez que le nettoyage de libc permet d'ajouter des tags aux allocations de mémoire du tas de mémoire à l'échelle du système, ainsi que
vérification des tags pour les opérations de mémoire dans libc.so
. Cela peut détecter des bugs même dans les binaires pour lesquels HWASan n'était pas activé si l'accès à la mémoire incorrect se trouve dans libc.so
(par exemple, pthread_mutex_unlock()
sur un mutex delete()
).
Il n'est pas nécessaire de modifier les fichiers de compilation si l'ensemble de la plate-forme est compilé à l'aide de HWASan.
Station de flash
À des fins de développement, vous pouvez flasher un build d'AOSP compatible avec HWASan sur un appareil Pixel. avec le bootloader déverrouillé à l'aide de Flashstation. Sélectionnez la cible _hwasan, par exemple aosp_flame_hwasan-userdebug. Pour en savoir plus, consultez la documentation du NDK sur HWASan pour les développeurs d'applications.
Meilleures traces de la pile
HWASan utilise un dérouleur rapide basé sur un pointeur de frame pour enregistrer une pile
pour chaque événement d'allocation et de désallocation de mémoire
programme. Android active les pointeurs de frame dans le code AArch64 par défaut. Cela fonctionne donc très bien en pratique. Si vous avez besoin
de vous détendre
code géré, définir HWASAN_OPTIONS=fast_unwind_on_malloc=0
dans l'environnement de processus. Notez que les traces de pile d'accès mémoire incorrect utilisent le dérouleur "lent" par défaut. Ce paramètre n'affecte que les traces d'allocation et de désallocation. Cette option peut être très gourmande en CPU, en fonction de la charge.
Symbolisation
Consultez la section Symbolisation dans "Comprendre les rapports HWASan".
HWASan dans les applications
Comme AddressSanitizer, HWASan ne peut pas voir dans le code Java, mais il peut détecter les bugs dans les bibliothèques JNI. Jusqu'à Android 14, l'exécution d'applications HWASan sur un appareil non HWASan n'était pas prise en charge.
Sur un appareil HWASan, il est possible de vérifier les applications avec HWASan en créant leur
avec SANITIZE_TARGET:=hwaddress
dans
Make ou -fsanitize=hwaddress
dans les indicateurs de compilation.
Sur un appareil non HWASan (exécutant Android 14 ou version ultérieure), un paramètre de fichier wrap.sh LD_HWASAN=1
doit être ajouté.
Consultez le
documentation pour les développeurs d'applications
pour en savoir plus.