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