Запуск приложения 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 в 10.8 является то, что они добавили NSSecureCoding, Они изменили компилятор, чтобы ввести информацию о классе в определения протокола, чтобы маршалинг объекта можно было сделать более безопасным. Это означает, что когда вы говорите, что протокол ObjC передает NSStringони могут на самом деле проверить, что объект является NSString, (До 10.8 не было никакой информации о классе в Protocol объект. Вы можете только проверить, должен ли аргумент быть "объектом".)

Какая разница? Ну, скажи, что я похитил твою задачу с низкими привилегиями и обманул ее, чтобы вернуть NSSomethingElse а не NSString (может быть, я просто перезаписать isa указатель для изменения своего класса). И скажем так NSSomethingElse имеет length метод, который делает что-то полезное для меня, как нападающего. Теперь, когда ваша задача с высокими привилегиями вызывает [returnedValue length], это будет работать неправильный метод. Альтернативно, может быть NSSomethingElse не имеет length метод, так что я могу заставить задачу с высокими привилегиями выдать исключение "не реализует селектор", что также может быть полезно для меня. С NSSecureCodingЭтот вид атаки намного сложнее. Он может проанализировать возвращенный объект, обратите внимание, что это не NSStringи отказываются возвращать его в вызывающий код.

Даже без тонкостей NSXPCConnectionЯ рекомендую XPC для такой работы, если вы нацелены на 10.7+.

Другие вопросы по тегам