Répondez à notre enquête sur la convivialité pour améliorer ce site.
Cette page a été traduite par l'API Cloud Translation.
Switch to English

HWAddressSanitizer

AddressSanitizer assisté par matériel (HWASan) est un outil de détection d'erreur de mémoire similaire à AddressSanitizer . HWASan utilise beaucoup moins de RAM que ASan, ce qui le rend adapté à la désinfection de l'ensemble du système. HWASan est uniquement disponible sur Android 10 et supérieur, et sur le matériel AArch64. Vous pouvez flasher des images HWASan prédéfinies sur des appareils Pixel pris en charge à partir de ci.android.com ( instructions de configuration détaillées ).

Comparé à ASan classique, HWASan a:

  • Supplément CPU similaire (~ 2x)
  • Frais généraux de taille de code similaire (40 à 50%)
  • Surcharge RAM beaucoup plus petite (10% - 35%)

HWASan détecte le même ensemble de bogues que ASan:

  • Dépassement / sous-dépassement de la mémoire tampon de la pile et du tas
  • Utilisation du tas après la gratuité
  • Utilisation de la pile en dehors de la portée
  • Double libre / sauvage gratuit

En outre, HWASan détecte l'utilisation de la pile après le retour.

Détails de mise en œuvre et limites

HWASan est basé sur l'approche de marquage de la mémoire , où une petite valeur de balise aléatoire est associée à la fois à des pointeurs et à des plages d'adresses de mémoire. Pour qu'un accès mémoire soit valide, le pointeur et les balises mémoire doivent correspondre. HWASan s'appuie sur la fonctionnalité ARMv8 top byte ignore (TBI), également appelée étiquetage d'adresse virtuelle , pour stocker la balise de pointeur dans les 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.

De par sa conception, HWASan ne dispose pas des redzones de taille limitée d'ASan pour détecter les débordements ou de la quarantaine de capacité limitée d'ASan pour détecter l'utilisation après la libération. Pour cette raison, HWASan peut détecter un bogue quelle que soit l'ampleur du débordement ou depuis combien de temps la mémoire a été libérée. Cela donne à HWASan un gros avantage 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 bogue pendant une exécution du programme.

Conditions

HWASan nécessite que le noyau Linux accepte les pointeurs balisés dans les arguments d'appel système. La prise en charge de cela a été implémentée dans les ensembles de correctifs en amont suivants:

Ces correctifs sont disponibles en tant que backports dans le noyau Android commun dans les branches android-4.14 et supérieures, mais pas dans les branches spécifiques à Android 10 telles que android-4.14-q .

La prise en charge de l'espace utilisateur pour HWASan est disponible à partir d' Android 11 .

Si vous construisez avec une chaîne d'outils personnalisée, assurez-vous qu'elle inclut tout jusqu'au commit LLVM c336557f .

Utilisation de HWASan

Utilisez les commandes suivantes pour créer la plate-forme entière à 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 .

Contrairement à ASan, avec HWASan, il n'est pas nécessaire de construire deux fois. Les compilations incrémentielles fonctionnent, il n'y a pas d'instructions clignotantes spéciales ou d'exigence d'effacement, les exécutables statiques sont pris en charge et il est normal d'ignorer le nettoyage de toute bibliothèque autre que la libc . Il n'est pas non plus obligatoire que si une bibliothèque est nettoyée, tout exécutable qui y est lié doit également être nettoyé.

Pour ignorer le nettoyage d'un module, utilisez LOCAL_NOSANITIZE := hwaddress ou LOCAL_NOSANITIZE := hwaddress sanitize: { hwaddress: false } .

Les modules individuels peuvent être nettoyés avec HWASan, avec la mise en garde que la libc est également HWASan-ified. Cela peut être fait en ajoutant sanitize: { hwaddress: true } à la définition de module Android.bp respective. L'ensemble de la plate-forme Android est construite avec HWASan lors de l'utilisation d'une _hwasan _hwasan (y compris la libc ), et en tant que telle, la désinfection manuelle de la libc n'est pas nécessaire pour les versions de HWASan.

Meilleures traces de pile

HWASan utilise un dérouleur rapide basé sur un pointeur de trame pour enregistrer une trace de pile pour chaque événement d'allocation de mémoire et de désallocation dans le programme. Android active les pointeurs de trame dans le code AArch64 par défaut, cela fonctionne donc très bien dans la pratique. Si vous devez vous dérouler via du code géré, définissez HWASAN_OPTIONS=fast_unwind_on_malloc=0 dans l'environnement de processus. Notez que les traces de pile d'accès à la mémoire incorrectes utilisent le dérouleur "lent" par défaut; ce paramètre affecte uniquement les traces d'allocation et de désallocation. Cette option peut être très gourmande en CPU, en fonction de la charge.

Symbolisation

Voir Symbolisation dans la documentation ASan.

HWASan dans les applications

Semblable à AddressSanitizer, HWASan ne peut pas voir le code Java, mais il peut détecter des bogues dans les bibliothèques JNI. Contrairement à ASan, l'exécution des applications HWASan sur un appareil non HWASan n'est pas prise en charge.

Sur un appareil HWASan, les applications peuvent être vérifiées avec HWASan en créant leur code avec SANITIZE_TARGET:=hwaddress dans Make, ou -fsanitize=hwaddress dans les indicateurs du compilateur. Consultez la documentation destinée aux développeurs d'applications pour plus de détails.