HWAdressAssainisseur

Matériel assistée 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 n'est disponible que sur Android 10 et versions ultérieures, 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 dans 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 pointant directement vers le code responsable.

Vous pouvez flasher les images HWASan de préconstruits aux périphériques pris en charge à partir de pixels ci.android.com ( instructions d'installation détaillées ).

Par rapport à l'ASan classique, HWASan a :

  • Surcharge CPU similaire (~2x)
  • Surcharge de taille de code similaire (40 à 50 %)
  • Frais de RAM beaucoup plus faible (10 % à 35 %)

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

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

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

Détails et limites de la mise en œuvre

HWASan est basé sur le marquage de la mémoire approche, où une petite valeur de la variable aléatoire est associée à la fois avec 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 repose sur ARMv8 fonction haut octets ignorer (TBI), également appelé le marquage 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 Clang.

De par sa conception, HWASan ne dispose pas des zones rouges de taille limitée d'ASan pour détecter les débordements ou de la quarantaine à capacité limitée d'ASan pour détecter l'utilisation après une utilisation gratuite. Pour cette raison, HWASan peut détecter un bogue quelle que soit la taille 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 étiquetés dans les arguments d'appel système. La prise en charge de cela a été implémentée dans les correctifs en amont suivants :

Ces correctifs sont disponibles backports dans la commune Android noyau dans Android 4.14 et les branches supérieures, mais pas dans les branches Android 10 spécifiques tels que android-4,14-q .

Soutien UserSpace pour HWASan est disponible avec Android départ 11.

Si vous construisez avec un ensemble d' outils sur mesure, assurez - vous qu'il comprend tout à LLVM commettre 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. Incrémental construit le travail juste, il n'y a pas des instructions spéciales ou clignotant essuyage nécessaire, executables statiques sont pris en charge, et il est correct de sauter aseptisation de toute autre bibliothèque 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 sauter sanitization d'un module, l' utilisation LOCAL_NOSANITIZE := hwaddress ou sanitize: { hwaddress: false } .

Les modules individuels peuvent être désinfectées avec HWASan, avec la mise en garde que libc est également HWASan-Ified. Cela peut se faire en ajoutant sanitize: { hwaddress: true } à la correspondante Android.bp définition du module. L'ensemble de la plate - forme est construite avec des applications HWASan lors de l' utilisation d' un _hwasan build -suffixed (y compris libc ), et en tant que telle désinfection manuelle libc est pas nécessaire pour HWASan construit.

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 trame dans le code AArch64 par défaut, donc cela fonctionne très bien dans la pratique. Si vous avez besoin pour se détendre par le code managé, définissez HWASAN_OPTIONS=fast_unwind_on_malloc=0 dans l'environnement du processus. Notez que les traces de pile d'accès 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, selon la charge.

Symbolisation

Voir symbolisation dans la documentation Asan.

HWASan dans les applications

Semblable à AddressSanitizer, HWASan ne peut pas voir dans le code Java, mais il peut détecter les bogues dans les bibliothèques JNI. Contrairement à Asan, exécutant HWASan applications sur un dispositif non HWASan ne sera pas supporté.

Sur un périphérique HWASan, les applications peuvent être vérifiées avec HWASan en construisant leur code avec SANITIZE_TARGET:=hwaddress en Marque ou -fsanitize=hwaddress dans les drapeaux du compilateur. Voir la documentation développeur d'applications pour plus de détails.