Рекомендации по обеспечению безопасности приложений

В этом разделе содержатся рекомендации по обеспечению безопасности приложений на устройствах Android.

Обзор исходного кода

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

  • Следуйте комплексным рекомендациям по безопасности при проведении проверок, чтобы обеспечить охват. Используйте соответствующие внутренние и внешние стандарты для обеспечения единообразия и полноты проверок.
  • Запустите linter, например Android Studio linter , для всего кода приложения, использующего Android SDK, и исправьте все выявленные проблемы.
  • Анализируйте собственный код с помощью автоматизированного инструмента, который может обнаружить проблемы управления памятью, такие как переполнение буфера и ошибки на единицу.
  • Система сборки Android поддерживает множество санитайзеров LLVM, таких как AddressSanitizer и UndefinedBehaviorSanitizer , которые можно использовать для анализа проблем, связанных с памятью, во время выполнения. В сочетании с фаззингом, поддерживаемым в Android посредством libFuzzer , санитайзеры могут выявлять необычные пограничные случаи, требующие дальнейшего изучения.
  • Квалифицированный оценщик безопасности должен проверить код с более высоким уровнем риска, например, код шифрования, обработки платежей и обработки персональных данных.

Автоматизированное тестирование

Автоматизированное тестирование может помочь обнаружить широкий спектр проблем безопасности и должно проводиться регулярно.

  • Регулярно запускайте последнюю версию CTS на протяжении всего процесса разработки, чтобы выявлять проблемы на ранних этапах и сокращать время их устранения. Android использует CTS как часть непрерывной интеграции в нашем автоматизированном процессе сборки, который выполняется несколько раз в день.
  • Автоматизируйте тестирование безопасности интерфейсов, включая тестирование с некорректными входными данными (тестирование методом нечёткого тестирования). Система сборки Android поддерживает libFuzzer для написания тестов методом нечёткого тестирования.

Сканирование уязвимостей

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

  • Сканируйте все предустановленные приложения с помощью признанного в отрасли инструмента сканирования уязвимостей приложений и устраняйте обнаруженные уязвимости.

Потенциально опасные приложения

Важно убедиться, что предустановленные приложения на вашем устройстве не являются потенциально вредоносными (PHA). Вы несёте ответственность за поведение всех приложений, установленных на ваших устройствах. Перед запуском устройства проверьте все предустановленные приложения на наличие уязвимостей.

Дополнительную информацию о потенциально вредоносных программах (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 обеспечивает приложениям ожидание изоляции от других процессов в системе, включая корневые процессы и отладчики. Если отладка не включена приложением и пользователем специально, ни одно приложение не должно нарушать это ожидание.

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