HWAddressSanitizer

Hardware-assisted AddressSanitizer (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 uniquement sur le matériel AArch64.

Bien que principalement utile pour le code C/C++, HWASan peut également aider à déboguer le code Java qui provoque des plantages en C/C++ utilisé pour implémenter les interfaces Java. C'est utile car il détecte les erreurs de mémoire lorsqu'elles se produisent, vous dirigeant directement vers le code responsable.

Vous pouvez flasher des images HWASan prédéfinies sur les appareils Pixel pris en charge à partir de ci.android.com ( instructions de configuration détaillées ).

Par rapport à l'ASan classique, HWASan a :

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

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

  • Débordement/débordement de tampon de pile et de tas
  • Utilisation du tas après la libération
  • Utilisation de la pile en dehors du champ d'application
  • Double libre/sauvage libre

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

Détails et limitations de la mise en œuvre

HWASan est basé sur l'approche d' étiquetage en mémoire , où une petite valeur d'étiquette aléatoire est associée à la fois à des pointeurs et à des plages d'adresses 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 l'étiquette 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 n'a pas les zones rouges de taille limitée d'ASan pour détecter les débordements ou la quarantaine à 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é désalloué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 lors d'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 rétroportages 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'à la validation LLVM c336557f .

Utilisation de HWASan

Utilisez les commandes suivantes pour créer l'intégralité 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, similaire à aosp_coral_hwasan .

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

Pour ignorer la désinfection d'un module, utilisez LOCAL_NOSANITIZE := hwaddress ou sanitize sanitize: { hwaddress: false } .

Les modules individuels peuvent être nettoyés avec HWASan, avec la mise en garde que 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 construit avec HWASan lors de l'utilisation d'une version avec le _hwasan (y compris libc ), et en tant que telle, la désinfection manuelle de libc n'est pas nécessaire pour les versions 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 et de désallocation de mémoire dans le programme. Android active les pointeurs de cadre dans le code AArch64 par défaut, donc cela fonctionne très bien dans la pratique. Si vous avez besoin de vous détendre via du code managé, définissez HWASAN_OPTIONS=fast_unwind_on_malloc=0 dans l'environnement de processus. Notez que les mauvaises traces de pile d'accès mémoire 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, selon 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 les bogues dans les bibliothèques JNI. Contrairement à ASan, l'exécution d'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 drapeaux du compilateur. Consultez la documentation du développeur d'applications pour plus de détails.