Тестовая среда приложения подробно

Механизмы управления доступом, используемые Тестовой средой приложения для защиты пользовательских данных, являются небольшими в числе и простыми понять. Но определенные шаги для Вас для взятия, поскольку Вы принимаете Тестовую среду приложения, уникальны для Вашего приложения. Для определения, каковы те шаги необходимо понять ключевые понятия для этой технологии.

Потребность в последней строке защиты

Вы защищаете свое приложение от атаки из вредоносного программного обеспечения следующим методы, рекомендуемые в Безопасном Руководстве по Кодированию. Но несмотря на Ваши максимальные усилия для создания неуязвимого барьера — путем предотвращения переполнения буфера и других повреждений памяти предотвращения воздействия пользовательских данных и устранения других уязвимостей — приложение может быть использовано вредоносным кодом. Атакующий должен только найти единственную дыру в Вашей обороноспособности, или в любой из платформ и библиотек, против которых Вы соединяетесь, для получения контроля над взаимодействиями приложения с системой.

Тестовая среда приложения разработана для противостояния этому заголовку сценария на, позволив Вам описать намеченные взаимодействия Вашего приложения с системой. Система тогда предоставляет Вашему приложению только доступ, Ваше приложение должно было сделать свое задание. Если вредоносный код получает контроль над должным образом поигравшим в песочнице приложением, это оставляют с доступом к только файлам и ресурсам в песочнице приложения.

Для успешного принятия Тестовой среды приложения используйте различное мышление, чем Вы могли бы быть приучены к, как предложено в Таблице 2-1.

Таблица 2-1  мышление Тестовой среды приложения

При разработке …

При принятии Тестовой среды приложения …

Добавьте опции

Минимизируйте использование системного ресурса

Используйте в своих интересах доступ всюду по своему приложению

Функциональность раздела, затем не доверьте каждой части

Используйте самый удобный API

Используйте самый безопасный API

Ограничения представления как ограничения

Ограничения представления как гарантии

При разработке для Тестовой среды приложения Вы планируете следующий худший вариант: Несмотря на Ваши максимальные усилия, вредоносный код нарушает непреднамеренную дыру в системе безопасности — или в Вашем коде или в платформе, против которой Вы соединились. Возможности, которые Вы добавили к своему приложению, становятся возможностями враждебного кода. Помните это, поскольку Вы читаете остальную часть этого документа.

Права и доступ системного ресурса

Не поигравшееся в песочнице приложение имеет доступ ко всем доступным для пользователя системным ресурсам — включая встроенную камеру и микрофон, сетевые сокеты, печать и большую часть файловой системы. Если успешно атаковано вредоносным кодом, такое приложение может вести себя как враждебный агент со всесторонним потенциалом для причинения вреда.

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

Одно специальное право — Включает Игру в песочнице Приложения — включает Тестовую среду приложения. Когда Вы позволяете играть в песочнице, XCode создает a .entitlements файл списка свойств и показывает его в навигаторе проекта.

Если Ваше приложение требует возможности, запросите его путем добавления соответствующего права на проект XCode использование вкладки Summary целевого редактора. Если Вы не требуете возможности, заботитесь для не включения соответствующего права.

Вы запрашиваете права на основе цели целью. Если Ваше приложение имеет единую цель — главное приложение — Вы запрашиваете права только на ту цель. При разработке приложения для использования главного приложения вместе с помощниками (в форме служб XPC), Вы запрашиваете права индивидуально, и как надлежащие, для каждой цели. Вы узнаете больше об этом во Внешних Инструментах, XPC Services и Разделении Полномочия.

Можно потребовать управления с более прекрасными зернами правами приложения, чем доступно в цели XCode редактор. Например, Вы могли бы запросить право временного исключения, потому что Тестовая среда приложения не поддерживает возможность Ваши потребности приложения, такие как возможность отправить событие Apple в приложение, еще не предоставляющее группам доступа сценариев. Для работы с правами временного исключения используйте редактора списка свойств XCode для редактирования цели .entitlements файл списка свойств непосредственно.

Права Тестовой среды приложения OS X описаны во Включении Тестовой среды приложения в Дающей право Ключевой Ссылке. Для сквозного контроля запроса права для цели в проекте XCode посмотрите Быстрый запуск Тестовой среды приложения.

Контейнерные каталоги и доступ к файловой системе

При принятии Тестовой среды приложения приложение имеет доступ к следующим расположениям:

Эти политики детализированы далее в следующих разделах.

Каталог контейнера тестовой среды приложения

Каталог контейнера тестовой среды приложения имеет следующие характеристики:

  • Это расположено в системном определенном тракте в корневом каталоге пользователя. Когда Ваше приложение вызывает, в поигравшем в песочнице приложении возвращается этот путь NSHomeDirectory функция.

  • Ваше приложение имеет неограниченный доступ для чтения-записи к контейнеру и его подкаталогам.

  • Новаторский APIs OS X (выше уровня POSIX) относится к расположениям, которые являются определенными для Вашего приложения.

    Большая часть этого новаторского APIs относится к расположениям относительно контейнера Вашего приложения. Например, контейнер включает частное лицо Library каталог (указанный NSLibraryDirectory постоянный путь поиска) для использования только Вашим приложением, с частным лицом Application Support и Preferences подкаталоги.

    Используя Ваш контейнер для файлов поддержки не требует никакого изменения кода (от версии перед песочницей Вашего приложения), но может потребовать разовой миграции, как объяснено в Миграции Приложения к Песочнице.

    Некоторый новаторский APIs (выше уровня POSIX) относится к специфичным для приложения расположениям за пределами корневого каталога пользователя. В поигравшем в песочнице приложении, например, NSTemporaryDirectory функция обеспечивает путь к каталогу, который является за пределами корневого каталога пользователя, но определенный для Вашего приложения и в Вашей песочнице; у Вас есть неограниченный доступ для чтения-записи к нему для текущего пользователя. Поведение этого новаторского APIs соответственно приведено в соответствие с Тестовой средой приложения, и никакое изменение кода не необходимо.

  • OS X устанавливает и осуществляет соединение между Вашим приложением и его контейнером посредством подписи кода Вашего приложения.

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

    Для приложения стиля обувной коробки, в котором Вы обеспечиваете единственный пользовательский интерфейс для содержания пользователя, то содержание входит в контейнер, и Ваше приложение имеет полный доступ к нему.

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

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

Каталог контейнера группы приложений

В дополнение к на контейнеры приложения, в OS X v10.7.5 и в OS X v10.8.3 и позже, приложение может использовать com.apple.security.application-groups право, чтобы запросить доступ к совместно используемому контейнеру, который характерен для многократных приложений, произведенных той же группой разработчиков. Этот контейнер предназначается для содержания, которое не является направлением пользователя, таким как совместно использованные кэши или базы данных.

Эти контейнеры группы автоматически добавляются в контейнер песочницы каждого приложения, как определено существованием этих ключей и сохранены в ~/Library/Group Containers/<application-group-id>, где <application-group-id> имя группы. Само название группы должно начаться с Вашей группы разработчиков ID, сопровождаемый периодом.

Начинаясь в OS X v10.8.3, Ваше приложение может получить путь к контейнерам группы путем вызова containerURLForSecurityApplicationGroupIdentifier: метод NSFileManager.

Для получения дополнительной информации посмотрите Добавление Приложения на Группу приложений в Дающей право Ключевой Ссылке.

Блок питания и доступ к файловой системе за пределами Вашего контейнера

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

  • В определенном направлении пользователя

  • При помощи прав для определенных расположений файловой системы (описанный в Правах и Доступе Системного ресурса)

  • Когда местоположение файловой системы находится в определенных каталогах, которые являются читаемым миром

Технологию безопасности OS X, взаимодействующую с пользователем для расширения песочницы, вызывают Блоком питания. Блок питания не имеет никакого API. Когда Вы используете, Ваше приложение использует Блок питания прозрачно NSOpenPanel и NSSavePanel классы. Вы включаете Блок питания путем установки права с помощью XCode, как описано во Включении Выбранного пользователями File Access in Entitlement Key Reference.

При вызове Open или диалогового окна Save из поигравшего в песочнице приложения появляющееся окно представлено не AppKit, а Блоком питания. Используя Блок питания является автоматическим, когда Вы принимаете Тестовую среду приложения — это не требует никакого изменения кода от версии перед песочницей Вашего приложения. Вспомогательный панели, которые Вы реализовали для открытия или сохранения, искренне представляются и используются.

