Я делаю небольшое приложение, которое удаляет файлы журналов. Я использую экземпляр NSTask, который запускает rm и srm (secure rm) для удаления файлов.
Я хочу иметь возможность удалять файлы в:
Проблема в том, что учетная запись пользователя не имеет разрешений на доступ к некоторым файлам в папке системной библиотеки, например к подпапке журналов Adobe и другим. Например, только «системный» пользователь (группа?) Имеет права чтения / записи для папки журналов Adobe и ее содержимого, а текущий пользователь даже не имеет записи в разрешениях, отображаемых в окне «Получить информацию» для папки. .
То, что я хочу делать именно так:
Я использую NSTask, потому что он предлагает уведомления о задачах завершение, получение вывода текста из самой задачи и т. д. Нужно ли мне использовать что-то еще? Если да, то как я могу воспроизвести уведомления о завершении NSTask и дескриптор выходного файла при запуске rm и srm с правами администратора?
Я ищу наиболее безопасный способ справиться с ситуацией. то есть я не хочу, чтобы мое приложение становилось дверью для атак с повышением привилегий.
Я просмотрел Руководство по программированию служб авторизации, но не уверен, какой случай подходит. Сначала я подумал, что AuthorizationExecuteWithPrivileges
было бы хорошей идеей, но после прочтения дополнительной информации по этой теме похоже, что этот метод не рекомендуется по соображениям безопасности.
Подробный ответ будет очень кстати. Я уверен, что некоторым из вас уже приходилось делать что-то подобное, и у них есть некоторый код и знания, которыми можно поделиться.
Заранее спасибо!
Обновление:
Теперь я могу открыть диалоговое окно аутентификации и получить привилегии, например:
OSStatus status;
AuthorizationRef authRef;
status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
AuthorizationRights authRights;
AuthorizationItem authItems[1];
authItems[0].name = kAuthorizationRightExecute;
authRights.count = sizeof(authItems) / sizeof(authItems[0]);
authRights.items = authItems;
AuthorizationFlags authFlags = kAuthorizationFlagDefaults | kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed;
status = AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags, NULL);
На первый взгляд кажется, что метод "Factored Application" выглядит наиболее подходящим. Дело в том, что мне rm уже кажется внешним вспомогательным инструментом . Я не уверен, что у меня есть альтернатива setuid, предложенная в документации. Могу ли я установить бит setuid на rm и запустить его, используя метод NSTask, который я уже реализовал? Это означало бы, что мне не нужно было бы создавать свой собственный вспомогательный инструмент. Не мог бы кто-нибудь подробнее рассказать об этом?
Я также посмотрел на BetterAuthorizationSample, который предлагается как более безопасная и современная альтернатива битовому методу setuid, но нашел его ужасно сложным для такого простого поведения. Есть подсказки?
Заранее благодарим за любую помощь!
Несколько месяцев назад у меня была головная боль. Я пытался запустить сценарий оболочки с правами администратора, который выключал бы мой компьютер в определенное время. Я чувствую твою боль.
Я использовал BetterAuthorizationSample, который был сущим кошмаром. Но я пошел самым прагматичным путем — я не стал пытаться понять все, что происходит, я просто вцепился в внутренности кода.
Мне не потребовалось много времени, чтобы заставить его делать то, что я хотел. Я не могу точно вспомнить, что я изменил, но вы можете проверить мой код:
http://github.com/johngallagher/TurnItOff
Надеюсь, это поможет вам в поисках безопасного приложения!