IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Executer sudo dans un programme c++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Par défaut Executer sudo dans un programme c++
    Bonjour à tous,

    Je fais appel à vous car je bloque sur une étape de mon programme.
    Je suis en train de faire une programme qui me permet d'éxécuter des commandes shell en cliquant sur des boutons.
    Mais lorsque j'ai besoin d'éxécuter une commande en sudo, le programme plante.
    J'ai essayé de faire un bouton avec la commande sudo et le mot de passe "en dur" mais impossible.
    J'ai l'impression qu'il sort du shell ou qu'il ne m'écrit pas le mot de passe lorsqu'il le demande.

    Savez-vous comment puis-je faire pour executer des commandes sudo ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Bonjour,

    On suppose donc que tu travailles sous Unix ou sous Linux.

    Ce n'est absolument à ton programme binaire d'appeler sudo lui-même. Ce serait une une grosse faille de sécurité. De plus, sudo, bien que très répandu, n'est pas une commande fondamentale mais un utilitaire, soumis à ses propres règles et ses fichiers de configuration.

    Enfin, si tu cherches à appeler sudo, c'est que tu cherches à lancer un programme en tant que root et même là, cela doit se justifier. 90 % des débutants cherchent à faire cela pour contourner une limitation gênante plutôt que se demander pourquoi cette limitation est en vigueur.

    Dis-nous ce que tu cherches à faire exactement au final.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Par défaut
    Par exemple, je dois executer la commande " sudo ifconfig en1 lladdr 00:00:00:00:00:00"
    Mais pour cela il faut obligatoirement être authenfier en sudo pour l'exécuter ...
    Il y a un autre moyen plus fiable ?

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Ce que tu cherches c'est les fonctions pour changer le niveau d'accès (demander a ce que ce soit un administrateur qui execute ton appli). Ce sont des fonctions dépendantes de l'OS, pas du language C++ ou C.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par Catskan Voir le message
    Par exemple, je dois executer la commande " sudo ifconfig en1 lladdr 00:00:00:00:00:00"
    Mais pour cela il faut obligatoirement être authenfier en sudo pour l'exécuter ...
    Il y a un autre moyen plus fiable ?
    Citation Envoyé par Klaim Voir le message
    Ce que tu cherches c'est les fonctions pour changer le niveau d'accès (demander a ce que ce soit un administrateur qui execute ton appli). Ce sont des fonctions dépendantes de l'OS, pas du language C++ ou C.
    Autrement dit : c'est à l'utilisateur d'appeler ton programme avec sudo, ou en tant que root. Ce n'est pas à ton logiciel d'aller acquérir ces privilèges seuls.

    En principe, tu dois également te contenter de renvoyer le message d'erreur correspondant au code que tu reçois lorsqu'elle se produit. Tu peux à la limite préciser « need to be root » entre parenthèses, mais seulement si tu sais absolument ce que tu fais, car il est possible, notamment via les « capabilities », de conserver certains pouvoirs même en abandonnant l'identité root.

    D'autre part, si tu codes en C ou en C++, c'est pour faire de la programmation système. Donc appeler une commande shell depuis un programme exécutable en langage machine, c'est passablement sale.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Par défaut
    Oui mais comment faire pour que l'utilisateur s'identifie ?
    Il faut forcément entrer le mot de passe dans le programme non ? Ca je voudrai pas qu'il lance un Terminal pour que l'utilisateur entre son mot de passe.
    Le programme ne servira qu'à moi de toute façon.
    Ca fait 2h que j'éssaie de faire fonctionner cette commande qui a besoin d'être authentifié mais sans succès .

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par Catskan Voir le message
    Oui mais comment faire pour que l'utilisateur s'identifie ?
    Il faut forcément entrer le mot de passe dans le programme non ? Ca je voudrai pas qu'il lance un Terminal pour que l'utilisateur entre son mot de passe.
    Ça dépend du système d'exploitation et de l'environnement choisi par l'utilisateur et c'est à lui de voir cela. Pas à toi. Au pire, si c'est toi qui te charges de faire le package pour ta distribution, il faudrait voir quels sont les sont les procédés mis en place par le bureau graphique pour faire cela. Sous Gnome 3, par exemple, il y a pkexec.

    Il y a aussi les bits setuid et setgid qui sont la manière officielle, sous Unix, de lancer automatiquement un programme avec une identité donnée (généralement root mais pas forcément). Mais il faut absolument justifier leur utilisation.

    Le programme ne servira qu'à moi de toute façon. Ca fait 2h que j'éssaie de faire fonctionner cette commande qui a besoin d'être authentifié mais sans succès .
    C'est normal parce que ce n'est pas de cette manière qu'il faut procéder.
    Encore une fois : que cherches-tu à faire au final ?

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 41
    Par défaut
    Je suis sous OS X donc je pense que je dois bits setuid et setgid.
    Au final, je veux qu'en cliquant sur des boutons il m'execute les commandes souhaitées.

    Par exemple : Charger adresse mac : sudo ifconfig en1 lladdr 00:00:00:00:00:00
    Purger mémoire : purge ...

    Les commandes sans avoir besoin d'être administrateur fonctionnent parfaitement.
    Pour le moment la seule commande que j'ai sous la main pour laquelle il faut être root est celle de l'adresse mac.

  9. #9
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Ce que tu n'as pas l'air de comprendre c'est que ici "sudo" est une application qui va, une fois qu'il aura vérifié que l'utilisateur est super-user, executer le reste de la ligne de commande en tant que root.

    Donc en gros, l'application elle même ne fais pas la demande d emots de passet etc. Au mieu, comme dis au dessus, elle repère qu'elle n'a pas de droits d'accès pour faire son boulot et sois gère ce cas, soit juste affiche le probleme et quitte.

  10. #10
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Catskan Voir le message
    Oui mais comment faire pour que l'utilisateur s'identifie ?
    Il faut forcément entrer le mot de passe dans le programme non ? Ca je voudrai pas qu'il lance un Terminal pour que l'utilisateur entre son mot de passe.
    Le programme ne servira qu'à moi de toute façon.
    Ca fait 2h que j'éssaie de faire fonctionner cette commande qui a besoin d'être authentifié mais sans succès .
    Si le programme ne sert qu'à toi, pourquoi ne pas le lancer en tant que root ? Une autre solution serait de mettre l'owner/group à root:root et de rajouter le bit setuid sur le programme - de cette manière, il n'aura pas besoin de faire de sudo. Je ne vois pas réellement de problème ici : une fois en setuid root:root, ton programme pourra appeler ifconfig sans avoir besoin de faire un sudo (normallement).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #11
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    D'une manière générale, la gestion des droits n'est pas l'affaire du programme, mais de l'admin qui l'a installé.

    Ce n'est pas une bidouille quelconque dans le code qui sera valable, aussi "belle" soit-elle.

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Une autre solution serait de mettre l'owner/group à root:root et de rajouter le bit setuid sur le programme - de cette manière, il n'aura pas besoin de faire de sudo.
    C'est ce que l'on a dit plus haut, mais j'aimerais être sûr que c'est parfaitement justifié avant de lui faire prendre l'habitude d'y recourir (même si c'est toujours mieux qu'un « system("sudo"); »).

    Si c'était un tout petit utilitaire console, à la limite, mais il parle d'une application graphique avec des boutons, etc. qui s'appuie probablement elle-même sur un framework particulier pour les générer facilement. Lancer tout cela sous root de manière systématique et transparente, ça me dérange un peu.

  13. #13
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par leternel Voir le message
    D'une manière générale, la gestion des droits n'est pas l'affaire du programme, mais de l'admin qui l'a installé.

    Ce n'est pas une bidouille quelconque dans le code qui sera valable, aussi "belle" soit-elle.
    C'est à la fois vrai, à la fois faux. Si c'était complètement vrai alors le programme sudo n'aurait pas de fichier de configuration : c'est bien le programme qui, une fois sa configuration lue, décide quoi faire (même si le fichier en question est défini par l'administrateur, c'est le programme qui prends ses décisions). Mais en même temps, sudo (et les programmes/mécanismes similaires sur d'autres OS, telle l'impersonnation sur Windows) fait un peu figure d'exception.

    Citation Envoyé par Obsidian Voir le message
    C'est ce que l'on a dit plus haut, mais j'aimerais être sûr que c'est parfaitement justifié avant de lui faire prendre l'habitude d'y recourir (même si c'est toujours mieux qu'un « system("sudo"); »).

    Si c'était un tout petit utilitaire console, à la limite, mais il parle d'une application graphique avec des boutons, etc. qui s'appuie probablement elle-même sur un framework particulier pour les générer facilement. Lancer tout cela sous root de manière systématique et transparente, ça me dérange un peu.
    Au final, il faut savoir ce que tu veux

    Si tu distribuait ton programme, ça serait un gros NON tout de suite. La plupart des framework graphiques sont trop important et cachent de nombreux problèmes de sécurité (buffer overflow exploitables, etc...). Mais si tu le garde pour toi uniquement, alors tu as cette possibilité - parce qu'utiliser un vecteur d'attaque ne peut se faire que si le vecteur d'attaque est connu, et en le gardant pour toi, tu n'a aucune chance qu'un attaquant puisse le découvrir.

    Tu peut en outre conditionner l'exécution du programme, en testant l'uid et le gid de celui qui lance le programme (un process possède un uid, un gid, un euid (effective uid) et un egid (effective gid)).

    Code getuid.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/types.h>
     
    int main()
    {
    	uid_t uid, euid;
    	gid_t gid, egid;
     
    	uid = getuid();
    	euid = geteuid();
     
    	gid = getgid();
    	egid = getegid();
     
    	printf("uid = %d ; euid = %d\ngid = %d ; egid = %d\n", 
    		uid, euid, gid, egid);
     
    	return 0;
    }

    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ gcc -o getuid getuid.c
    $ ls -l
    -rwxr-xr-x 1 edt  edt  7364 oct.   5 11:52 getuid*
    -rw-r--r-- 1 edt  edt   286 oct.   5 11:52 getuid.c
    $ ./getuid
    uid = 2039 ; euid = 2039
    gid = 2039 ; egid = 2039
    $ sudo su
    # chown root:root getuid
    # chmod +s getgid
    # exit
    $ ls -l
    -rwsr-sr-x 1 root root 7364 oct.   5 11:52 getuid*
    -rw-r--r-- 1 edt  edt   286 oct.   5 11:52 getuid.c
    $ ./getuid
    uid = 2039 ; euid = 0
    gid = 2039 ; egid = 0

    Bref, en testant l'uid et le gid du lanceur du programme, tu peux très simplement restreindre l'utilisation de ton programme, dès les premières lignes de main(), et donc priver un pirate de la possibilité d'exécuter ton programme (sauf s'il parvient à le lancer depuis ton compte, auquel cas, il peut l'exécuter comme s'il était toi).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecoute d'un executable dans un programme en C++
    Par sapin dans le forum Débuter
    Réponses: 4
    Dernier message: 06/03/2009, 17h12
  2. executer un shell dans un programme php?
    Par motivée dans le forum Ubuntu
    Réponses: 3
    Dernier message: 17/11/2008, 11h29
  3. le programme ne s'execute pas dans certains cas
    Par djaval0221 dans le forum C++
    Réponses: 2
    Dernier message: 15/05/2008, 15h14
  4. Réponses: 3
    Dernier message: 17/05/2007, 16h19
  5. Réponses: 8
    Dernier message: 14/05/2007, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo