Безопасность памяти

На этой странице описаны ошибки безопасности памяти и соответствующие инструменты.

Небезопасная память

Ошибки в обработке памяти, возникающие в нативных языках программирования, являются наиболее распространенной проблемой в коде Android. На их долю приходится более 60% серьезных уязвимостей безопасности и миллионы видимых пользователям сбоев.

Ошибки в обеспечении безопасности памяти влияют на пользовательский опыт, затраты и безопасность.

Рисунок 1. Ошибки безопасности памяти и их негативное влияние на качество, безопасность и стоимость.

Ошибки в обеспечении безопасности памяти негативно влияют на качество и стабильность работы и являются причиной значительной доли сбоев, наблюдаемых на устройствах конечных пользователей. Следовательно, высокая плотность ошибок в обеспечении безопасности памяти напрямую коррелирует с плохим пользовательским опытом.
Нативный код, написанный на языках, небезопасных для работы с памятью, таких как C, C++ и ассемблер, составляет более 70% кода платформы Android и присутствует примерно в 50% приложений в Google Play Store.
Учитывая постоянно растущую сложность кода, если не принимать меры, количество ошибок, связанных с безопасностью памяти, будет со временем увеличиваться. Поэтому предоставление нашей экосистеме инструментов и технологий, способных обнаруживать и устранять такие ошибки, имеет решающее значение для нашего долгосрочного успеха.
В течение последних нескольких лет мы тесно сотрудничали с нашими партнерами по аппаратному обеспечению для разработки таких аппаратных технологий, как маркировка памяти Arm, и внедрили Rust в кодовую базу Android.
Эти технологии ускорят наш путь к обеспечению безопасности памяти и помогут всей индустрии программного обеспечения решить ключевую проблему.

Ошибки, связанные с безопасностью памяти, негативно влияют на качество.

Скрытые ошибки безопасности памяти могут приводить к непредсказуемым результатам в зависимости от состояния системы. Такое непредсказуемое поведение вызывает сбои и доставляет неудобства нашим пользователям.

Ежедневно мы наблюдаем миллионы сбоев в работе нативных приложений на устройствах конечных пользователей, и с появлением GWP-ASan мы выяснили, что большинство из них связаны с ошибками безопасности памяти.
Этот показатель подтверждает корреляцию между качеством и плотностью ошибок, связанных с безопасностью памяти, и согласуется с наблюдениями наших коллег из Chrome (см. список ошибок Chrome GWP-ASan ).

Ошибки, влияющие на безопасность памяти, негативно сказываются на безопасности.

Уязвимости в памяти неизменно являются основной причиной уязвимостей безопасности Android, начиная с самого первого выпуска Android.

Уязвимости, связанные с безопасностью памяти, негативно влияют на безопасность.

Рисунок 2. Вклад ошибок безопасности памяти в возникновение уязвимостей Android.

Хотя обнадеживает тот факт, что это проблема не только Android (см. статистику Chrome и Microsoft ), нам необходимо предпринять больше мер для обеспечения безопасности наших пользователей.
Команда Project Zero в Google отслеживает уязвимости нулевого дня, которые использовались в реальных атаках против пользователей. Это не гипотетические ошибки, а уязвимости, активно используемые в атаках против пользователей. Подавляющее большинство составляют ошибки, связанные с безопасностью памяти (повреждение памяти и использование памяти после освобождения).

Уязвимости, влияющие на безопасность памяти, увеличивают затраты.

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

Высокая концентрация ошибок безопасности памяти в низкоуровневом коде сторонних разработчиков, который часто содержит собственные модификации, значительно увеличивает затраты на исправление и тестирование. Однако обнаружение этих ошибок на ранних этапах разработки может снизить эти затраты.

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

Безопасность памяти

В Android 12 и более поздних версиях внесены системные изменения, направленные на снижение количества ошибок, связанных с безопасностью памяти, в коде Android. Мы расширяем инструменты обеспечения безопасности памяти Android и вводим новые требования, которые побуждают нашу экосистему устранять ошибки этой категории. Со временем это должно привести к повышению качества и безопасности для наших пользователей, а также к снижению затрат для наших поставщиков.

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

Требования в поддержку безопасности памяти

В документе Android Compatibility Definition Document (CDD) настоятельно рекомендуется использовать инструменты обеспечения безопасности памяти во время разработки.

Мы тесно сотрудничаем с нашей экосистемой, чтобы расширить использование инструментов обеспечения безопасности памяти и интегрировать их в процессы непрерывной интеграции и тестирования.

Со временем мы хотели бы убедиться, что каждое устройство проходит полный цикл тестирования совместимости ( CTS ) с использованием инструментов обеспечения безопасности памяти, подтверждающий отсутствие подобных ошибок. Например, от платформ Arm v9 потребуется предоставить результаты CTS с включенной маркировкой памяти, а от платформ Arm v8 — результаты CTS с использованием HWASAN и KASAN.

Rust как новый язык программирования для платформенного кода

В Android 12 был представлен Rust как платформенный язык . Rust обеспечивает безопасность памяти и потоков на уровне производительности, сопоставимом с C/C++. Мы ожидаем, что Rust станет предпочтительным выбором для большинства новых нативных проектов. Однако переписать весь небезопасный для памяти код, который в настоящее время составляет более 70% кода платформы Android, на Rust нецелесообразно. В дальнейшем Rust будет дополнять инструменты обеспечения безопасности памяти.

инструменты для защиты памяти

Android поддерживает широкий спектр инструментов, помогающих обнаруживать ошибки, связанные с безопасностью памяти. На рисунке ниже представлена ​​классификация доступных инструментов Android для обеспечения безопасности памяти.

Уязвимости, связанные с безопасностью памяти, негативно влияют на безопасность.

Рисунок 3. Обзор инструментов обеспечения безопасности памяти в Android.

Наши инструменты охватывают широкий спектр сценариев развертывания и целевых платформ. Документация в этом разделе описывает каждый инструмент и предоставляет справочную информацию по их использованию в ваших продуктах.