Запуск приложения OSX с низким уровнем привилегий
У меня есть приложение OSX, над которым я работаю. Это не песочница (это внутреннее приложение, которое делает вещи, которые предотвращают песочницу).
В какой-то момент мое приложение запускает вспомогательное приложение, на самом деле просто приложение командной строки. Я хотел бы иметь возможность лишить это приложение возможности делать что-либо, кроме записи файлов в TMPDIR. Я пытаюсь следовать принципу наименьших привилегий.
Текущий код, который я использую:
NSTask* task = [NSTask new];
NSBundle* thisBundle = [NSBundle mainBundle];
[task setArguments:@[a, b, c]];
[task setLaunchPath:[thisBundle pathForAuxiliaryExecutable:@"MyProgram"]];
[task launch];
Это возможно с NSTask? Если нет, то какие механизмы я могу использовать для запуска MyProgram с очень низкими привилегиями?
1 ответ
Лучший инструмент для этого называется XPC. В 10,7 он был слабоват, но в 10,8 невероятно силен. Вся его цель - позволить вам сегментировать вашу программу таким образом, упрощая IPC. Некоторые документы:
- "Создание служб XPC" в Руководстве по программированию демонов и служб
- NSXPCConnection
- Межпроцессное взаимодействие какао с XPC (сессия WWDC 2012)
- Представляем XPC (сессия WWDC 2011)
- ObjectToXPC - 3-х сторонняя библиотека. Я не играл с ним, но он обещает выполнить маршалинг объектов в 10.7 (см. Ниже, почему маршалинг объектов может быть опасным). Вы также можете просто использовать свой собственный протокол JSON или тому подобное.
Одним из замечательных изменений для XPC в 10.8 является то, что они добавили NSSecureCoding
, Они изменили компилятор, чтобы ввести информацию о классе в определения протокола, чтобы маршалинг объекта можно было сделать более безопасным. Это означает, что когда вы говорите, что протокол ObjC передает NSString
они могут на самом деле проверить, что объект является NSString
, (До 10.8 не было никакой информации о классе в Protocol
объект. Вы можете только проверить, должен ли аргумент быть "объектом".)
Какая разница? Ну, скажи, что я похитил твою задачу с низкими привилегиями и обманул ее, чтобы вернуть NSSomethingElse
а не NSString
(может быть, я просто перезаписать isa
указатель для изменения своего класса). И скажем так NSSomethingElse
имеет length
метод, который делает что-то полезное для меня, как нападающего. Теперь, когда ваша задача с высокими привилегиями вызывает [returnedValue length]
, это будет работать неправильный метод. Альтернативно, может быть NSSomethingElse
не имеет length
метод, так что я могу заставить задачу с высокими привилегиями выдать исключение "не реализует селектор", что также может быть полезно для меня. С NSSecureCoding
Этот вид атаки намного сложнее. Он может проанализировать возвращенный объект, обратите внимание, что это не NSString
и отказываются возвращать его в вызывающий код.
Даже без тонкостей NSXPCConnection
Я рекомендую XPC для такой работы, если вы нацелены на 10.7+.