Преимущество безопасности, предоставленное Блоком питания, - то, что им нельзя управлять программно — в частности, нет никакого механизма для враждебного кода для использования Блока питания для доступа к файловой системе. Только пользователь, путем взаимодействия с Открытым и Сохраняет диалоговые окна через Блок питания, может использовать те диалоговые окна для достижения частей файловой системы за пределами ранее установленной песочницы. Например, если пользователь сохраняет новый документ, Блок питания разворачивает Вашу песочницу для предоставления доступа для чтения-записи приложения к документу.

Когда пользователь Вашего приложения указывает, что они хотят использовать файл или папку, система добавляет связанный путь к песочнице Вашего приложения. Скажите, например, пользователь перетаскивает ~/Documents папка на мозаику Прикрепления Вашего приложения (или на значок Finder Вашего приложения, или в открытое окно Вашего приложения), таким образом указывая они хотят использовать ту папку. В ответ система делает ~/Documents папка, ее содержание и ее подпапки, доступные Вашему приложению.

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

Кроме того, система автоматически разрешает поигравшее в песочнице приложение к:

  • Соединитесь с системными методами ввода

  • Вызовите службы, выбранные пользователем из меню Services (только те службы, отмеченные как «безопасные» поставщиком услуг, доступны поигравшему в песочнице приложению),

  • Открытые файлы, выбранные пользователем из меню Open Recent

  • Участвуйте с другими приложениями посредством вызванной пользователями копии и вставки

  • Считайте файлы, которые являются читаемым миром, в определенных каталогах, включая следующие каталоги:

    • / стеллаж

    • /sbin

    • /usr/bin

    • /usr/lib

    • /usr/sbin

    • /usr/share

    • / Система

  • Считайте и запишите файлы в каталогах, создаваемых путем вызова NSTemporaryDirectory.

После того, как пользователь указал файл, который они хотят использовать, тот файл в песочнице Вашего приложения. Если Ваше приложение используется вредоносным кодом, файл тогда уязвим для атаки: Тестовая среда приложения не обеспечивает защиты. Для обеспечивания защиты для файлов в песочнице следуйте рекомендациям в Безопасном Руководстве по Кодированию.

По умолчанию файлы открыли или сохранили пользователем, остаются в Вашей песочнице, пока Ваше приложение не завершается, за исключением файлов, которые были открыты в то время, когда завершается Ваше приложение. Такие файлы вновь открывают автоматически посредством функции OS X Resume в следующий раз Ваши запуски приложения и автоматически добавляются назад к песочнице Вашего приложения.

Обеспечить персистентный доступ к ресурсам расположилось за пределами Вашего контейнера в пути, не зависящем от Резюме, использующем ограниченные по объему безопасностью закладки, как объяснено в Ограниченных по объему безопасностью Закладках и Персистентном Доступе Ресурса.

Связанные элементы

Связанная функция элементов Тестовой среды приложения позволяет Вашим файлам доступа к приложениям, имеющим то же имя как выбранный пользователями файл, но различное расширение. Эта функция состоит из двух частей: список связанных расширений в приложении Info.plist файл и код для сообщения песочницы, что Вы делаете.

Существует два общих сценария, где это целесообразно:

  • Сценарий 1:

    Ваше приложение должно быть в состоянии сохранить файл с различным расширением, чем тот из исходного файла. Например, когда Вы вставляете изображение в файл RTF в TextEdit и сохраняете его, TextEdit изменяет расширение файла от .rtf к .rtfd (и это становится каталогом).

    Для обработки этой ситуации необходимо использовать NSFileCoordinator возразите для координирования доступа к файлу. Перед переименованием файла вызовите itemAtURL:willMoveToURL: метод. После переименования файла вызовите itemAtURL:didMoveToURL: метод.

  • Сценарий 2:

    Ваше приложение должно быть в состоянии открыть или сохранить многократные связанные файлы с тем же именем и различными расширениями (например, автоматически открыть файл подзаголовка с тем же именем как файл ролика или допускать файл журнала SQLite).

    Для получения доступа к тому вторичному файлу создайте класс, соответствующий NSFilePresenter протокол. Этот объект должен обеспечить URL основного файла как primaryPresentedItemURL свойство, и должно обеспечить URL вторичного файла как presentedItemURL свойство.

    После того, как пользователь открывает основной файл, Ваш объект предъявителя файла должен вызвать addFilePresenter: метод класса для NSFileCoordinator класс для регистрации себя.

В обоих сценариях необходимо сделать мелочь приложения Info.plist файл. Ваше приложение должно уже объявить Типы документов (CFBundleDocumentTypes) массив, объявляющий типы файлов Ваше приложение, может открыться.

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

Для узнавания больше о предъявителях файла и координаторах файла считайте Руководство по программированию Файловой системы.

Откройте и сохраните диалоговое поведение с тестовой средой приложения

Бесспорный NSOpenPanel и NSSavePanel когда Тестовая среда приложения включена для Вашего приложения, методы ведут себя по-другому:

Кроме того, эффективный, путь наследования во время выполнения для NSOpenPanel и NSSavePanel классы отличаются с Тестовой средой приложения, как проиллюстрировано в Таблице 2-2.

  Открытая таблица 2-2 и Сохраняет наследование классов с Тестовой средой приложения

Без тестовой среды приложения

NSOpenPanel: NSSavePanel: NSPanel: NSWindow: NSResponder: NSObject

С тестовой средой приложения

NSOpenPanel: NSSavePanel: NSObject

Из-за этого различия во время выполнения, NSOpenPanel или NSSavePanel объект наследовал меньше методов с Тестовой средой приложения. При попытке отправить сообщение в NSOpenPanel или NSSavePanel объект и тот метод определяются в NSPanel, NSWindow, или NSResponder классы, система повышает исключение. Компилятор XCode не выпускает предупреждение или ошибку предупредить Вас к этому поведению во время выполнения.

Ограниченные по объему безопасностью закладки и персистентный доступ ресурса

Доступ Вашего приложения к расположениям файловой системы за пределами ее контейнера — столь же предоставленный Вашему приложению посредством пользовательского намерения, такой как через Блок питания — автоматически не сохраняется через запуски приложения или системные перезапуски. Когда Ваше приложение вновь открывается, необходимо запустить. (Одно исключение к этому для файлов, открытых в то время, когда Ваше приложение завершается, которые остаются в Вашей песочнице благодаря функции OS X Resume).

Запускаясь в OS X v10.7.3, можно сохранить доступ к ресурсам файловой системы путем использования механизма защиты, известного как ограниченные по объему безопасностью закладки, который сохраняет пользовательское намерение. Вот несколько примеров функций приложения, которые могут получить преимущества от этого:

Два отличных типа ограниченной по объему безопасностью закладки

Ограниченные по объему безопасностью закладки, доступный запуск в OS X v10.7.3, поддерживают два отличных варианта использования:

  • Ограниченная по объему приложением закладка предоставляет Вашему поигравшему в песочнице приложению персистентный доступ к указанному пользователями файлу или папке.

    Например, если Ваше приложение использует папку загрузки или обработки, которая является за пределами контейнера приложения, получите начальный доступ путем представления NSOpenPanel диалоговое окно для получения намерения пользователя использовать определенную папку. Затем создайте ограниченную по объему приложением закладку для той папки и сохраните ее как часть конфигурации приложения (возможно, в файле списка свойств или использовании NSUserDefaults класс). С ограниченной по объему приложением закладкой Ваше приложение может получить будущий доступ к папке.

  • Ограниченная по объему документом закладка предоставляет определенному документу персистентный доступ к файлу.

    Например, приложение редактирования видео обычно поддерживает понятие документа проекта, который относится к другим файлам и нужен в персистентном доступе к тем файлам. Такой документ проекта может сохранить ограниченные по объему безопасностью закладки к файлам, к которым он относится.

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

    Ограниченная по объему документом закладка может быть разрешена любым приложением, имеющим доступ к самим данным закладки и к документу, которому принадлежит закладка. Это поддерживает мобильность, позволяя пользователю, например, отправить документ другому пользователю; безопасные закладки документа остаются применимыми для получателя. Документ может быть единственным плоским файлом или пакетом, содержащим многократные файлы.

    Ограниченная по объему документом закладка может указать только на файл, не папку, и только на файл, который не находится в расположении, используемом системой (такой как /private или /Library).

