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

10 réponses

1 2
Avatar
TiChou
Dans le message <news:ciea6k$cg9$,
*C. Tobini* tapota sur f.c.o.l.configuration :

Bonjour,


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 ?


Si vous utilisez l'interpréteur '/usr/bin/perl', alors votre script ne peut
pas être setuid et s'exécuter avec les droits root. Il faut alors utiliser
l'interpréteur '/usr/bin/suidperl'.
Vous pouvez vérifier à tout moment dans votre script les droits réels dont
vous disposez avec les variables perl $< (real user id) et $> (effective
user id), par exemple en insérant ces lignes de debug :

print "UID = $<n";
print "EUID = $>n";

Sinon, il vous reste la solution sudo.

Merci.


De rien.

--
TiChou

Avatar
C. Tobini
TiChou wrote:
[] par exemple en insérant ces lignes de debug :

print "UID = $<n";
print "EUID = $>n";


Bonjour et merci de la réponse.

J'ai le même résultat en invoquant suidperl, j'ai introduit les lignes
ci-dessus dans mon script (au niveau du script principal et de la
fonction invoquant iwconfig. Dans les 2 cas, j'ai 501 pour l'UID et 0
pour l'UID effectif, le script s'exécute bien en root apparement.

Je ne comprend alors pas la raison pour laquelle j'ai 'Operation not
permitted' à chaque apppel de iwconfig...

Avatar
Nicolas George
"C. Tobini" wrote in message <cieslr$3hp$:
Je ne comprend alors pas la raison pour laquelle j'ai 'Operation not
permitted' à chaque apppel de iwconfig...


Comment appelles-tu cet iwconfig, exactement ?

Avatar
C. Tobini
Nicolas George wrote:
"C. Tobini" wrote in message <cieslr$3hp$:

Je ne comprend alors pas la raison pour laquelle j'ai 'Operation not
permitted' à chaque apppel de iwconfig...



Comment appelles-tu cet iwconfig, exactement ?


En faisant un appel :

system ( 'iwconfig wlan0 mode Managed' );

Pour la première ligne de configuration par exemple.


Avatar
Nicolas George
"C. Tobini" wrote in message <cih1lq$r1t$:
En faisant un appel :

system ( 'iwconfig wlan0 mode Managed' );


Hum. Dans ce cas, il n'y a pas de shell invoqué, donc mon hypothèse (bash
qui laisse tomber ses droits) tombe à l'eau.

Essaie de faire « $< = $>; » à tout hasard avant. Sinon, tu peux essayer
d'ajouter un « system "id"; » un peu avant pour chercher où tu perds les
droits.

Avatar
C. Tobini
Nicolas George wrote:
"C. Tobini" wrote in message <cih1lq$r1t$:

En faisant un appel :

system ( 'iwconfig wlan0 mode Managed' );



Hum. Dans ce cas, il n'y a pas de shell invoqué, donc mon hypothèse (bash
qui laisse tomber ses droits) tombe à l'eau.

Essaie de faire « $< = $>; » à tout hasard avant. Sinon, tu peux essayer
d'ajouter un « system "id"; » un peu avant pour chercher où tu perds les
droits.


Pour $> et $< c'est fait, dans le script principal et la fonction
appelant iwconfig et dans les 2 cas, je suis en UID root et EUID
utilisateur.


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

Nicolas George wrote:
Essaie de faire « $< = $>; » à tout hasard avant. Sinon, tu peux essayer
d'ajouter un « system "id"; » un peu avant pour chercher où tu perds les
droits.


Pour $> et $< c'est fait, dans le script principal et la fonction
appelant iwconfig et dans les 2 cas, je suis en UID root et EUID
utilisateur.


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";

--
TiChou


Avatar
Hugues
Ce cher "C. Tobini" a dit :

Nicolas George wrote:
"C. Tobini" wrote in message <cih1lq$r1t$:

En faisant un appel :

system ( 'iwconfig wlan0 mode Managed' );
Hum. Dans ce cas, il n'y a pas de shell invoqué, donc mon hypothèse

(bash
qui laisse tomber ses droits) tombe à l'eau.
Essaie de faire « $< = $>; » à tout hasard avant. Sinon, tu peux
essayer
d'ajouter un « system "id"; » un peu avant pour chercher où tu perds les
droits.


Pour $> et $< c'est fait, dans le script principal et la fonction
appelant iwconfig et dans les 2 cas, je suis en UID root et EUID
utilisateur.


(désolé, mais je n'ai pas pu suivre le début de la conversation, je
n'arrive pas à repêcher le début du thread. Je vous prie donc de
m'excuser si je suis à côté de la plaque)

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.

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.


Encore une fois, toutes mes excuses si je suis à côté de la plaque (et
je vais tenter de changer de fournisseur nntp afin d'accéder aux
archives qui me manquent)

--
Hugues - Linux Addict



Avatar
C. Tobini
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.

La commande system 'id' retourne -1.

Avatar
C. Tobini
Hugues wrote:
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.


Bonjour et merci de ton intervention.

J'essaie d'exécuter un script Perl avec un suid. Normalement ça ne
devarit pas poser de problème, mais là il y en a un :-)

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


C'est pas grave, tu m'as appris qu'il faut éventuellement des routines C
pour les droit root et également l'adresse d'un très bon tutoriel :-)

1 2