Небезопасность памяти
Ошибки безопасности памяти, ошибки в работе с памятью на родных языках программирования — наиболее распространенная проблема в кодовых базах Android. На их долю приходится более 60% серьезных уязвимостей безопасности и миллионы видимых пользователями сбоев.
Ошибки безопасности памяти отрицательно влияют на качество и стабильность и являются причиной значительной доли сбоев, наблюдаемых на устройствах конечных пользователей. Таким образом, высокая плотность ошибок безопасности памяти напрямую коррелирует с плохим пользовательским опытом.
Нативный код, написанный на небезопасных для памяти языках, таких как C, C++ и ассемблер, составляет более 70% кода платформы Android и присутствует примерно в 50% приложений Google Play Store.
Учитывая постоянно растущую сложность кода, если оставить их без внимания, количество ошибок безопасности памяти со временем будет увеличиваться. Поэтому предоставление нашей экосистеме инструментов и технологий, которые могут обнаруживать и устранять такие ошибки, имеет решающее значение для нашего долгосрочного успеха.
В течение последних нескольких лет мы тесно сотрудничали с нашими партнерами по аппаратному обеспечению для разработки аппаратных технологий, таких как маркировка памяти руки, и внедрили Rust в кодовую базу Android.
Эти технологии ускорят наш путь к безопасности памяти и помогут всей индустрии программного обеспечения решить ключевую проблемную область.
Ошибки безопасности памяти негативно влияют на качество
Скрытые ошибки безопасности памяти могут привести к недетерминированным результатам в зависимости от состояния системы. Такое непредсказуемое поведение приводит к сбоям и раздражению наших пользователей.
Каждый день мы наблюдаем миллионы собственных сбоев на устройствах конечных пользователей, и с появлением GWP-ASan мы связали большинство из них с ошибками безопасности памяти.
Эти данные подтверждают корреляцию между качеством и плотностью ошибок безопасности памяти и соответствуют наблюдениям наших коллег из Chrome (см . список ошибок Chrome GWP-ASan ).
Ошибки безопасности памяти негативно влияют на безопасность
Ошибки безопасности памяти постоянно вносят основной вклад в уязвимости безопасности Android, начиная с первого выпуска Android.
Хотя отрадно осознавать, что это проблема не только Android (см. статистику Chrome и Microsoft ), нам необходимо делать больше для безопасности наших пользователей.
Команда Project Zero в Google отслеживает эксплойты нулевого дня, которые использовались в реальных атаках на пользователей, как уязвимости нулевого дня. Это не гипотетические ошибки, а эксплойты, активно используемые при атаках на пользователей. Ошибки безопасности памяти (повреждение памяти и использование после освобождения) составляют подавляющее большинство.
Ошибки безопасности памяти увеличивают затраты
Постоянное обновление устройств с помощью исправлений безопасности обеспечивает безопасность наших пользователей, но сопряжено с денежными издержками для нашей экосистемы.
Высокая плотность ошибок безопасности памяти в низкоуровневом коде поставщика, который часто имеет пользовательские модификации, значительно увеличивает затраты на исправление и тестирование. Однако обнаружение этих ошибок на ранних этапах цикла разработки может снизить эти затраты.
Исследования показывают, что более раннее обнаружение ошибок может снизить затраты до шести раз. Однако, учитывая сложность нашей экосистемы, среднее количество кодовых баз, поддерживаемых поставщиком, и постоянно растущую сложность программного обеспечения, экономия может быть выше.
Безопасность памяти
Начиная с Android 12, мы внесли системные изменения, чтобы уменьшить плотность ошибок безопасности памяти в кодовых базах Android. Мы расширяем инструменты безопасности памяти Android и вводим новые требования, которые побуждают нашу экосистему устранять ошибки этой категории. Со временем это должно привести к повышению качества и безопасности для наших пользователей и снижению затрат для наших поставщиков.
Безопасность памяти, вероятно, станет отличительной чертой качества и безопасности в ближайшие годы, и Android планирует стать лидером.
Требования по обеспечению безопасности памяти
Документ определения совместимости Android (CDD) настоятельно рекомендует использовать инструменты безопасности памяти во время разработки.
Мы тесно сотрудничаем с нашей экосистемой, чтобы расширить использование инструментов безопасности памяти и интегрировать их в процессы непрерывной интеграции и тестирования.
Со временем мы хотели бы гарантировать, что каждое устройство пройдет полный запуск пакета тестов совместимости ( CTS ) с использованием инструментов безопасности памяти, который продемонстрирует, что таких ошибок обнаружено не было. Например, платформы Arm v9 должны будут обеспечить запуск CTS с включенной маркировкой памяти, тогда как платформы Arm v8 должны будут обеспечить запуск CTS с использованием HWASAN и KASAN.
Rust как новый язык программирования для кода платформы
В Android 12 Rust стал языком платформы . Rust обеспечивает безопасность памяти и потоков на уровне производительности, аналогичном C/C++. Мы ожидаем, что Rust станет предпочтительным выбором для большинства новых собственных проектов. Однако переписать весь небезопасный код памяти, который в настоящее время составляет более 70% кода платформы Android, на Rust невозможно. В будущем Rust будет дополнять инструменты безопасности памяти.
Инструменты безопасности памяти
Android поддерживает широкий спектр инструментов, которые помогают обнаруживать ошибки безопасности памяти. На рисунке ниже представлена классификация доступных инструментов безопасности памяти Android.
Наш инструментарий охватывает широкий спектр сценариев и целей развертывания. В следующей документации описывается каждый инструмент и приведены инструкции по его использованию в ваших продуктах.