Песочница приложения

Платформа Android использует преимущества пользовательской защиты Linux для идентификации и изоляции ресурсов приложений. Это изолирует приложения друг от друга и защищает приложения и систему от вредоносных приложений. Для этого Android присваивает каждому приложению Android уникальный идентификатор пользователя (UID) и запускает его в своем собственном процессе.

Android использует UID для настройки изолированной программной среды приложения на уровне ядра. Ядро обеспечивает безопасность между приложениями и системой на уровне процессов с помощью стандартных средств Linux, таких как идентификаторы пользователей и групп, которые назначаются приложениям. По умолчанию приложения не могут взаимодействовать друг с другом и имеют ограниченный доступ к ОС. Если приложение A попытается сделать что-то злонамеренное, например прочитать данные приложения B или набрать номер телефона без разрешения, оно не сможет сделать это, поскольку у него нет соответствующих привилегий пользователя по умолчанию. Песочница проста, поддается аудиту и основана на многолетнем стиле разделения пользователей на процессы и права доступа к файлам в стиле UNIX.

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

Защита

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

Android полагается на ряд средств защиты для принудительной работы изолированной программной среды приложения. Эти меры были введены с течением времени и значительно усилили первоначальную изолированную программную среду дискреционного управления доступом (DAC) на основе UID. Предыдущие выпуски Android включали следующие средства защиты:

  • В Android 5.0 SELinux обеспечил разделение обязательного контроля доступа (MAC) между системой и приложениями. Однако все сторонние приложения работали в одном контексте SELinux, поэтому изоляция между приложениями в первую очередь обеспечивалась с помощью UID DAC.
  • В Android 6.0 песочница SELinux была расширена, чтобы изолировать приложения за пределами физического пользователя. Кроме того, Android также установил более безопасные значения по умолчанию для данных приложения: для приложений с targetSdkVersion >= 24 разрешения DAC по умолчанию для домашнего каталога приложения изменились с 751 на 700. Это обеспечило более безопасное значение по умолчанию для личных данных приложения (хотя приложения могут переопределять эти значения по умолчанию). .
  • В Android 8.0 все приложения были настроены на работу с seccomp-bpf , который ограничивал системные вызовы, которые разрешено использовать приложениям, тем самым укрепляя границу между приложением и ядром.
  • В Android 9 все непривилегированные приложения с targetSdkVersion >= 28 должны работать в отдельных песочницах SELinux, предоставляя MAC для каждого приложения. Эта защита улучшает разделение приложений, предотвращает переопределение безопасных значений по умолчанию и (что наиболее важно) не позволяет приложениям сделать свой мир данных доступным.
  • В Android 10 приложения имеют ограниченное необработанное представление файловой системы без прямого доступа к таким путям, как /sdcard/DCIM. Однако приложения сохраняют полный необработанный доступ к своим путям, относящимся к пакету, которые возвращаются любыми применимыми методами, такими как Context.getExternalFilesDir() .

Рекомендации по обмену файлами

Настройка данных приложения как доступных для всего мира является плохой практикой безопасности. Доступ предоставляется всем, и невозможно ограничить доступ только предполагаемым получателям. Эта практика привела к утечке информации и запутанным уязвимостям помощников, а также является излюбленной мишенью для вредоносных программ, нацеленных на приложения с конфиденциальными данными (например, почтовые клиенты). В Android 9 и более поздних версиях такой способ обмена файлами явно запрещен для приложений с targetSdkVersion>=28 .

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

  • Если вашему приложению необходимо обмениваться файлами с другим приложением, используйте поставщика содержимого . Контент-провайдеры обмениваются данными с надлежащей степенью детализации и без многих недостатков общедоступных разрешений UNIX (подробности см. в разделе Основы контент-провайдеров ).
  • Если в вашем приложении есть файлы, которые действительно должны быть доступны для всего мира (например, фотографии), они должны быть привязаны к носителям (только фотографии, видео и аудиофайлы) и храниться с использованием класса MediaStore . (Подробнее о том, как добавить элемент мультимедиа, см. в разделе Доступ к файлам мультимедиа из общего хранилища .)

Разрешение среды выполнения Storage управляет доступом к строго типизированным коллекциям через MediaStore . Для доступа к слабо типизированным файлам, таким как PDF-файлы и класс MediaStore.Downloads , приложения должны использовать намерения, такие как намерение ACTION_OPEN_DOCUMENT .

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

  • Значение по умолчанию для флага манифеста true для приложений, предназначенных для Android 9 (и более ранних версий).
  • Значение по умолчанию — false для приложений, ориентированных на Android 10. Чтобы временно отказаться от представления отфильтрованного хранилища в приложениях, ориентированных на Android 10, установите для флага манифеста значение true .
  • Используя ограниченные разрешения, установщик добавляет в белый список приложения, разрешенные для хранения вне песочницы. Приложения, не внесенные в белый список, помещаются в песочницу.