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

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

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

Поскольку Application Sandbox находится в ядре, эта модель безопасности распространяется как на собственный код, так и на приложения ОС. Все программное обеспечение выше ядра, такое как библиотеки ОС, фреймворк приложения, среда выполнения приложения и все приложения, запускаются в Application Sandbox. На некоторых платформах разработчики ограничены определенным фреймворком разработки, набором 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 .
  • Используя ограниченные разрешения, установщик добавляет в список разрешенных приложений неизолированное хранилище. Неизолированные приложения помещаются в песочницу.