Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Executable sans droit de lecture

7 réponses
Avatar
Dam
Bonjour,

j'ai un fichier toto.sh et j'aimerais que des personnes x puissent
ex=E9cuter ce script sans pouvoir le lire.
Pour le moment dans mon compte moi j'ai le fichier toto.sh dont je
positionne les droits suivants : "rwx--x--x". Ensuite dans le home de
toi (/home/toi), je cr=E9=E9 un lien symbolique vers ce script : "ln -s
.=2E/moi/toto.sh toto"
Par contre impossible pour toi d'ex=E9cuter toto.sh sans positionner les
droits en lecture (ce qui peut se comprendre) et c'est l=E0 que =E7a
m'embete. J'aimerais que toi ne puisse pas lire le contenu du fichier
toto.sh.
Il doit bien y avoir une possibilit=E9s mais laquelle?

Merci

7 réponses

Avatar
Laurent Wacrenier
Dam écrit:
Par contre impossible pour toi d'exécuter toto.sh sans positionner les
droits en lecture (ce qui peut se comprendre) et c'est là que ça
m'embete. J'aimerais que toi ne puisse pas lire le contenu du fichier
toto.sh.
Il doit bien y avoir une possibilités mais laquelle?


Éventuelement, un wrapper en C.

Avatar
Pascal Bourguignon
"Dam" writes:
j'ai un fichier toto.sh et j'aimerais que des personnes x puissent
exécuter ce script sans pouvoir le lire.
Pour le moment dans mon compte moi j'ai le fichier toto.sh dont je
positionne les droits suivants : "rwx--x--x".
Ensuite dans le home de
toi (/home/toi), je créé un lien symbolique vers ce script : "ln -s
../moi/toto.sh toto"
Par contre impossible pour toi d'exécuter toto.sh sans positionner les
droits en lecture (ce qui peut se comprendre) et c'est là que ça
m'embete. J'aimerais que toi ne puisse pas lire le contenu du fichier
toto.sh.
Il doit bien y avoir une possibilités mais laquelle?


Directement, pour un script, ce n'est pas possible: il faut que
l'interpréteur puisse lire le fichier script!

Indirectement, c'est possible:

$ cat /home/owner/src/wrapper.c

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

#ifndef SCRIPT_PATH
#error "SCRIPT_PATH is undefined."
#endif
#ifndef SCRIPT_NAME
#error "SCRIPT_PATH is undefined."
#endif

int main(int argc,char** argv){
extern char **environ;
char pid[64],gid[64],epid[64],egid[64];
snprintf(pid,64,"PID=%d",getuid());
snprintf(gid,64,"GID=%d",getgid());
snprintf(epid,64,"EPID=%d",egetuid());
snprintf(egid,64,"EGID=%d",egetgid());
putenv(pid); putenv(gid); putenv(epid); putenv(egid);
setreuid(geteuid(),geteuid()); umask(0022);
return(execl(SCRIPT_PATH,SCRIPT_NAME,0,environ)); }

$ gcc -DSCRIPT_PATH="/home/owner/secret/script"
-DSCRIPT_NAME="script"
-o /home/owner/script
/home/owner/src/wrapper.c

$ cat /home/owner/secret/script
#!/bin/bash
echo "effective user = $EUID"
echo "effective group = $EGID"
echo "caller user = $UID"
echo "caller group = $GID"

$ chmod 700 /home/owner/secret
$ chmod 700 /home/owner/secret/script
$ chmod 4111 /home/owner/script

$ sudo toi ln -s /home/owner/script /home/toi/script

Ainsi, toi ne peut pas lire ni /home/owner/secret/script ni /home/owner/script
mais il peut exécuter /home/owner/script.

Le wrapper peut même filter les utilisateurs qui accèdent au script,
en testant le pid et gid, ce qui permet de ne donner accès à
secret/script qu'à des utilisateurs bien précis.

--
__Pascal Bourguignon__ http://www.informatimago.com/
Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we. -- Georges W. Bush

Avatar
Nicolas George
Pascal Bourguignon wrote in message
:
snprintf(epid,64,"EPID=%d",egetuid());
snprintf(egid,64,"EGID=%d",egetgid());


geteuid, getegid, peut-être ?

putenv(pid); putenv(gid); putenv(epid); putenv(egid);


#include <stdlib.h>

return(execl(SCRIPT_PATH,SCRIPT_NAME,0,environ)); }


execle, ou environ ne sert à rien.

Ainsi, toi ne peut pas lire ni /home/owner/secret/script ni /home/owner/script
mais il peut exécuter /home/owner/script.


Ça veut quand même dire que le script tournera avec les droits du
propriétaire du wrapper. Une autre méthode de procéder serait d'ouvrir le
script et d'exécuter l'interpréter sur un /dev/fd/x, mais dans ce cas, on
est vulnérable à un attachement de l'interpréteur par un ptrace quelconque.

Avatar
Dam
Je pensais bien à ça aussi mais je me demandais s'il y avait plus
simple...
A priori non... :(

Merci pour votre aide !
Avatar
Dam
C'est OK, mais la script.sh appelé n'écrit pas sur la sortie
standard... Et j'arrive pas à ce que ça le fasse...

Une idée?

Merci
Avatar
Pascal Bourguignon
"Dam" writes:

C'est OK, mais la script.sh appelé n'écrit pas sur la sortie
standard... Et j'arrive pas à ce que ça le fasse...

Une idée?


Ce n'est pas la faute au wrapper puisqu'il ne modifie pas les file descriptors.

Il faut voir comment il est appelé.

Sur linux, tu peux aussi voir l'état des file descriptors en mettant
dans le script:

ls -l /proc/self/fd/ > /tmp/script-fd.txt


--
__Pascal Bourguignon__ http://www.informatimago.com/
Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we. -- Georges W. Bush

Avatar
Dam
Bon, j'en ai eu marre, et j'ai converti mon script.sh en script.c puis
compilé et puis voilà...

Merci à tous.