Используя ограниченные по объему безопасностью закладки

Использовать любой тип ограниченной по объему безопасностью закладки требует, чтобы Вы выполнили пять шагов:

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

    Сделайте это один раз на цель как часть конфигурирования Вашего проекта XCode.

  2. Создайте ограниченную по объему безопасностью закладку.

    Сделайте это, когда пользователь указал намерение (такой как через Блок питания) для использования ресурса файловой системы за пределами контейнера приложения, и Вы хотите сохранить возможность своего приложения получить доступ к ресурсу.

  3. Разрешите ограниченную по объему безопасностью закладку.

    Сделайте это, когда для Вашего приложения позже (например, после перезапуска приложения) нужен доступ к ресурсу, Вы отметили на шаге 2. Результатом этого шага является ограниченный по объему безопасностью URL.

  4. Явно укажите, что Вы хотите использовать ресурс файловой системы, URL которого Вы получили на шаге 3.

    Сделайте это сразу после получения ограниченного по объему безопасностью URL (или, когда Вы позже захотите возвратить доступ к ресурсу, оставив Ваш доступ к нему).

  5. Сделано с помощью ресурса, явно укажите, что Вы хотите прекратить использовать его.

    Сделайте это, как только Вы знаете, что Вам больше не нужен доступ к ресурсу (обычно после закрытия его).

    После отказа от доступа к ресурсу файловой системы для использования того ресурса снова необходимо возвратиться к шагу 4 (чтобы снова указать, что Вы хотите использовать ресурс).

    Если Ваше приложение повторно запускается, необходимо возвратиться к шагу 3 (для разрешения ограниченной по объему безопасностью закладки).

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

  • Для использования ограниченных по объему приложением закладок в цели установите com.apple.security.files.bookmarks.app-scope дающее право значение к true.

  • Для использования ограниченных по объему документом закладок в цели установите com.apple.security.files.bookmarks.document-scope дающее право значение к true.

Можно запросить или или оба из этих прав в цели по мере необходимости. Эти права являются доступным запуском в OS X v10.7.3 и описаны во Включении Ограниченной по объему безопасностью Закладки и Доступа через URL.

С надлежащими правами можно создать ограниченную по объему безопасностью закладку путем вызова bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error: метод NSURL класс.

Когда Вы позже нуждаетесь в доступе к отмеченному ресурсу, разрешаете его ограниченную по объему безопасностью закладку путем вызова URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error: метод NSURL класс.

В поигравшем в песочнице приложении Вы не можете получить доступ к ресурсу файловой системы, на который ограниченный по объему безопасностью URL указывает на то, пока Вы не вызываете startAccessingSecurityScopedResource метод на URL.

Когда Вам больше не нужен доступ к ресурсу, что Вы получили объем безопасности использования (обычно после закрытия ресурса), необходимо вызвать stopAccessingSecurityScopedResource метод на URL ресурса.

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

Для подробных описаний методов константы и права для использования для реализации ограниченных по объему безопасностью закладок в приложении, читают Ссылку класса NSURL и читают Включающую Ограниченную по объему безопасностью Закладку и Доступ через URL в Дающей право Ключевой Ссылке.

Тестовая среда приложения и подписывание кода

После того, как Вы включите Тестовую среду приложения и укажете другие права для цели в Вашем проекте XCode, Вы должны элемент кода проект. Примите во внимание различие между тем, как Вы устанавливаете права и как Вы устанавливаете идентификационные данные подписывания кода:

Необходимо выполнить подписывание кода, потому что права (включая специальное право, включающее Тестовую среду приложения) встроены в подпись кода приложения. С другой точки зрения приложение без знака не поигралось в песочнице и имеет только права по умолчанию, независимо от настроек, Вы применили в цели XCode редактора.

OS X осуществляет связь между контейнером приложения и подписью кода приложения. Это важное средство защиты гарантирует, что никакое другое поигравшее в песочнице приложение не может получить доступ к Вашему контейнеру. Механизм работает следующим образом:

  1. Когда система создает контейнер для приложения, она устанавливает список управления доступом (ACL) на том контейнере. Начальный элемент списка управления доступом в том списке содержит Designated Requirement (DR) приложения, которое является частью подписи приложения, описывающей, как могут быть распознаны будущие версии приложения.

  2. Каждый раз приложение с тем же пакетом запуски ID, система проверяет, что подпись кода приложения соответствует определяемые требования, указанные в одной из записей в ACL контейнера. Если система не находит соответствие, она препятствует тому, чтобы запустилось приложение.

Осуществление OS X контейнерной целостности влияет на Ваш цикл разработки и распределения. Это вызвано тем, что, в ходе создания и распределения приложения, приложение является поставленными использующими различными подписями кода. Вот то, как работает процесс:

  1. Перед созданием проекта Вы получаете три сертификата для подписывания кода из Apple: сертификат разработки, сертификат распределения, и (дополнительно) Разработчик сертификат ID. (Чтобы изучить, как получить эти сертификаты для подписывания кода, считайте Руководство по Распределению приложений.)

    Когда используется в сочетании с соответствующими закрытыми ключами от Вашей цепочки для ключей, эти сертификаты формируются три, разделяют цифровые идентификационные данные. Для разработки и тестирования, Вы подписываете свое приложение с Вашими идентификационными данными разработки. При представлении версии App Store Вы используете свои идентификационные данные распределения. Если Вы распределяете версию вне App Store, Вы используете своего Разработчика идентификационные данные ID.

  2. Когда App Store Mac распределяет Ваше приложение, он подписывается с подписью кода Apple.

Для тестирования и отладки, можно хотеть выполнить обе версии приложения: версия Вы подписываетесь и версия знаки Apple. Но OS X видит подписанную версию Apple Вашего приложения как злоумышленник и не позволит ему запускаться: Его подпись кода не соответствует тот, ожидаемый существующим контейнером Вашего приложения.

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

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

Решение состоит в том, чтобы скорректировать список управления доступом (ACL) на контейнере Вашего приложения для распознавания подписанной версии Apple приложения. В частности Вы добавляете определяемое требование кода подписанной версии Apple Вашего приложения к ACL контейнера приложения.

bullet
Скорректировать ACL для распознавания подписанной версии Apple приложения
  1. Откройте Terminal (в /Applications/Utilities).

  2. Откройте окно Finder, содержащее подписанную версию Apple Вашего приложения.

  3. В Терминале введите следующую команду:

    asctl container acl add -file <path/to/app>

    Вместо <path/to/app> заполнитель, замените путем к подписанной версии Apple Вашего приложения. Вместо того, чтобы вручную ввести путь, можно перетащить значок Finder приложения к Окну терминала.

ACL контейнера теперь включает определяемые требования кода для обеих версий Вашего приложения. OS X тогда позволяет Вам выполнять любую версию своего приложения.

Можно использовать этот тот же метод для совместного использования контейнера между (1) версия приложения, которое Вы первоначально подписали с идентификационными данными разработки, такими как тот, который Вы использовали в Быстром запуске Тестовой среды приложения, и (2) выпущенная версия, загруженная с App Store Mac.

Можно просмотреть список требований кода в ACL контейнера. Например, после добавления определяемого требования кода для подписанной версии Apple Вашего приложения, можно подтвердить, что ACL контейнера перечисляет два допустимых требования кода.

bullet
Вывести на экран список требований кода в ACL контейнера
  1. Откройте Terminal (в /Applications/Utilities).

  2. В Терминале введите следующую команду:

    asctl container acl list -bundle <container name>

    Вместо <container name> заполнитель, замените именем контейнерного каталога своего приложения. (Имя контейнерного каталога Вашего приложения обычно является тем же как идентификатором пакета Вашего приложения.)

Для получения дополнительной информации о работе со списками управления доступом контейнера Тестовой среды приложения и их требованиями кода, считайте страницу справочника для asctl (Управление тестовой средой приложения) инструмент.

Внешние инструменты, службы XPC и разделение полномочия

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

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

Разделы ниже объясняют эти понятия более подробно.

XPC Services

XPC является технологией межпроцессного взаимодействия OS X что Тестовая среда приложения дополнений путем включения разделения полномочия. Разделение полномочия, в свою очередь, стратегия развития, в которой Вы делите приложение на части согласно доступу системного ресурса, в котором нуждается каждая часть. Части компонента, которые Вы создаете, вызывают службами XPC.

