SFAuthorizationView, SFAuthorization, Exécution "root"
schlum
Membre
Hello !
ça fait 2 jours que je me prend la tête avec les Security Frameworks :crackboom:-
J'ai un prefPane qui utilise une SFAuthorizationView que j'ai réussi à configurer aisément en utilisant la doc :
Dans le "awakeFromNib" de mon Contrôleur :
Les fonctions delegate "authorizationViewDidDeauthorize" et "authorizationViewDidAuthorize" me permettant de mettre à jour l'interface en activant / désactivant les contrôles devant toucher à des trucs système.
Donc j'étais plutôt content... jusqu'au moment d'utiliser cette "SFAuthorization" -> grosse prise de tête.
J'ai cherché des exemples, essayé un peu tout, rien à faire, je n'arrive pas à exécuter une partie de mon code en euid 0
Le dernier truc en date que j'ai essayé :
Et si apparemment le "grant access" se passe bien, le "seteuid" foire à tous les coups.
Alors y a-t-il un autre moyen que d'utiliser "AuthorizationExecuteWithPrivileges" ? (je ne veux pas passer par un utilitaire extérieur !)
ça fait 2 jours que je me prend la tête avec les Security Frameworks :crackboom:-
J'ai un prefPane qui utilise une SFAuthorizationView que j'ai réussi à configurer aisément en utilisant la doc :
Dans le "awakeFromNib" de mon Contrôleur :
[authView setString:kAuthorizationRightExecute];<br /> [authView setAutoupdate:YES<br /> interval:5.0];<br /> [authView setDelegate:self];
Les fonctions delegate "authorizationViewDidDeauthorize" et "authorizationViewDidAuthorize" me permettant de mettre à jour l'interface en activant / désactivant les contrôles devant toucher à des trucs système.
Donc j'étais plutôt content... jusqu'au moment d'utiliser cette "SFAuthorization" -> grosse prise de tête.
J'ai cherché des exemples, essayé un peu tout, rien à faire, je n'arrive pas à exécuter une partie de mon code en euid 0
Le dernier truc en date que j'ai essayé :
if([authView authorizationState]==SFAuthorizationViewUnlockedState) {<br /> NSLog(@"%d,%d",getuid(),geteuid());<br /> AuthorizationItem myItems = { kAuthorizationRightExecute, 0, NULL, 0 };<br /> AuthorizationRights myRights = { 1, &myItems };<br /> AuthorizationFlags myFlags = kAuthorizationFlagDefaults|kAuthorizationFlagInteractionAllowed|kAuthorizationFlagPreAuthorize|kAuthorizationFlagExtendRights;<br /> OSStatus myStatus = AuthorizationCopyRights([[authView authorization] authorizationRef],&myRights,NULL,myFlags,NULL);<br /> if(myStatus==errAuthorizationSuccess) {<br /> int uid = seteuid(0);<br /> NSLog(@"%d,%d",getuid(),geteuid());<br /> if(uid!=-1) {<br /> BOOL res = [@"toto" writeToFile:@"/Users/schlum/Desktop/test/toto"<br /> atomically:YES];<br /> NSLog(@"%s",res?"true":"false");<br /> seteuid(uid);<br /> } else<br /> NSLog(@"Cannot set euid (%d)",errno);<br /> } else<br /> NSLog(@"Cannot grant access (%d) !",myStatus);<br />}
Et si apparemment le "grant access" se passe bien, le "seteuid" foire à tous les coups.
Alors y a-t-il un autre moyen que d'utiliser "AuthorizationExecuteWithPrivileges" ? (je ne veux pas passer par un utilitaire extérieur !)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pour moi ça change le execution-UID de ton propre process, ça. Si tu ne mets même pas la ligne, est-ce que ça marche quand même ? (puisque AuthorizationCopyRights a réussi à t'attribuier les droits nécessaire à priori si j'ai tout capté) ?
En fait c'est l'utilisation du seteuid qui me parrait un peu étrange. Je ne l'aurais même pas utilisé (Mais je le répète je suis pas un spécialiste là dedans, bien au contraire puisque je n'ai jamais utilisé ça)
Quand je vois par exemple que dans Ce sample code sur l'ADC ils ne l'utilisent pas (bon ils exécutent un outil avec AutorizationExecuteWithprivileges, il faut pas un writeToFile, mais bon), je me demande si c'est bien la solution.
A méditer, c'était my two cents.
Au début je tentais juste le "writeToFile" qui me renvoyait "false" (le dossier "test" sur mon bureau appartient à "root" avec les droits 700).
Je crois que c'est obligatoire de passer par AuthorizationExecuteWithPrivileges :-\\
Si quelqu'un a une solution plus pratique...
Je développe maintenant des outils pour Mac Os X dans le cadre de mon travail !
Actuellement je travail sur un editeur et table Cron (l'utilitaire de tâche planifier UNIX). Mon gros problème est qu'il faut que le logiciel ai le droit de modifier des fichiers dans les dossiers du système (/var/). Je cherche donc à faire un self-autorization de l'application.
Je n'y arrive pas ! Je bute un peut sur l'anglais et j'ai un peut tout essayé.
Savez vous comment procéder pour faire en sorte de demander le mot de passe administrateur au lancement de l'application ?
Voici mon code actuel :
Dans la fonction init, j'ai mis ceci :
Par contre, je ne sais pas obtenir une escalade de privilège par le processus en cours.
Si ça t'intéresse, je peux te donner du code ; sinon, faudra attendre quelqu'un qui s'y connaà®t mieux :P
La solution viens du init il suffit de vérifier si l'exécution est en root !
Je fait la même chose sauf que pour éviter un boucle infini, je vérifie si l'exécution est en root
<br />
EDIT:
Tout le code est là pour ce que cela intéresse : http://wisky2.blogspot.com/2008/02/autorisation-sur-mac-os-x.html
C'est inspiré de CBSudo ! Merci CBrant
Mis à part les logiciels made in Apple !
J'ai eu les mêmes questions, et finalement il semble que la réponse soit claire :
http://lists.apple.com/archives/cocoa-dev/2004/Dec/msg01004.html
Du coup, à quoi sert ce fameux scénario "Simple, Self-Restricted Applications" ? Je pense que c'est pour rajouter une couche d'authentification "logique", qui ne s'appuie absolument pas sur les droits du système, mais sur des choix du développeur qui veut gérer des utilisateurs "logiques" de son application.
+
Chacha
Je suppose qu'il passe par un processus tiers tournant en root qui joue en quelque sorte un rôle de serveur local webservice avec authentification.
Le seul truc que l'on sait pas faire c'est monter en privilèges notre appli déjà lancée, pour qu'elle puisse écrire (après avoir acquis les privilèges avec SFAutorization) dans un répertoire nécessitant certains droits. En gros on est obligé de créer une NSTask avec les nouveaux privilèges pour faire ça, on peut pas le faire directement depuis notre task/appli en cours.
Ah ben oui, mais pour lancer un process avec des privilèges, ça s'invente pas, il faut les avoir, d'où mon interrogation
Voila un vieux bout de code que j'avais utiliser pour je ne sais quoi et que j'ai taxé de je ne sais où (bon, ya des chances que ca vienne du code de Sparkle, mais je suis pas sûr). Il s'agit de code pour déplacer un fichier avec eventuellement les autorisations.
- L'appli en cours (ton appli que tu codes quoi) ne peux pas faire d'escalade de privilèges, même avec SFAutorization.
- La seule façon d'accéder à qqch avec des privilèges suppérieurs à l'application (task) courrante, c'est de lancer une nouvelle NSTask (qui lance sh, mv, cp, cat, ou l'utilitaire dont tu as besoin) et de l'executer via SFAutorization, après avoir demandé l'autorisation (mot de passe admin), donc via AuthorizationCreate puis AuthorizationExecuteWithprivileges.
Y'a pas d'autre moyen... puisque faire faire directement à ton application une action pour laquelle elle n'a pas les droits, c'est pas possible... même avec SFAuth.