Получение прав администратора для удаления файлов с помощью rm из приложения Какао

Я делаю небольшое приложение, которое удаляет файлы журналов. Я использую экземпляр NSTask, который запускает rm и srm (secure rm) для удаления файлов.

Я хочу иметь возможность удалять файлы в:

  • / Library / Logs
  • ~ / Library / Logs

Проблема в том, что учетная запись пользователя не имеет разрешений на доступ к некоторым файлам в папке системной библиотеки, например к подпапке журналов Adobe и другим. Например, только «системный» пользователь (группа?) Имеет права чтения / записи для папки журналов Adobe и ее содержимого, а текущий пользователь даже не имеет записи в разрешениях, отображаемых в окне «Получить информацию» для папки. .

То, что я хочу делать именно так:

  1. Получать права администратора.
  2. Сохранять пароль в Связке ключей, чтобы приложение не Мне приходится каждый раз пилить пользователя (Хранение пароля - плохая идея? Возможно ли это?)
  3. Удалить файл независимо от прав доступа к файлу.

Я использую 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, но нашел его ужасно сложным для такого простого поведения. Есть подсказки?

Заранее благодарим за любую помощь!

10
задан Form 31 August 2010 в 17:26
поделиться

1 ответ

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

Я использовал BetterAuthorizationSample, который был сущим кошмаром. Но я пошел самым прагматичным путем — я не стал пытаться понять все, что происходит, я просто вцепился в внутренности кода.

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

http://github.com/johngallagher/TurnItOff

Надеюсь, это поможет вам в поисках безопасного приложения!

4
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: