AddressSanitizer assisté par le matériel

Consultez Comprendre les rapports 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 que ASan, ce qui le rend adapté à la désinfection de l'ensemble du système. 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. 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 à partir de ci.android.com (instructions de configuration détaillées).

Comparé à 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 d'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 qu'un accès à la mémoire soit valide, le pointeur et les balises 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.

Par conception, HWASan ne dispose pas des zones rouges de taille limitée d'ASAN pour détecter les débordements ni de la mise en quarantaine à capacité limitée d'ASAN 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

Les versions récentes (4.14 et ultérieures) du kernel Android commun sont compatibles avec HWAsan dès leur sortie de boîte. 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 effectuez une compilation avec une chaîne d'outils personnalisée, assurez-vous qu'elle inclut tout jusqu'au commit LLVM c336557f.

Utiliser HWASan

Utilisez les commandes suivantes pour compiler l'ensemble de la plate-forme à 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, comme pour aosp_coral_hwasan.

Pour les utilisateurs familiarisés avec AddressSanitizer, la compilation est très 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 la désinfection 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 des cibles individuelles

HWASan peut être activé par cible dans une compilation régulière (non nettoyée), à condition que libc.so soit également nettoyé. Ajout de hwaddress: true au bloc de nettoyage 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.

Flashstation

À des fins de développement, vous pouvez flasher un build d'AOSP compatible avec HWASan sur un appareil Pixel avec un 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, ce qui fonctionne très bien dans la 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. 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 nécessite une utilisation intensive du processeur, 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 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, les applications peuvent être vérifiées avec HWASan en compilant leur code avec SANITIZE_TARGET:=hwaddress dans Make ou -fsanitize=hwaddress dans les indicateurs du compilateur. Sur un appareil autre que HWASan (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.