Qu'est-ce qu'un cas d'utilisation valide pour une autorisation de fichier «exécuter uniquement»?

20

Je lisais sur chmod et ses modes octaux . J'ai vu que 1c'est exécuter uniquement. Qu'est-ce qu'un cas d'utilisation valide pour une autorisation d'exécution uniquement? Pour exécuter un fichier, on voudrait généralement une autorisation de lecture et d'exécution.

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo
popedotninja
la source

Réponses:

41

Les scripts shell nécessitent l'autorisation de lecture pour être exécutés, mais les fichiers binaires ne le font pas:

$ cat hello.cpp
#include<iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission

L'affichage du contenu d'un fichier et son exécution sont deux choses différentes. Avec les scripts shell, ces choses sont liées car elles sont "exécutées" en les "lisant" dans un nouveau shell (ou le shell actuel), si vous pardonnez la simplification. C'est pourquoi vous devez pouvoir les lire. Les binaires n'utilisent pas ce mécanisme.

Pour les répertoires, l'autorisation d'exécution est un peu différente; cela signifie que vous pouvez effectuer des opérations sur les fichiers de ce répertoire (par exemple, les lire ou les exécuter). Supposons donc que vous ayez un ensemble d'outils en ce sens /toolsque vous voulez que les gens puissent l'utiliser, mais seulement s'ils les connaissent. chmod 711 /tools. Ensuite, les choses exécutables /toolspeuvent être exécutées explicitement (par exemple /tools/mytool), mais ls /tools/seront refusées. De même, des documents pourraient être stockés dans /private-docslesquels pourraient être lus si et seulement si les noms de fichiers sont connus.

DopeGhoti
la source
1
Soit dit en passant, il est inutile de définir l'exécution uniquement sur les binaires du système, sauf si vous exécutez ftp anonyme.
Joshua
1
En outre, la définition du bit exécutable sur un répertoire vous permet de le cdfaire.
gardenhead
1
Un script peut également être exécuté pour s'exécuter sans autorisation de lecture
phuclv
1
BTW, Il n'est pas nécessaire d'inclure l'en-tête C stdio.hici. Je suggère de le retirer.
Spikatrix
1
@Kevin: Probablement parce que le fait de ne pas avoir de lstravail de complétion et de tabulation rend le travail de maintenance ennuyeux, et il offre peu ou pas d'avantages de sécurité réels. La plupart des fichiers qui pourraient intéresser un attaquant se trouvent de toute façon à des emplacements standard connus, ou leurs emplacements peuvent être découverts indirectement à partir de données dans d'autres fichiers (sinon comment les programmes qui utilisent légitimement ces fichiers sauraient-ils où les trouver?).
Ilmari Karonen
4

Sur Gentoo, les programmes exécutables setuid (configurés pour s'exécuter avec les autorisations de leur propriétaire au lieu de leur invocateur) se voient refuser l'accès en lecture (mode 4711). Il s'agit d'ajouter une couche de protection contre l'exploitation des bogues pour faciliter l'escalade de privilèges.

Si un attaquant non privilégié peut lire un fichier setuid, et qu'il connaît un bogue qui permet une attaque de retour à la libc , il pourra peut-être utiliser le contenu du fichier pour prédire où certaines fonctions ou bibliothèques utiles sont susceptibles de se trouver. placé en mémoire lorsque le programme est appelé.

Les systèmes modernes incluent souvent des protections supplémentaires plus efficaces, comme l' ASLR , mais les restrictions présentes dans les plates-formes 32 bits peuvent les rendre plus facilement exploitables.

Personne
la source
Notez que la protection s'applique uniquement aux distributions basées sur la source. Avec les distributions basées sur les binaires, l'attaquant peut simplement regarder sa propre copie du programme pour découvrir où se trouvent les choses intéressantes.
Mark
Un binaire exécutable uniquement peut également avoir des mots de passe intégrés. L'utilisateur peut exécuter le programme et il peut envoyer le mot de passe au serveur, mais l'utilisateur ne pourra pas en obtenir le mot de passe (le système ne devrait pas non plus lui permettre de faire des vidages mémoire).
Barmar
1

Il semble que la valeur de "exécuter uniquement" n'ait pas beaucoup d'utilité pour un fichier, mais elle peut être utilisée pour empêcher l'un de lire le contenu d'un répertoire.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
popedotninja
la source
1
Il convient de mentionner que la raison pour laquelle cela est utile est que vous pouvez toujours lire foo / bar si vous connaissez le nom de fichier. Je l'ai utilisé sur des serveurs Web.
Random832
0

Vous devez avoir des autorisations de lecture et d'exécution pour exécuter un script. La lecture du contenu d'un script est ce qui lui permet de s'exécuter, vous devez donc pouvoir le faire read and execute. Sinon, vous ne pouvez pas exécuter un script sans lui.

Qu'est-ce qu'un cas d'utilisation valide pour une autorisation d'exécution uniquement?

Sécurité. Certains peuvent vouloir protéger leurs fichiers et empêcher d'autres de les exécuter ou de les utiliser.

Jordan Savell
la source
2
chmod 000Considérerons autorisations à personne , sauf root. Parfois, vous n'avez pas besoin d'aller aussi loin que pour la protection - cela dépend des intentions de l'utilisateur. Afin de, disons "re-chmod" le fichier revenir à des autorisations lisibles et inscriptibles que vous auriez à faire à travers root. Si vous n'êtes pas en mesure d'accéder root, cela se révélera difficile.
Jordan Savell
2
Supposons que vous ayez un ensemble d'outils en ce sens /toolsque vous voulez que les gens puissent l'utiliser, mais seulement s'ils les connaissent. chmod 711 /tools. Ensuite , les choses exécutables en /tools peuvent être exécutés de façon explicite, mais ls /tools/sera refusée.
DopeGhoti
1
Bonne réponse! J'ai aussi appris quelque chose là-bas. Pourquoi les fichiers binaires n'ont-ils pas besoin de l'autorisation de lecture pour être exécutés?
Jordan Savell
2
Parce que l'affichage du contenu d'un fichier et son exécution sont deux choses différentes. Les scripts shell sont "exécutés" en les "lisant" dans un nouveau shell (si vous pardonnez la simplification), c'est pourquoi vous devez pouvoir les lire. Les binaires n'utilisent pas ce mécanisme.
DopeGhoti
1
Ah le bon sens. Je pensais que c'était quelque chose de différent - merci!
Jordan Savell