AddressSanitizer avec assistance matérielle

<ph type="x-smartling-placeholder"></ph> Voir Comprendre HWASan pour savoir comment lire les plantages HWASan.

L'outil AddressSanitizer (HWASan) assisté par matériel est une erreur de mémoire. un outil de détection semblable à AddressSanitizer. HWASan utilise beaucoup moins de RAM qu'ASan, ce qui le rend adapté aux le nettoyage du système entier. HWASan n'est disponible que sur Android 10 et versions ultérieures, et uniquement sur le 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. Elle est utile, car elle capture la mémoire des erreurs lorsqu’elles se produisent, vous pointant 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 (identique à ASan) est compatible avec UBSan peuvent être activés sur une cible en même temps.

Détails et limites de l'implémentation

HWASan s'appuie sur mémoire de taggage, dans laquelle une petite valeur aléatoire de balise est associée à la fois avec des pointeurs et avec 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.

Vous pouvez en savoir plus sur la conception de HWASan sur 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. C'est pourquoi HWASan peut détecter un bug quelle que soit la taille du débordement ou l'ancienneté de la mémoire désaffectées. 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.

Les espaces utilisateur sont compatibles avec HWASan à 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é est disponible dans les ensembles de correctifs en amont suivants:

Si vous compilez à l'aide d'une chaîne d'outils personnalisée, assurez-vous qu'elle inclut tous les éléments jusqu'au commit de 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 familiarisés avec AddressSanitizer, la compilation devient beaucoup plus complexe:

  • Inutile d'exécuter la commande "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 été supprimées:

  • 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 les données de 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 sur lequel HWASan n'a pas été activé si le mauvais accès à la mémoire 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ée à 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. Consultez le Documentation du NDK pour HWASan pour les développeurs d'applications.

Améliorer les 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, ce qui fonctionne 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 la pile d'accès à la mémoire est incorrecte. les traces utilisent l'opérateur le dérouleur par défaut. ce paramètre ne concerne des traces d'allocation et de désallocation. Cette option peut être très d'utilisation intensive du processeur, en fonction de la charge.

Symbolisation

Voir 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, exécution de HWASan applications sur un appareil autre que HWASan n'était pas compatible.

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 autre que HWASan (sous 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.