HWAddressSanitizer

Аппаратная поддержка AddressSanitizer (HWASan) является инструментом обнаружения ошибок памяти похож на AddressSanitizer . HWASan использует намного меньше оперативной памяти по сравнению с ASan, что делает его пригодным для очистки всей системы. HWASan доступен только на Android 10 и выше и только на оборудовании AArch64.

Хотя HWASan в первую очередь полезен для кода C / C ++, он также может помочь отладить код Java, который вызывает сбои в C / C ++, используемом для реализации интерфейсов Java. Это полезно, потому что обнаруживает ошибки памяти, когда они случаются, указывая вам непосредственно на ответственный код.

Вы можете прошить прекомпилированную HWASan изображений для поддерживаемых устройств Pixel от ci.android.com ( подробные инструкции по установке ).

По сравнению с классическим ASan, HWASan имеет:

  • Аналогичные накладные расходы процессора (~ 2x)
  • Накладные расходы аналогичного размера кода (40-50%)
  • Намного меньшие накладные расходы на ОЗУ (10% - 35%)

HWASan обнаруживает тот же набор ошибок, что и ASan:

  • Переполнение / недостаточное заполнение буфера стека и кучи
  • Использование кучи после бесплатного
  • Использование стека вне рамок
  • Двойной бесплатный / дикий бесплатно

Кроме того, HWASan обнаруживает использование стека после возврата.

Детали реализации и ограничения

HWASan основан на мечения памяти подхода, где небольшое случайное значение тега , связанный как с указателями и с диапазонами адресов памяти. Чтобы доступ к памяти был действительным, должны совпадать указатель и теги памяти. HWASan полагается на ARMv8 функция верхнего байта игнорировать (TBI), также называемый виртуальный адрес мечения, чтобы хранить указатель метки в высших битах адреса.

Вы можете прочитать больше о дизайне HWASan на сайте документации Clang.

По замыслу HWASan не имеет красных зон ограниченного размера ASan для обнаружения переполнения или карантина ASan с ограниченной емкостью для обнаружения использования после освобождения. По этой причине HWASan может обнаружить ошибку независимо от того, насколько велико переполнение или как давно была освобождена память. Это дает HWASan большое преимущество перед ASan.

Однако HWASan имеет ограниченное количество возможных значений тегов (256), что означает, что вероятность пропуска какой-либо ошибки во время одного выполнения программы составляет 0,4%.

Требования

HWASan требует, чтобы ядро ​​Linux принимало помеченные указатели в аргументах системного вызова. Поддержка этого была реализована в следующих наборах исправлений апстрима:

Эти участки доступны как Backports в Common Android ядра в Android-4,14 и более высокие ветви, но не в Android 10 конкретных отраслей , таких как андроид-4,14-ц .

Поддержка для HWASan пространства пользователя доступен , начиная с Android 11.

Если вы строите с помощью пользовательского набора инструментов, убедитесь , что он включает в себя все до LLVM совершить c336557f .

Использование HWASan

Используйте следующие команды для создания всей платформы с помощью HWASan:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

Для удобства, вы можете добавить параметр SANITIZE_TARGET к определению продукта, подобно aosp_coral_hwasan .

В отличие от ASan, с HWASan нет необходимости строить дважды. Инкрементальный строит только работу, не существует специальное мигание инструкции или протирание требования, статические исполняемые файлы поддерживаются, и это нормально , чтобы пропустить дезинфекцию любой библиотеки, кроме libc . Также не требуется, чтобы в случае дезинфекции библиотеки любой исполняемый файл, который ссылается на нее, также должен быть дезинфицирован.

Для того, чтобы пропустить дезинфекцию модуля, использование LOCAL_NOSANITIZE := hwaddress или sanitize: { hwaddress: false } .

Отдельные модули могут быть продезинфицировать с HWASan, с той оговоркой , что libc также HWASan маньяков. Это может быть сделано путем добавления sanitize: { hwaddress: true } к соответствующему Android.bp определения модуля. Вся Android платформа построена HWASan при использовании _hwasan -suffixed сборки ( в том числе libc ), и как таковая вручную дезинфицировать libc не является необходимой для HWASan сборки.

Лучшая трассировка стека

HWASan использует быстрый разматыватель на основе указателя кадров для записи трассировки стека для каждого события выделения и освобождения памяти в программе. Android по умолчанию включает указатели кадров в коде AArch64, поэтому на практике это отлично работает. Если вам нужно , чтобы расслабиться с помощью управляемого кода, установите HWASAN_OPTIONS=fast_unwind_on_malloc=0 в среде процесса. Обратите внимание, что трассировки стека плохого доступа к памяти по умолчанию используют «медленный» разматыватель; этот параметр влияет только на трассировки выделения и освобождения. Этот вариант может быть очень интенсивным для ЦП в зависимости от нагрузки.

Символизация

См символизации в Асан документации.

HWASan в приложениях

Подобно AddressSanitizer, HWASan не может видеть код Java, но может обнаруживать ошибки в библиотеках JNI. В отличие от асан, работает HWASan приложения на устройстве , не HWASan не поддерживается.

На устройстве HWASan, приложения могут быть проверены с HWASan построив свой код с SANITIZE_TARGET:=hwaddress в Make или -fsanitize=hwaddress флагами компилятора. Смотрите документацию для разработчиков приложений для получения более подробной информации.