Re: Exécute r un bash script depuis un script PHP

Page principale

Répondre à ce message
Auteur: Edgar Bonet
Date:  
À: guilde
Anciens-sujets: Re: Exécuter un bash script depuis un script PHP
Sujet: Re: Exécute r un bash script depuis un script PHP
Le vendredi 26 septembre, p.karatchentzeff@??? a écrit :
> Non *si* le script est setuid, on peut détourner l'appel au shell
> entre le moment où on l'appelle et le moment où le noyau envoie
> réellement la requête au shell.


Tu veux dire : entre le moment où le noyau lance le shell et le moment
où celui-ci lit le script.

> Lire la partie setuid dans la doc de Perl...


Je lis :

    In recent years, vendors have begun to supply systems free of
    this inherent security bug.


Je croyais que Linux faisait partie des systèmes en question. Je ne sais
plus où j'ai lu ça, je peux me tromper.

Mais là tu parles du problème général des script suid, je ne vois pas le
rapport avec le problème qui nous occupe et qui n'est pas suid.

>            system "echo $arg";         # Insecure
>            system "/bin/echo", $arg;   # Allowed but considered insecure
>                                        # (Perl doesn't know about /bin/echo)
>            exec "sh", '-c', $arg;      # Considered secure, alas!

>
> dans le premier cas, l'exécution aveugle de $arg peut-être
> catastrophique


pour deux raisons :
  - echo peut être n'importe quoi, pas forcément /bin/echo, ça dépend du
    PATH ;
  - $arg peut contenir des métacaractères du shell : "adieu!; rm -rf /".


Si tu écris

    system "/bin/echo $arg";


tu élimines le premier problème (tu appelles bien /bin/echo) mais pas le
deuxième.

> et dans le second cas, le /bin/echo peut être n'importe quoi.


Non ! Le chemin est complètement qualifié, donc c'est bien /bin/echo.
Par ailleurs, tu élimines aussi le deuxième problème du fait qu'avec
cette syntaxe Perl n'appelle pas le shell :

    $arg = "adieu!; rm -rf /";
    system "/bin/echo", $arg;       # affiche "adieu!; rm -rf /"
    system "/bin/echo $arg";        # catastrophe


La deuxième commande ne présente pas de danger (je l'ai essayée). Elle
est autorisée par Perl 5.6.1 qui la qualifie dans la doc de « # Secure
(doesn't use sh) ». Elle est interdite par Perl 5.8.0 mais seulement
parce que Perl ne sait pas que /bin/echo ne fait rien de dangereux avec
son PATH : « Perl doesn't know about /bin/echo [...] Perl can't
guarantee that the executable in question isn't itself going to turn
around and execute some other program that is dependent on your PATH ».

Je ne pense pas que PHP connaisse cette subtile différence que fait Perl
entre

    system "/bin/echo", $arg;


et

    system "/bin/echo $arg";


donc à priori il faut toujours se méfier des métacaractères du shell
dans $arg (`;' dans notre exemple).

Pour revenir au problème de départ :

    system("/bin/sh /home/jabber/cmd.sh $argumentsh");


et

    system("/home/jabber/cmd.sh $argumentsh");


sont pour moi équivalents au niveau (in)sécurité :

  - /bin/sh est toujours /bin/sh (car le chemin est complètement
    qualifié), donc pas de problème à ce niveau ;


- /home/jabber/cmd.sh est toujours /home/jabber/cmd.sh -> pas de pb ;

  - si $argumentsh contient des métacaractères shell, problème dans les
    deux cas ;


  - si $PATH est non sûr _et_ utilisé de façon non sûre par
    /home/jabber/cmd.sh, problème dans les deux cas.


Donc je ne vois toujours pas l'intérêt d'expliciter /bin/sh, sauf bien
sûr si /home/jabber/cmd.sh n'est pas exécutable.

Edgar.

-- 
Edgar Bonet           Maison : 04 76 21 29 16    Bureau : 04 76 88 10 96
3 rue Jean Prévost    Mobile : 06 77 19 79 39    Fax    : 04 76 88 11 91
38000 Grenoble        guilde@???     www.edgar-bonet.org