Android поддерживает несколько инструментов для отладки ошибок памяти. Для каждого из них есть свои компромиссы, поэтому читайте ниже, чтобы решить, какой из них лучше всего подходит для вашего случая использования. Этот документ дает вам обзор доступных инструментов, чтобы вы могли решить, какие из них исследовать дальше, но он стремится быть кратким, поэтому читайте документацию по конкретным инструментам для получения подробной информации.
вкратце
- По возможности используйте безопасный для памяти язык , чтобы исключить ошибки памяти.
- Всегда используйте PAC/BTI для смягчения атак ROP/JOP
- Всегда используйте GWP-ASan для обнаружения редких ошибок памяти в производстве
- Используйте HWASan для обнаружения ошибок памяти во время тестирования
- Устройства с поддержкой MTE обычно не доступны . Это не поможет, пока это не изменится
- Используйте ASan во время тестирования только в крайнем случае.
Безопасные для памяти языки
Безопасный для памяти язык — единственный способ полностью избежать и смягчить ошибки памяти. Другие инструменты на этой странице могут помочь вам сделать ваш небезопасный для памяти код более безопасным и надежным, но использование безопасного для памяти языка устраняет весь класс проблем.
Официально поддерживаемые языки безопасной памяти для Android — Java и Kotlin. Большинство приложений для Android проще разрабатывать на одном из этих языков.
Тем не менее, есть разработчики приложений, поставляющие код, написанный на Rust, и если вы читаете эту страницу, у вас, вероятно, есть веская причина нуждаться в нативном коде (переносимость, производительность или и то, и другое). Rust — лучший выбор для безопасного для памяти нативного кода на Android. Команда NDK не обязательно сможет помочь вам с проблемами, с которыми вы столкнетесь, если вы пойдете по этому пути, но нам интересно услышать о них !
ПАК/БТИ
Pointer Authentication и Branch Target Identification , также известные как PAC/BTI, являются инструментами смягчения, подходящими для использования в производстве. Хотя это отдельные технологии, они контролируются одним и тем же флагом компилятора, поэтому всегда используются вместе.
Эти функции обратно совместимы с устройствами, которые их не поддерживают, поскольку новые инструкции, используемые в более ранних устройствах, не являются операциями. Также необходимо иметь достаточно новое ядро и достаточно новую версию ОС. Поиск paca
и bti
в /proc/cpuinfo
покажет вам, есть ли у вас достаточно новое оборудование и достаточно новое ядро. Android 12 (API 31) имеет необходимую поддержку пользовательского пространства.
Плюсы:
- Может быть включен во всех сборках, не вызывая проблем на старых устройствах или ядрах (но убедитесь, что вы действительно протестировали на комбинации устройство/ядро/ОС, которая поддерживает это!)
Минусы:
- Доступно только для 64-битных приложений.
- Не устраняет ошибки на устройствах, которые его не поддерживают.
- 1% накладных расходов на размер кода
GWP-Асан
GWP-ASan можно использовать для обнаружения ошибок памяти в полевых условиях, однако частота дискретизации слишком низкая, чтобы обеспечить эффективное смягчение последствий.
Плюсы:
- Отсутствие значительных затрат ресурсов ЦП и памяти.
- Простота развертывания: не требует перекомпиляции собственного кода
- Работает для 32-битных приложений
Минусы:
- Низкая частота выборки требует большого количества пользователей для эффективного поиска ошибок.
- Обнаруживает только ошибки кучи, но не ошибки стека
HWASan
Аппаратный санитайзер адресов , также известный как HWASan, лучше всего подходит для обнаружения ошибок памяти во время тестирования. Он наиболее полезен при использовании с автоматизированным тестированием, особенно если вы проводите fuzz-тесты, но в зависимости от потребностей производительности вашего приложения он также может быть полезен на высокопроизводительных телефонах в условиях тестирования.
Плюсы:
- Ложных срабатываний нет
- Обнаруживает дополнительные классы ошибок, которые ASan не может обнаружить (использование стека после возврата)
- Более низкий уровень ложноотрицательных результатов, чем у MTE (1 из 256 против 1 из 16)
- Меньше затрат памяти, чем у ASan, его ближайшей альтернативы
Минусы:
- Значительные накладные расходы на ЦП (~100%), размер кода (~50%) и память (10% - 35%)
- До API 34 и NDK r26 требуется прошивка образа, совместимого с HWASan
- Работает только в 64-битных приложениях.
МТЕ
Расширение тегирования памяти , также известное как MTE, является более дешевой альтернативой HWASan. Помимо возможностей отладки и тестирования, его можно использовать для обнаружения и устранения повреждений памяти в производстве. Если у вас есть оборудование для тестирования сборок MTE , вам следует включить его.
Плюсы:
- Достаточно низкие накладные расходы, приемлемые для многих приложений в производстве
- Ложных срабатываний нет
- Не требует перестройки кода для обнаружения ошибок кучи (но требует для обнаружения ошибок стека)
Минусы:
- В 2024 году на рынке не будет устройств с включенной по умолчанию функцией MTE, но в документации Arm объясняется , как включить MTE для тестирования на Pixel 8/Pixel 8 Pro .
- Ложноотрицательный результат 1 из 16 против 1 из 256 у HWASan
- Доступно только для 64-битных приложений.
- Требуется создание отдельных библиотек для устройств с поддержкой и без поддержки MTE.
Асан
Address Sanitizer , также известный как ASan, является старейшим и наиболее широко доступным из имеющихся инструментов. Он полезен для обнаружения ошибок памяти во время тестирования и отладки проблем, которые затрагивают только старые устройства, где другие инструменты недоступны. По возможности отдавайте предпочтение HWASan.
Плюсы:
- Широко доступно. Может работать на устройствах, начиная с KitKat
- Никаких ложных срабатываний или ложных отрицательных результатов при правильном использовании.
Минусы:
- Трудно правильно собрать и упаковать
- Наибольшие накладные расходы среди всех вариантов: ~100% ЦП, ~50% размер кода, ~100% использование памяти
- Больше не поддерживается
- Известные ошибки, которые не будут исправлены.