7
votes

Élevage aux droits de l'administrateur dans l'application Mac

Je fais une application simple qui vous permet de saisir rapidement une commande shell à exécuter. Cela fonctionne parfaitement, mais il y a le problème des commandes sudo. Actuellement, il détecte une commande sudo, puis j'essaie et j'essaie ensuite d'aborder une fenêtre d'autorisation pour le mot de passe de l'utilisateur, exactement comme si vous le verriez dans Installer.

Voici le code une fois qu'il détecte la commande Sudo:

SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment];
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil]){
    //authorized, now run the command using NSTask.
}else{
    //fail
}


0 commentaires

3 Réponses :


1
votes

La sécurité est difficile. Je pourrais paraphraser la documentation et fournir des extraits de code, mais je me tromperais probablement. Pire, même si mes descriptions de haut niveau avaient raison, il y aurait probablement un petit bug dans les extraits de code qui tueraient la sécurité.

Si vous allez gâcher avec l'escalade de privilège, la meilleure approche consiste à lire les documents et à utiliser les échantillons fournis.

https://developer.apple.com/mac/library/documentation/security/conceptuelle/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/tp30000995-ch204-tp1


0 commentaires

2
votes

Vous voudrez utiliser la fonction d'autorisationExecutewithPrivileges, comme celle-ci:

- (IBAction)touch: (id) sender {

  NSString * filepath = [_filepathfield stringValue];
  FILE *commpipe = NULL;
  OSStatus execstatus;


  NSLog(@"file path is %@", filepath);

  char *args[] = {[filepath cString], NULL};


  SFAuthorization * authorization = [SFAuthorization authorization];

  execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef],
                                                  "/usr/bin/touch",
                                                  kAuthorizationFlagDefaults,
                                                  args,
                                                  &commpipe);

  if (execstatus == errAuthorizationSuccess) 
    NSlog(@"Toot! It worked");
  else
    NSLog(@"No dice");

}


1 commentaires

Mais cela n'exécutera pas NSTASK. Des idées Comment exécuter NSTASK à l'aide de privilèges?



2
votes

Je sais que c'est une très vieille question, mais à ceux qui cherchent toujours une réponse, voici. (Il utilise AppleScript)

NSDictionary *errorInfo;
[script executeAndReturnError:&errorInfo];


0 commentaires