Вы создаете службу XPC как отдельную цель в Вашем проекте XCode. Каждая служба получает свою собственную песочницу — в частности, это получает свой собственный контейнер и свой собственный набор прав.

Кроме того, служба XPC, которую Вы включаете со своим приложением, доступна только Вашим приложением. Эти преимущества составляют в целом создание XPC лучшая технология для реализации разделения полномочия в приложении OS X.

В отличие от этого, дочерний процесс, создаваемый при помощи posix_spawn функция, путем вызова fork и exec (обескураженный), или при помощи NSTask класс просто наследовал песочницу процесса, создавшего его. Вы не можете сконфигурировать права дочернего процесса. По этим причинам дочерние процессы не обеспечивают эффективное разделение полномочия.

Использовать XPC с Тестовой средой приложения:

  • Присудите минимальные полномочия к каждой службе XPC, согласно ее потребностям.

  • Разработайте передачу данных между главным приложением и каждой службой XPC, чтобы быть безопасными.

  • Структурируйте пакет своего приложения соответственно.

Жизненным циклом службы XPC и ее интеграцией с Grand Central Dispatch (GCD), управляет полностью система. Для получения этой поддержки необходимо только структурировать пакет приложения правильно.

Для больше на XPC, посмотрите Creating XPC Services в Руководстве по программированию Демонов и Служб.

Запускающиеся помощники с запускают услуги

Если по крайней мере одному из этих условий удовлетворили, поигравшему в песочнице приложению позволяют запустить использование помощника Launch Services:

  • И приложение и помощник передают оценку Привратника. По умолчанию это означает, что оба подписываются App Store Mac или с Разработчиком ID.

  • Приложение установлено в /Applications и комплект приложений и все содержание принадлежат корню.

  • Помощник был (вручную) выполнен, по крайней мере, один раз пользователем.

Если ни одному из этих условий не удовлетворили, Вы будете видеть ошибки как следующее:

  • «Не позволяя процессу 19920 запускать '/Applications/Main.app/Contents/Resources/Helper.app', потому что был отклонен вердикт оценки безопасности».

    Это сообщение означает, что была отклонена оценка Привратника. Можно подтвердить это с spctl инструмент следующим образом:

    $ spctl --assess -vvvv /Applications/Main.app/
     
    /Applications/Main.app/: rejected
    origin=Mac Developer: Developer Name
     
    $ spctl --assess -vvvv /Applications/Main.app/Contents/Resources/Helper.app/
     
    /Applications/Main.app/Contents/Resources/Helper.app/: rejected
    origin=Mac Developer: Developer Name
  • «Приложение «Помощник» не могло быть запущено, потому что это повреждено».

    «Работа не могла быть завершена. (Ошибка OSStatus-10827.)»

    Это - типичная ошибка, если ни одно из вышеупомянутых условий не было выполнено.

Результатами является то же, используете ли Вы Launch Services непосредственно (путем вызова LSOpenCFURLRef, например) или косвенно (путем вызова launchApplicationAtURL:options:configuration:error: метод в NSWorkspace, например).

Кроме того, на отказ, в OS X v10.7.5 и ранее, Вы будете также видеть поддельное deny file-write-data /Applications/Main.app/Contents/Resources/Helper.app нарушение песочницы. Эта ошибка не оказывает функционального влияния и может быть проигнорирована.

IPC и семафоры POSIX и общая память

Обычно, поигравшие в песочнице приложения не могут использовать Маха IPC, семафоры POSIX и общая память или сокеты домена UNIX (полезно). Однако путем указания права, запрашивающего членство в группе приложений, приложение может использовать эти технологии для передачи с другими элементами той группы приложений.

Сокеты домена UNIX являются прямыми; они работают точно так же, как любой другой файл.

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

Например, если имя Вашей группы приложений Z123456789.com.example.app-group, Вы могли бы создать два названные семафора Z123456789.myappgroup/rdyllwflg и Z123456789.myappgroup/bluwhtflg. Вы могли бы создать названный порт Маха Z123456789.com.example.app-group.Port_of_Kobe.

Для узнавания больше о группах приложений считайте Каталог Контейнера Группы приложений, тогда считайте Добавление Приложения на Группу приложений в Дающей право Ключевой Ссылке.