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