Obtendo privilégios de administrador para excluir arquivos usando rm de um aplicativo Cocoa

Estou criando um aplicativo pequeno que exclui arquivos de log. Estou usando uma instância NSTask que executa rm e srm (secure rm) para excluir arquivos.

Quero poder excluir arquivos em:

/ Biblioteca / Logs~ / Biblioteca / Logs

O problema é que a conta do usuário não tem permissões para acessar alguns arquivos na pasta da biblioteca do sistema, como a subpasta de logs da Adobe e outros. Por exemplo, apenas o usuário "sistema" (grupo?) Tem permissões de r / w para a pasta de logs da Adobe e seu conteúdo, e o usuário atual nem sequer tem uma entrada nas permissões mostradas na janela Obter informações para a pasta .

O que eu quero poder fazer exatamente:

Obtenha privilégios de administrador.Armazene a senha no chaveiro para que o aplicativo não precise incomodar o usuário todas as vezes (o armazenamento da senha é uma má ideia? É possível?)Exclua um arquivo quaisquer que sejam suas permissões.

Estou usando o NSTask porque ele oferece notificações para a conclusão da tarefa, obtendo saída de texto da própria tarefa, etc. Preciso usar outra coisa? Em caso afirmativo, como eu poderia replicar as notificações de conclusão do NSTask e manipular o arquivo de saída enquanto executava rm e srm com privilégios de administrador?

Estou procurando a maneira mais segura de lidar com a situação. ou seja, não quero que meu aplicativo se torne uma porta de entrada para ataques de escalonamento de privilégios.

Examinei o Guia de programação dos serviços de autorização, mas não sei ao certo qual é o caso. No começo eu pensei queAuthorizationExecuteWithPrivileges seria uma boa idéia, mas depois de ler mais sobre o assunto, parece que esse método não é recomendado por razões de segurança.

Uma resposta detalhada seria muito bem-vinda. Tenho certeza de que alguns de vocês já tiveram que fazer algo semelhante e têm algum código e conhecimento para compartilhar.

Desde já, obrigado!

Atualizar:

Agora eu sou capaz de fazer a caixa de diálogo de autenticação aparecer e obter privilégios, assim:

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);

Pelo que parece, parece que o método "Aplicativo fatorado" parece o mais apropriado. O problema é que, para mim,rm já parece uma ferramenta auxiliar externa. Não tenho certeza de obter a alternativa setuid sugerida na documentação. Posso definir o bit setuid na rm e executá-lo usando o método NSTask que eu já implementei? Isso significaria que eu não precisaria criar minha própria ferramenta auxiliar. Alguém poderia elaborar sobre esse assunto?

Também observei o BetterAuthorizationSample, sugerido como uma alternativa mais segura e recente ao método setuid bit, mas achei muito complexo para comportamentos simples. Alguma dica?

Agradecemos antecipadamente por qualquer ajuda!

questionAnswers(2)

yourAnswerToTheQuestion