OVH Cloud OVH Cloud

script Perl suid root et droits (iwconfig)

17 réponses
Avatar
C. Tobini
Bonjour,

J'ai écrit un petit script Perl pour connecter ma carte PCMCIA à ma
borne Internet WiFi.

Le script est setuid root et j'ai mis $ENV{'PATH'} = '/sbin' car j'utilise :

- modprobe (opur charger le module ndiswrapper)
- cardctl (pour vérifier le status de la carte)
- iwconfig

Pour modprobe et cardctl, il n'y a pas de problème.

La configuration de la connexion se trouve dans une fonction init_card,
et le script me demande en revanche les droits root pour utiliser iwconfig.

Vu que le script est suid root il s'exécute en root (?) et je ne devrais
normalement pas avoir de problème sur iwconfig.

Vous auriez une idée là-dessus ?

Merci.

C. Tobini

7 réponses

1 2
Avatar
TiChou
Dans le message <news:,
*Hugues* tapota sur f.c.o.l.configuration :

En fait si je comprends bien, tu cherches à exécuter un programme en
tant qu'utilisateur normal, mais ce programme a besoin d'être en tant
que root pour fonctionner.
Et tu cherches à faire ça à partir d'un shellscript.

Ça n'est pas possible.


Si si, ici c'est possible puisqu'on utilise l'interpréteur suidperl.
Le seul problème ici est que l'exécution d'une commande système en utilisant
la fonction system de perl se fera avec les droits de UID (real user id) et
pour qu'il se fasse avec les droits de EUID (effective user id) il faut
redéfinir la variable $< comme l'a suggéré Nicolas George.

D'après ce que j'ai lu sur une excellente page explicative :
http://lea-linux.org/dev/suid_scripts.html

Il te faut passer par un programme écrit en C, afin de faire appel aux
routines système qui vont bien, et qui vont réellement te donner les
droits root pour l'exécution du programme voulu.


L'utilisation d'un wrapper est inutile ici et d'une manière générale
j'aurais tendance à conseiller plutôt d'utiliser sudo qui quoi qu'on en dise
est beaucoup plus secure.

Encore une fois, toutes mes excuses si je suis à côté de la plaque


Vous n'étiez pas tout à fait à côté de la plaque, juste un peu en retard sur
ce qui avait été déjà dit. :)

(et je vais tenter de changer de fournisseur nntp afin d'accéder aux
archives qui me manquent)


http://groups.google.fr pour les archives

http://www.free.fr pour un accès gratuit à un des meilleurs fournisseurs
nntp d'Europe.

--
TiChou

Avatar
Nicolas George
Hugues wrote in message :
Et tu cherches à faire ça à partir d'un shellscript.


