[Résolu][Test] whoami ?

Bonjour,

Je voudrais insérer, dans un programme C, un petit test qui vérifie que c’est bien “root” qui l’exécute, et pas un utilisateur lambda. L’objectif étant d’éviter un certain nombre d’erreurs dont on peut ignorer la provenance par la suite si l’on ne connait pas le programme.

Merci !

Pat

Je suis pas spécialiste,

mais avec un :

Tu recupère dans une chaine de caractère ce qu’il y a dans le fichier et tu le met dans le char *temp.

Et ensuite une comparaison [ strcmp() ] avec la chaine char *compare=“root” .
C’est comme ça que je le vois mais je débute.

@+

man getuid :wink:

Merci à vous deux :wink:

[quote=“Yoko”]chown root:root mon_programme[/quote]non. tu n’as pas suivi le pb.

Il veut qu’il n’y ai que root qui puisse exécuter le programme non ?

Ou alors j’ai rien compris et je laisse les grands travailler :laughing:

Mettre le owner du programme à root ne résoudra le problème qu’à moitié, étant donné qu’il sera amené à être déplacé sur d’autres machines, etc…

C’est facile de changer l’utilisateur, de l’exécuter normalement puis de se dire “ça môrche pô” et ne pas comprendre pourquoi.

Je veux juste vérifier, au sein même du programme, que c’est bien root qui exécute la bête, afin de pouvoir prévenir efficacement l’utilisateur du pourquoi ça ne marche pas (si pas exécuté par root) ^^.

Avec getuid() ça marche très bien ^^.

Si ta gestion des erreurs est bien construite, il n’y a pas de raison que l’utilisateur ne sache pas d’ou vient le problème, non ? - getuid est une précaution

Bon j’ai compris, je vais rentrer dans les détails ^^.

Je suis en train de développer un programme de surveillance de réseau, en utilisant la librairie libpcap.

Voilà la portion de code qui m’a poussé à faire un test avec getuid().

Dans le cas où on ne lance pas l’application avec l’option --device=eth0 (ou n’importe quoi d’autre), le programme va chercher lui-même une interface sur laquelle agir.

char err_buff[PCAP_ERRBUF_SIZE];
char* device = NULL;

if((device = pcap_lookupdev(err_buff)) == NULL)
{
  fprintf(stderr, "pcap_lookupdev : %s\n", err_buff);
  return(EXIT_FAILURE);
}        

Si le programme est exécuté sans les droits root, lors du passage dans cette boucle, le programme stop et on obtient le message d’erreur suivant :

pcap_lookupdev : no suitable device found

L’erreur n’étant pas forcément très claire, je préfère rajouter un test et vérifier en amont la valeur retournée par getuid(). Si elle est non nulle, le problème viendra, et c’est plus facile d’avertir l’utilisateur en lui disant un truc du genre “are you root ?” que de le laisser avec un “device not found” qui risque de le laisser songeur, et surtout qui peut provenir d’autres raisons plus embêtantes. :stuck_out_tongue:

Voilà, vous savez tout ^^

Après, si vous avez mieux comme solution, je reste bien entendu preneur. ;p

Pat’

comme le disait matt, getuid est ton ami, enfin je pense. Si root n’a pas toujours le meme uid (possible ca ???) alors il faudrait ptet faire un truc genre effectivement un apppel a whoami en en récupérer le contenu puis le comparer à la chaine “root”. Ma spas très propre … si ? Le “problème” dans le cat sauvage dans un fichier c’est qu’un ptit malin pourrait sans doute contourner ca en force brutte avec un prog adéquat ou tout simplement en créant deja le fichier à relire et en le placant, par exemple en lecture seule… enfin en tout cas faudrait prévenir ce genre de problèmes.

Il y a un autre problème quand tu passe par sudo tu garde ton identité.

J’ai essayé, si tu exécutes le programme sous sudo, getuid renvoie bien 0.

edit : après relecture et triturage de méninge, oui on garde son identité. Mais que ce soit sous su ou sudo que le programme est lancé, moi je m’en fiche un peu, ça relève de l’administration, plus du programme. Si la personne qui fait le sudo est autorisée à exécuter ce programme dans la sudolist, tant mieux pour elle, ce n’est plus de mon ressort ;o

Ok ok c’était juste que je pensais qu’on gardait son uid à soit.

non, en fait, il y a l’user réel du processus père (getuid), mais il y a aussi l’user effectif avec lequel s’est lancé le process éventuellement modifié ponctuellement par un bit suid (geteuid). C’est encore différent de l’id de login, mais je ne sais pas le trouver.
En fait Pingoo, je crois que ce qu’il faut que tu teste c’est geteuid, plutot.
Et pour info, root à toujours l’uid 0 (mais pourrait ne pas s’appeler root).

J’ai regardé tout ça. C’est encore un peu brumeux, vais farfouiller un peu plus.

Je suis sûr et certain qu’un programme exécuté en sudo a pour getuid 0 (j’ai testé et retesté).