Подтвердить что ты не робот

Написание привилегированного вспомогательного инструмента с помощью SMJobBless()

Несмотря на то, что API был открыт с Mac OS X Leopard, неожиданно и, к сожалению, очень мало документации о том, как правильно использовать SMJobBless() для создания привилегированных вспомогательных инструментов. Есть много ошибок, даже при копировании кода непосредственно из образца Apple. К счастью, я нашел свой путь вокруг этого и стал основой для моего вспомогательного инструмента.

Однако, казалось бы, SMJobBless() только благословляет инструмент и копирует его, но не запускает его. Я включил код в свой вспомогательный инструмент main(), который должен выполняться, но не (поскольку NSLog() необъяснимо не работает - в соответствии с крошечным битом информации, которую я нашел - я пробовал syslog() некоторые строки типа "Hello world", но на системной консоли ничего не отображается). Нет никаких указаний на то, что вспомогательный инструмент запускается вообще.
Документация в основном бесполезна. Он просто говорит, что после вызова SMJobBless() вспомогательный инструмент "готов", без указания того, что означает "ready" even.

Кроме того, образец Apple не содержит кода взаимодействия между процессами и не объясняет, как взаимодействовать с вспомогательным инструментом. Используете ли вы распределенные объекты? Мах портов? Кто знает? Там нет официального слова о том, как это сделать.

Итак, есть ли у кого-нибудь информация о том, как это сделать? Я подтвердил, что инструмент-помощник установлен, и работает проверка подлинности, но я просто не могу понять, как запустить вспомогательный инструмент и обмениваться с ним - там просто такой пробел в документации, что это загадка на данный момент. Это очень расстраивает; Я не могу быть единственным с этой проблемой (но об этом нигде не упоминается), а SMJobBless() явно работает как-то, так как это использует Apple.

(Пожалуйста, не упоминайте AuthorizationExecuteWithPrivileges(). Я не использую его: он устарел, обязательно уйдет, и это серьезное отверстие безопасности. Нет, спасибо.)

4b9b3361

Ответ 1

XPC не подходит, если вы пытаетесь повысить привилегии (из https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html):

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

SMJobBless установит вспомогательный инструмент и зарегистрирует его в Launchd, как в примере SMJobBless, предоставленном Apple. Хитрость в том, чтобы заставить ваш вспомогательный инструмент запускаться на самом деле - просто попытаться подключиться к объявленным сервисам вашего вспомогательного инструмента.

Был пример WWDC2010 под названием ssd который демонстрировал простую модель клиент/сервер запуска через сокеты. Это больше не доступно от Apple, но я нашел ссылку здесь: https://lists.apple.com/archives/macnetworkprog/2011/Jul/msg00005.html

Я включил обработку очереди отправки в код сервера из примера ssd в вспомогательный инструмент в примере SMJobBless и могу подтвердить, что мой вспомогательный инструмент действительно работает (как root), когда мое основное приложение пытается подключиться к соответствующему порту. Посмотрите видео WWDC2010 о Launchd, чтобы понять другие механизмы, с помощью которых вы можете общаться с вашим вспомогательным инструментом (кроме сокетов).

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

Изменить: Вот пример проекта, который я написал, который использует распределенный объект для связи между приложением и помощником: https://www.dropbox.com/s/5kjl8koyqzvszrl/Elevator.zip

Ответ 2

На самом деле комментарий @KurtRevis прав, вы можете использовать API XPC без использования служб XPC, и он идеально подходит для работы с тех пор.

Nathan de Vries имеет отличную запись об использовании XPC API с SMJobBless и даже модифицировал приложение примера SMJobBless, чтобы использовать mach XPC для активации задания и для двунаправленной связи:

http://atnan.com/blog/2012/02/29/modern-privileged-helper-tools-using-smjobbless-plus-xpc/

https://github.com/atnan/SMJobBlessXPC

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

http://www.cocoabuilder.com/archive/cocoa/309298-question-about-smjobbless.html

Если вы не хотите пробираться по потоку, вот ссылка на модифицированный образец проекта SMJobBless, предоставленный Эриком Горром:

http://ericgorr.net/cocoadev/SMJobBless.zip

Также обратите внимание, что пример ssd, упомянутый в других ответах, по-прежнему доступен онлайн от Apple в составе пакета загрузки WWDC 2010:

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

Ответ 3

Apple now (2015) имеет "EvenBetterAuthorizationSample", которая демонстрирует установку привилегированного вспомогательного инструмента и использование API NSXPCConnection для связи между приложением и вспомогательным инструментом:

README является одной из лучших (только?) документации SMJobBless().

Ответ 4

Я чувствую твою боль и пребываю в одной лодке. Я отвечаю за версию Mac для приложения, которое должно выполнять различные задачи настройки системы. Конечно, некоторые из этих задач должны быть выполнены с правами администратора. Я начал с использования кода примера из BetterAuthorizationSample. Это была серьезная боль, но, похоже, она работала. Но затем столкнулся с ситуациями, когда он рухнул на некоторые системы. Я не понимал всего, что сделал код BAS, и мое собственное отсутствие опыта кодирования, вероятно, способствовало возникновению проблем. Поэтому мне пришлось удалить эти привилегированные функции из моего приложения.

Apple, похоже, не заботится о нехватке документации. См. это сообщение от создателя инфраструктуры ServiceManagement. Из его комментариев я предполагаю, что XPC - это "интуитивная замена", на которую он ссылается, но поскольку он доступен только на Lion, вам все равно придется найти другое решение для Snow Leopard или более ранних клиентов. Мне также непонятно, может ли XPC использоваться для привилегированных помощников (задачи системного уровня, требующие доступа администратора или root), или просто предназначен для разделения полномочий в вашем собственном приложении, чтобы сделать его более безопасным.

Документация BAS отчаянно нуждается в обновлении, но также не является главным приоритетом.

Теперь я пытаюсь переписать свое приложение с нуля. Профессиональный Cocoa Безопасность приложений от Graham Lee дает некоторое представление о том, как использовать привилегированные помощники с SMJobBless, но не вдаваясь в подробности о доступ по запросу к рабочим заданиям.

Итак, вот что мне удалось найти:

Если вы хотите запустить свой привилегированный помощник по требованию, вам придется использовать сокет IPC. Вы должны добавить запись сокетов вашему помощнику launchd.plist. После установки приложения с помощью SMJobBless помощник должен будет "зарегистрироваться" с помощью launchd (через LAUNCH_KEY_CHECKIN), чтобы получить дескрипторы файла сокета.

К сожалению, единственные упоминания LAUNCH_KEY_CHECKIN, по-видимому, находятся в SampleD и BAS.

У меня нет опыта с сокетами, так что мой дорожный блок в данный момент. Я хотел бы использовать API самого высокого уровня, который я могу, поэтому я пытаюсь выяснить, могу ли я использовать любые классы Objective-C для этого (например, NSStream).

Вы можете найти список рассылки разработчиков. Еще один вариант XPC, о котором я только что узнал, XPCKit. Это стоит посмотреть.

НТН

Ответ 5

Я написал сообщение в блоге об этом несколько месяцев назад, в которое была включена чистая версия примера Apple SMJobBless. Может помочь...

http://www.bornsleepy.com/bornsleepy/os-x-helper-applications

Ответ 6

Иначе вы посмотрели пример кода SMJobBless от WWDC 2010? Он включает вспомогательный инструмент и приложение, чтобы благословить его.

https://developer.apple.com/library/mac/#samplecode/SMJobBless/Listings/ReadMe_txt.html#//apple_ref/doc/uid/DTS40010071-ReadMe_txt-DontLinkElementID_3

В файле README говорится:

Этот образец в его нынешнем виде фактически не запускает вспомогательный инструмент. Следующие примеры показывают, как [sic] задание запуска и настроить межпроцессное общение:

  • ssd (похоже, он больше не подключен к сети. Был частью образца кода WWDC 2010.)
  • BetterAuthorizationSample