В этом разделе собраны рекомендации по обеспечению безопасности приложений на устройствах Android.
Обзор исходного кода
Проверка исходного кода может обнаружить широкий спектр проблем безопасности, включая те, которые указаны в этом документе. Android настоятельно рекомендует как ручную, так и автоматическую проверку исходного кода.
- Следуйте подробным рекомендациям по безопасности при проведении проверок, чтобы обеспечить покрытие. Используйте соответствующие внутренние или внешние стандарты для обеспечения последовательных и полных проверок.
- Запустите линтер, например линтер Android Studio , для всего кода приложения с помощью Android SDK и исправьте все выявленные проблемы.
- Анализируйте собственный код с помощью автоматизированного инструмента, который может обнаруживать проблемы с управлением памятью, такие как переполнение буфера и ошибки отклонения на единицу.
- Система сборки Android поддерживает многие дезинфицирующие средства LLVM, такие как AddressSanitizer и UndefineBehaviorSanitizer , которые можно использовать для анализа проблем, связанных с памятью, во время выполнения. В сочетании с фаззингом, поддерживаемым в Android через libFuzzer , дезинфицирующие средства могут выявлять необычные крайние случаи, требующие дальнейшего расследования.
- Опытный оценщик безопасности должен проверить код с повышенным риском, такой как криптография, обработка платежей и обработка личных данных.
Автоматизированное тестирование
Автоматизированное тестирование может помочь обнаружить широкий спектр проблем безопасности, и его следует проводить регулярно.
- Регулярно запускайте последнюю версию CTS на протяжении всего процесса разработки, чтобы обнаружить проблемы на ранней стадии и сократить время на их исправление. Android использует CTS как часть непрерывной интеграции в нашем автоматизированном процессе сборки, который собирается несколько раз в день.
- Автоматизируйте тестирование безопасности интерфейсов, включая тестирование с некорректными входными данными (нечеткое тестирование). Система сборки Android поддерживает libFuzzer для написания нечетких тестов.
Сканирование уязвимостей
Сканирование уязвимостей может помочь гарантировать, что предустановленные приложения не содержат известных уязвимостей безопасности. Расширенное обнаружение может сократить время и затраты, необходимые для устранения этих уязвимостей и предотвращения риска для пользователей и устройств.
- Сканируйте все предустановленные приложения с помощью признанного в отрасли инструмента сканирования уязвимостей приложений и устраняйте обнаруженные уязвимости.
Потенциально опасные приложения
Важно убедиться, что предустановленные приложения на вашем устройстве не являются потенциально опасными приложениями (PHA). Вы несете ответственность за поведение всех приложений, установленных на ваших устройствах. Перед запуском устройства просканируйте все предварительно загруженные приложения на наличие уязвимостей.
Дополнительную информацию о PHA и о том, как Google борется с ними в магазине Play, можно найти в документации для разработчиков Google Play Protect .
Установка приложения и разрешения
Чрезмерные разрешения для предустановленных приложений могут создать угрозу безопасности. Ограничьте предварительно установленные приложения минимально необходимыми разрешениями и убедитесь, что у них нет доступа к ненужным разрешениям или привилегиям. Разрешения приложения описаны в AndroidManifest.xml .
- Не предоставляйте ненужные разрешения или привилегии предварительно установленным приложениям. Тщательно проверяйте приложения с системными привилегиями, поскольку они могут иметь очень конфиденциальные разрешения.
- Убедитесь, что все запрошенные разрешения актуальны и необходимы для функциональности этого конкретного приложения.
- Обеспечьте раскрытие информации пользователям для всех предустановленных приложений, использующих разрешение
INSTALL_PACKAGES
. - Убедитесь, что разработчик по контракту обязан не устанавливать приложения с UID 0.
- Оцените разрешения, заявленные в манифесте всех приложений, которые будут установлены через сеть разработчика.
- Убедитесь, что разработчик по контракту обязан сканировать все URL-адреса загрузки приложений автоматического обновления и установки с помощью Google Safe Browsing API перед отправкой приложений на устройство.
Подписание приложения
Подписи приложений играют важную роль в безопасности устройства и используются для проверки разрешений и обновлений программного обеспечения. При выборе ключа для подписи приложений важно учитывать, будет ли приложение доступно только на одном устройстве или будет доступно на нескольких устройствах.
- Убедитесь, что приложения не подписаны общеизвестным ключом, например ключом разработчика AOSP.
- Убедитесь, что ключи, используемые для подписи приложений, управляются в соответствии со стандартными отраслевыми методами работы с конфиденциальными ключами, включая аппаратный модуль безопасности (HSM), который обеспечивает ограниченный, проверяемый доступ.
- Убедитесь, что приложения не подписаны ключом платформы. Это дает приложению доступ к разрешениям подписи платформы, которые являются очень мощными и предназначены только для использования компонентами операционной системы. Системные приложения должны использовать привилегированные разрешения.
- Убедитесь, что приложения с одинаковым именем пакета не подписаны разными ключами. Это часто происходит при создании приложения для разных устройств, особенно при использовании ключа платформы. Если приложение не зависит от устройства, используйте один и тот же ключ на всех устройствах. Если приложение предназначено для конкретного устройства, создайте уникальные имена пакетов для каждого устройства и ключа.
Изоляция приложений и процессов
Модель песочницы Android обеспечивает дополнительную безопасность приложений и процессов при правильном использовании.
Изолирование корневых процессов
Корневые процессы являются наиболее частой целью атак с целью повышения привилегий; уменьшение количества корневых процессов снижает риск повышения привилегий.
- Убедитесь, что устройства запускают минимально необходимый код от имени пользователя root. По возможности используйте обычный процесс Android, а не корневой процесс. Если процесс должен запускаться на устройстве от имени пользователя root, задокументируйте этот процесс в запросе функции AOSP, чтобы его можно было публично просмотреть.
- Там, где это возможно, корневой код должен быть изолирован от ненадежных данных и доступен через межпроцессное взаимодействие (IPC). Например, сократите функциональность root до небольшой службы, доступной через Binder, и предоставьте службу с разрешением подписи приложению с низкими привилегиями или без них для обработки сетевого трафика.
- Корневые процессы не должны прослушивать сетевой сокет.
- Корневые процессы не должны включать среду выполнения общего назначения, например виртуальную машину Java).
Изоляция системных приложений
Как правило, предустановленные приложения не должны запускаться с общим системным уникальным идентификатором (UID). Если приложению необходимо использовать общий UID системы или другой привилегированной службы (например, телефона), приложение не должно экспортировать какие-либо службы, приемники вещания или поставщики контента, к которым могут получить доступ сторонние приложения, установленные пользователями. .
- Убедитесь, что устройства запускают минимально необходимый код в качестве системы. По возможности используйте процесс Android с собственным UID, а не повторно используйте системный UID.
- По возможности системный код следует изолировать от ненадежных данных и предоставлять IPC только другим доверенным процессам.
- Системные процессы не должны прослушивать сетевой сокет. Это требование CTS.
Изолирующие процессы
Песочница приложений Android обеспечивает приложениям изоляцию от других процессов в системе, включая корневые процессы и отладчики. Если отладка не включена специально приложением и пользователем, ни одно приложение не должно нарушать это ожидание.
- Убедитесь, что корневые процессы не получают доступ к данным в отдельных папках данных приложения, если только не используется документированный метод отладки Android.
- Убедитесь, что корневые процессы не получают доступ к памяти приложений, если только вы не используете документированный метод отладки Android.
- Убедитесь, что на устройствах нет приложений, которые получают доступ к данным или памяти других приложений или процессов.