En l'occurence, c'est un script perl, et perl prévoit un mécanisme
précisément pour celà : s'il détecte qu'il exécute un script SUID, perl
appelle le binaire suidperl, qui est lui-même SUID root, et qui simule le
SUID sur le script (vérification des droits, changement d'identité, etc.).

Avatar
TiChou
Dans le message <news:cihgin$82d$,
*C. Tobini* tapota sur f.c.o.l.configuration :

TiChou wrote:
Relisez ce que vous a dit Nicolas George... Il vous dit de placer dans
votre script :
$< = $>;
et aussi de tester ce que retourne la ligne :
system "id";


OK j'avais lu trop vite :-)

L'égalité fait que je suis en UID root dans tout le script.


Donc c'est bon, c'est bien ce que vous souhaitiez ?

La commande system 'id' retourne -1.


Ça ça n'est pas normal. Problème de syntaxe ? De chemin ?

Et si vous n'êtes toujours pas convaincu, parce que votre réponse ici n'est
pas très claire :

$ cat test.pl
#!/usr/bin/suidperl

$ENV{PATH} = '/bin';

print "UID = $<nEUID = $>n";
system 'id';

$< = $>;

print "UID = $<nEUID = $>n";
system 'id';

$ ls -l test.pl
-rwsr-sr-x 1 root root 111 Sep 18 16:58 test.pl

$ ./test.pl
UID = 1000
EUID = 0
uid00(tichou) gid0(users) euid=0(root) egid=0(root)
groups0(users),10(wheel),20(dialout),22(sshd)
UID = 0
EUID = 0
uid=0(root) gid0(users) egid=0(root)
groups0(users),10(wheel),20(dialout),22(sshd)

--
TiChou


Avatar
Hugues
Ce cher "TiChou" a dit :

Dans le message <news:,
*Hugues* tapota sur f.c.o.l.configuration :

En fait si je comprends bien, tu cherches à exécuter un programme en
tant qu'utilisateur normal, mais ce programme a besoin d'être en tant
que root pour fonctionner.
Et tu cherches à faire ça à partir d'un shellscript.

Ça n'est pas possible.


Si si, ici c'est possible puisqu'on utilise l'interpréteur
suidperl.


Tout dépend de l'interpréteur effectivement, et notamment de ses
droits d'accès. Avec un shell classique et des droits classiques, ça
n'est pas possible, mais on se comprend ;-)

Le seul problème ici est que l'exécution d'une commande système en utilisant
la fonction system de perl se fera avec les droits de UID (real user id) et
pour qu'il se fasse avec les droits de EUID (effective user id) il faut
redéfinir la variable $< comme l'a suggéré Nicolas George.


Je veux bien le croire, je connais trop mal Perl pour m'étaler dessus.

D'après ce que j'ai lu sur une excellente page explicative :
http://lea-linux.org/dev/suid_scripts.html

Il te faut passer par un programme écrit en C, afin de faire appel aux
routines système qui vont bien, et qui vont réellement te donner les
droits root pour l'exécution du programme voulu.


L'utilisation d'un wrapper est inutile ici et d'une manière générale
j'aurais tendance à conseiller plutôt d'utiliser sudo qui quoi qu'on en dise
est beaucoup plus secure.


Sudo EST la méthode la plus secure pour accéder aux commandes
système. J'appuie fortement ;-)
Mais l'utilisation d'un programme seteuid n'a généralement pas les
mêmes objectifs. Et comme j'ai manqué le début.. ;-)

(et je vais tenter de changer de fournisseur nntp afin d'accéder aux
archives qui me manquent)


http://groups.google.fr pour les archives


Disons que j'étais atteint d'hypertropie palmaire sur ce coup là.

http://www.free.fr pour un accès gratuit à un des meilleurs fournisseurs
nntp d'Europe.


Merci, je pensais à celui ci justement :)
Allez hop, je switche dessus.

--
Hugues - Linux Addict


Avatar
Hugues
Ce cher Nicolas George <nicolas$ a dit :

Hugues wrote in message :
Et tu cherches à faire ça à partir d'un shellscript.


En l'occurence, c'est un script perl, et perl prévoit un mécanisme
précisément pour celà : s'il détecte qu'il exécute un script SUID, perl
appelle le binaire suidperl, qui est lui-même SUID root, et qui simule le
SUID sur le script (vérification des droits, changement d'identité, etc.).


Okii, et donc il ne reste plus qu'à effectuer le changement RUID > EUID
C'est plus clair dans ma tête ;)

Allez, j'arrête de polluer sur un sujet que ne connais que mal (Perl)
(ceci dit je trouve ce thread très intéressant)

--
Hugues - Linux Addict


Avatar
Jérémy JUST
On Sat, 18 Sep 2004 17:27:07 +0200
Hugues wrote:

En l'occurence, c'est un script perl, et perl prévoit un mécanisme
précisément pour celà : s'il détecte qu'il exécute un script SUID,
perl appelle le binaire suidperl, qui est lui-même SUID root, et qui
simule le SUID sur le script (vérification des droits, changement
d'identité, etc.).


Allez, j'arrête de polluer sur un sujet que ne connais que mal (Perl)
(ceci dit je trouve ce thread très intéressant)


J'arrive après la bataille, mais c'est pas grave.
Peut-être trouveras-tu des informations utiles dans:

$ perldoc perlsec


--
Jérémy JUST


Avatar
ctemp2
Merci à tous de vos réponses, dès que j'aurai à nouveau ma machine sous
les yeux je verrai tout ceci (apparement ça a l'air OK, je n'ai plus de
problème d'authorisations sur iwconfig).

Jérémy JUST wrote:
J'arrive après la bataille, mais c'est pas grave.
Peut-être trouveras-tu des informations utiles dans:

$ perldoc perlsec


Bonjour Jérémy, perlsec n'en dit pas plus sur system(), voir le problème
d'UID réels et effectif ci-dessus ( $< = $> ).

Merci.

C. Tobini

1 2