Написание привилегированного вспомогательного инструмента с помощью SMJobBless () - PullRequest
25 голосов
/ 04 февраля 2012

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

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

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

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

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

Ответы [ 6 ]

23 голосов
/ 10 февраля 2012

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

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

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

11 голосов
/ 29 марта 2012

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

Натан де Врис отлично справляется с использованием API-интерфейсов XPC с 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

6 голосов
/ 10 декабря 2015

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

README - это одна из лучших (только?) Доступных документов SMJobBless().

4 голосов
/ 01 июля 2012

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

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

4 голосов
/ 10 февраля 2012

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

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

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

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

ИтакВот что я смог найти:

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

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

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

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

HTH

0 голосов
/ 10 февраля 2012

Итай, вы смотрели пример кода 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
...