Question:
L'autorisation d'exécution Unix peut être facilement contournée. Est-ce superflu ou quelle est l'intention derrière cela?
Martin Erhardt
2014-09-02 04:28:07 UTC
view on stackexchange narkive permalink

L'autorisation de lecture unix est en fait la même que l'autorisation d'exécution, donc si par exemple un processus a un accès en écriture, il est également capable d'exécuter le même fichier.

Cela peut être fait assez facilement: d'abord ce processus doit charger le contenu du fichier, qui doit être exécuté, dans un tampon. Ensuite, il appelle une fonction depuis une bibliothèque partagée qui analyse l'ELF dans le tampon et le charge aux bonnes adresses (probablement en écrasant l'ancien processus comme d'habitude, lors de l'appel de execvp). Le code saute au point d'entrée du nouveau programme et il est en cours d'exécution.

Je suis presque sûr que Dennis Ritchie et Ken Thompson étaient au courant de ce problème. Alors pourquoi ont-ils même inventé cette autorisation, quelle est l'intention derrière elle et quel en est le sens, si elle ne peut empêcher l'exécution d'un processus d'un utilisateur ayant un accès en lecture? Existe-t-il même un tel sens ou est-ce superflu?

Cela pourrait-il même être un problème de sécurité sérieux, existe-t-il des systèmes qui reposent sur la force des autorisations rw- ou r-?

Un point important est que _toutes_ les méthodes de contournement de -x ignoreront les privilèges élevés (bit setuid, capacités de fichier, règles basées sur les chemins) dont dispose le programme d'origine.
Je suis étonné du vote, etc. ici. La seule bonne réponse est un commentaire.
Pourquoi devrais-je faire tout mon possible pour exécuter un fichier que je ne veux pas exécuter?
jjanes Eh bien, j'ai pensé que ce serait une sorte de problème de sécurité, si les utilisateurs sont capables d'exécuter des programmes auxquels ils ne sont pas autorisés.
@MartinErhardt: Cela ne devient un problème de sécurité que si le programme peut _en faire plus_ que ce que l'utilisateur pourrait normalement faire par d'autres méthodes. Par exemple, Wireshark installe `/ usr / bin / dumpcap` avec des privilèges élevés (bit setuid ou privilège` cap_net_raw`), donc en l'exécutant un utilisateur pourrait faire des choses (capturer le trafic réseau) que le système d'exploitation ne permettrait pas directement. Bien sûr, seuls les membres du groupe 'wirehark' ont la permission + x; tous les autres utilisateurs ne peuvent lire que le programme.
@MartinErhardt: Vous pourriez trouver [ces messages Old New Thing] (https://www.google.com/search?q=site%3Ablogs.msdn.com%2Fb%2Foldnewthing%2F+airtight+hatchway) intéressants, en particulier [this] (http://blogs.msdn.com/b/oldnewthing/archive/2009/04/09/9539191.aspx) ou [this] (http://blogs.msdn.com/b/oldnewthing/archive/2008/ 05/16 / 8510192.aspx), avec des exemples de choses qui ressemblent à des problèmes de sécurité, mais ne vous laissez pas vraiment faire autre chose que d'habitude.
Six réponses:
Mark
2014-09-02 06:40:42 UTC
view on stackexchange narkive permalink

Il existe un moyen encore plus simple de contourner l'autorisation "exécuter": copiez le programme dans un répertoire que vous possédez et définissez le bit "exécuter".

La permission "exécuter" n'est pas une mesure de sécurité . La sécurité est fournie à un niveau inférieur, le système d'exploitation limitant des actions spécifiques. Ceci est fait parce que, sur de nombreux systèmes de type Unix (en particulier à l'époque de Ritchie et Thompson), on suppose que l'utilisateur est capable de créer ses propres programmes. Dans une telle situation, utiliser la permission "exécuter" comme mesure de sécurité est inutile, car l'utilisateur peut simplement créer sa propre copie d'un programme sensible.

À titre d'exemple concret, exécuter fdisk en tant qu'utilisateur non privilégié pour essayer de brouiller la table de partition du disque dur:

  $ / sbin / fdisk / dev / sda Bienvenue dans fdisk (util-linux 2.24.1). Ne restez en mémoire que jusqu'à ce que vous décidiez de les écrire.Faites attention avant d'utiliser la commande d'écriture .... Changement du type de partition 'Linux' en 'Hidden NTFS WinRE'.Commande (m pour l'aide): wfdisk: échec d'écriture de disklabel : Mauvais descripteur de fichier  

Cette dernière ligne est fdisk essayant d'obtenir un descripteur de fichier "écriture" pour le disque dur et échoue, car l'utilisateur que j'exécute il n'a pas la permission de faire cela.

Le but de la permission "exécuter" est double: 1) pour dire au système d'exploitation quels fichiers sont des programmes, et 2) pour dire à l'utilisateur quels programmes ils peuvent exécuter. Ces deux éléments sont plus consultatifs qu'obligatoires: vous pouvez créer un système d'exploitation parfaitement fonctionnel sans autorisation, mais cela améliore l'expérience utilisateur.

Comme R .. le souligne, il existe un cas particulier où le "execute "l'autorisation est utilisée pour la sécurité: lorsqu'un programme a également le bit" setuid "défini. Dans ce cas, l'autorisation «exécuter» peut être utilisée pour restreindre les personnes autorisées à exécuter le programme. Toute méthode de contournement de l'autorisation "execute" supprimera également le statut "setuid", il n'y a donc aucun risque de sécurité ici.

Remarque `bash script.sh` n'a pas besoin de permission d'exécution sur` script.sh`. Le fichier est simplement lu par le shell, techniquement.
Volker Siegel plus précisément le shell se fourche et dup2 le fichier de script donné en argument à 0, s'il y a une permission d'exécution et aucune magie ELF.
Ainsi, l'objectif le plus important dans la pratique de l'autorisation d'exécution aujourd'hui est de dire au shell qu'un fichier est un script exécutable, mais il ne peut pas être exécuté comme un binaire avec execve.
Un autre objectif important est de définir une autorisation d'exécution sans autorisation de lecture pour empêcher les utilisateurs de lire ou de copier le binaire, comme l'a déclaré Guntram Blohm.
Le bit d'exécution vous permet également de rendre lisible un fichier avec le bit `setuid` sans permettre à l'utilisateur de l'exécuter en tant que propriétaire du fichier. Je ne sais pas pourquoi vous voudriez faire cela, mais cela sert de mesure de sécurité dans ce cas.
@AaronDufour: Vous pouvez avoir un processus `setuid` exécutable par groupe et pas par d'autres.
En fait, l'utilisation de l'autorisation d'exécution avec setuid est peut-être l'utilisation la plus importante du bit + x. Il est malheureux que la réponse acceptée ne le mentionne même pas.
@R .., est-il utile d'avoir un fichier avec le bit setuid mais * pas * le bit d'exécution?
@Mark: Il existe plusieurs bits d'exécution: utilisateur, groupe et monde. Comme Jan Hudec l'a noté, il est très courant de créer des binaires setuid qui ne sont exécutables que par un groupe particulier. Bien sûr, sur un système avec des ACL, vous pouvez également utiliser une ACL explicite pour contrôler qui a l'autorisation + x.
Eh bien, Simon Richter a déjà souligné cela dans notre discussion sudo ci-dessous, mais il est bon de l'avoir dans la réponse finale acceptée, car cela semble être un objectif très important de cette autorisation.
@JanHudec J'avais l'intention de sous-entendre que c'était le cas utile. Les votes montrent clairement que j'ai mal communiqué, alors merci d'avoir rendu cela explicite.
"Toute méthode de contournement de l'autorisation" execute "supprimera également le statut" setuid ", il n'y a donc aucun risque de sécurité ici." - C'est vrai, mais sans importance, puisque l'utilisateur qui effectue la copie peut réinitialiser le bit `setuid`. L'important est que la copie soit la propriété d'un autre utilisateur (à savoir, l'utilisateur copieur), donc même avec le bit `setuid` défini, elle ne permet pas à cet utilisateur de l'exécuter en tant que propriétaire du fichier d'origine.
Comme Helfire vient de le souligner, l'autorisation d'exécution peut être très importante en termes de sécurité, car une autorisation manquante empêche les utilisateurs de passer dans un répertoire.
Ce serait bien si vous pouviez énumérer tous ces cas d'utilisation dans votre première réponse (1., 2.).
Je n'ai pas couvert + x appliqué aux répertoires car la question concernait + x appliqué aux fichiers.
Guntram Blohm supports Monica
2014-09-02 13:07:24 UTC
view on stackexchange narkive permalink

Vous pouvez définir le bit d'exécution, mais pas le bit de lecture, sur un fichier exécutable. De cette façon, personne ne pourra copier le fichier, mais les gens peuvent quand même l'exécuter.

C'est assez inutile aujourd'hui, car a) cela fonctionne uniquement pour les programmes compilés, pas avec des scripts (sur la plupart des systèmes) ; b) ces jours-ci, 90% de tous les Unix étant Linux, les gens peuvent copier des exécutables à peu près n'importe où, et c) l'espace disque occupé par un exécutable copié n'a pas vraiment d'importance.

Pourtant, il y avait utilise pour cela dans l'ancien temps.

Le système Unix que j'utilisais à l'école, il y a 30 ans, était très limité en RAM et en espace disque. Surtout, le système de fichiers / usr / tmp était très petit, ce qui posait des problèmes lorsque quelqu'un essayait de compiler un gros programme. Bien sûr, les étudiants n'étaient pas censés écrire de «grands programmes» de toute façon; les grands programmes étaient généralement des codes source copiés «quelque part». Beaucoup d'entre nous ont copié / usr / bin / cc dans / home / <myname> / cc , et utilisé dd pour patcher le binaire afin d'utiliser / tmp au lieu de / usr / tmp , qui était plus gros. Bien sûr, cela n'a fait qu'aggraver le problème - l'espace disque occupé par ces copies importait à l'époque, et maintenant / tmp se remplissait régulièrement, empêchant même les autres utilisateurs de modifier leurs fichiers. Après avoir découvert ce qui s'était passé, les administrateurs système ont fait un chmod go-r / bin / * / usr / bin / * qui a "résolu" le problème et supprimé toutes nos copies du compilateur C.

Une autre utilisation est d'indiquer au shell quels fichiers sont destinés à être exécutés et lesquels ne le sont pas. Vous ne voulez pas qu'un fichier texte aléatoire soit exécuté parce que vous avez tapé son nom; le bit x fournit un moyen d'éviter cela. (De nos jours, le shell pouvait simplement regarder le début du fichier, et ne l'exécuter que s'il commence par #! , mais cela a été introduit beaucoup plus tard). La fonction de complétion de bash , également, suggérera des fichiers avec des bits exécutables uniquement lorsque vous tapez une commande.

Le fichier commençant par "#!" s'appelle shebang n'est-ce pas?
Les shebangs indiquent seulement quel interpréteur doit être utilisé pour interpréter, ils ne disent pas au shell que le programme est un script et peut être exécuté, mais il ne peut pas être exécuté par le système d'exploitation en utilisant exec *. La permission d'exécution est donc toujours nécessaire dans ce cas.
Oui, j'accorde toujours au moins à [Noone] (http://en.wikipedia.org/wiki/Peter_Noone) des autorisations de lecture sur les systèmes que je gère.
Et le problème d'exécution accidentelle a été aggravé par le fait qu'à cette époque, il était considéré normal d'avoir `.` dans` $ PATH`, donc les programmes du répertoire courant pouvaient être exécutés en tapant leurs noms sans `. /` préfixe.
Notez que les shells (et execvp (), env, xargs, find -exec ...) sont _meant_ pour exécuter des fichiers texte exécutables sans `#!` Avec `sh`. En fait, c'est la seule façon d'exécuter des scripts spécifiés par POSIX et la spécification Unix. Notez que sous Linux, `.` est toujours devant le PATH par défaut que vous obtenez (pour execvp ()) lorsque le PATH env var n'est pas défini.
Ne pourriez-vous pas attacher un débogueur au processus ou même démarrer l'exécutable avec `LD_PRELOAD` et vider l'image principale à partir de là, même si le bit de lecture n'est pas défini?
Simon Richter
2014-09-02 20:46:22 UTC
view on stackexchange narkive permalink

Il existe une manière toute faite d'exécuter un fichier arbitraire: passez-le comme argument à l'éditeur de liens dynamique (qui est l'interpréteur approprié pour un exécutable chargé dynamiquement). Par exemple. sous Linux,

  cp / bin / ls / tmp / chmod -x /tmp/ls/lib/ld-linux.so.2 / tmp / ls  

Cependant, cela vient avec la même restriction que la lecture du fichier et le passage au code: les bits setuid ne sont pas évalués.

Dans l'ancien temps, nous avions souvent ont des binaires comme /bin/su:

  -rwsr-xr-- root wheel ... / bin / su  

Seuls les membres du groupe wheel , que les administrateurs système ont coupé aux personnes connaissant le mot de passe root pourraient même exécuter la commande su , donc même si un buffer overflow existait dans ce binaire, permettant aux appelants de contourner la sécurité, l'exploit ne serait utilisable que par des personnes qui connaissent le mot de passe de toute façon.

Je connais ce truc de roue depuis que j'ai configuré archlinux la première fois. Une chose que je ne comprends pas à propos de votre question est, pourquoi il y a un besoin d'un dépassement de tampon dans su pour être exécuté. J'ai pensé qu'il pouvait être facilement exécuté par chaque utilisateur en utilisant la méthode de l'éditeur de liens dynamique mentionnée ci-dessus?
Oui, mais il serait exécuté sans setuid, en tant qu'utilisateur appelant, ce qui le rendrait inutile pour l'attaque.
user54909
2014-09-03 23:42:55 UTC
view on stackexchange narkive permalink

Je suis surpris que personne d'autre n'ait fait référence à une autre utilisation de + x bit: directory. Peut-être que vous êtes après l'exécution (exemple) de quelque chose dans / bin (script shell ou autre), mais il y a plus à exécuter des bits que des fichiers (bien sûr, un répertoire EST un fichier mais c'est un type de fichier différent).

Si vous avez un accès + x sur un répertoire mais -r sur ce même répertoire, alors vous aurez les capacités suivantes:

  • Si vous connaissez le nom d'un fichier ( ou répertoire) dans ce répertoire, vous pouvez le lister (par exemple, ls dessus). Vous devez cependant connaître le nom.
  • Vous ne pouvez pas le modifier (via la commande cd ou l'appel système chdir).

Si toutefois, vous avez -x et + r, vous pouvez faire ce qui suit:

  • Vous ne pouvez pas accéder au répertoire (de la même manière que ci-dessus).
  • Vous pouvez lister les fichiers. Mais comme vous n'avez pas accès + x au répertoire, vous ne pouvez pas accéder aux fichiers eux-mêmes.
  • Cela signifie également que vous ne pouvez pas mettre à jour (horodatage uniquement ou autre) et vous ne pouvez pas non plus les ouvrir dans un éditeur de texte (ou cat, ou ...).

Si vous avez + rx alors vous pouvez faire tout cela (sauf que vous avez besoin de + w pour écrire dans le répertoire lui-même, c'est-à-dire créer de nouveaux fichiers; l'édition de fichiers fonctionne, la suppression ne fonctionne pas, la création ne fonctionne pas)

Et oui, cela signifie qu'il est possible que certaines personnes visualisent ou modifient des fichiers, mais seulement si elles connaissent le chemin exact de celui-ci ( tant qu'ils ont le droit de modifier, de toute façon). Et oui: ls est une liste et cela vaut pour la recherche de répertoires. Donc en résumé: exécuter un répertoire, c'est le changer (pour une raison quelconque). Bien sûr, ce qui compte vraiment, c'est ce qui compte vraiment.

kasperd
2014-09-02 17:40:28 UTC
view on stackexchange narkive permalink

Si, pour une raison quelconque, vous souhaitez garder le code binaire secret, vous pouvez rendre le programme exécutable sans être lisible. Cela n'est pas utile si ces utilisateurs ont un accès physique à la machine. Cela n'est pas non plus utile si le code source ou binaire est largement disponible. C'est donc un cas d'utilisation assez limité.

Si le programme a un bit setuid ou setgid, l'accès d'exécution fait quelque chose de plus que ce qui peut être réalisé en lisant le binaire. Une approche consiste à créer un exécutable setuid qui n'est exécutable que pour un groupe spécifique. S'il était lisible partout dans le monde, les personnes extérieures à ce groupe ne pouvaient toujours pas le copier et utiliser le bit setgid sur l'exécutable d'origine. (Bien que dans la plupart des cas, je préfère utiliser setgid plutôt que setuid, puis utiliser le groupe du répertoire pour contrôler qui peut accéder à l'exécutable.)

Habituellement, le bit exécutable est simplement utilisé pour indiquer quels fichiers sont des programmes en premier lieu. De cette façon, la complétion peut mieux fonctionner et vous n'exécutez pas les exécutables indésirables par accident.

Si vous voulez empêcher les utilisateurs de copier un exécutable et de l'exécuter, vous pouvez monter des répertoires personnels avec noexec . Pour que cela ait un sens, vous devez utiliser noexec pour chaque système de fichiers, où l'utilisateur peut écrire n'importe quoi.

Cela n'est également pas utile si l'utilisateur sait utiliser un débogueur.
@NateEldredge De toute évidence, seul root a la permission d'attacher un débogueur à un exécutable suid ou sgid. Si vous attachez le débogueur avant d'exécuter l'exécutable, suid et sgid sont simplement ignorés. Si vous exécutez d'abord l'exécutable suid ou sgid et essayez d'attacher un débogueur plus tard, l'exécutable ne sera pas autorisé à s'attacher. Pour les fichiers sans autorisation de lecture, la situation est moins claire.
@NateEldredge Pour un exécutable en cours d'exécution sur lequel vous ne disposez pas des autorisations de lecture, l'attachement d'un débogueur n'est pas autorisé. Mais si vous attachez d'abord un débogueur, puis exécutez un exécutable que vous avez l'autorisation d'exécuter mais pas de lire, il est exécuté. Mais cela signifie que le débogueur pourrait accéder de manière triviale à toutes les pages mappées à partir de l'exécutable. Cela semble être une violation claire du manque d'autorisations de lecture. Est-ce un bogue ou est-ce spécifié par une norme?
http://unix.stackexchange.com/questions/153471/tracing-executable-without-read-permissions
* Aucune * mesure de sécurité n'est utile si l'utilisateur a un accès physique à la machine.Eh bien, je veux dire qu'ils sont utiles pour garder les gens honnêtes honnêtes (comme un cadenas sur une porte facilement cassable), mais si quelqu'un veut vraiment entrer, cela ne les arrêtera pas.Mais c'est vrai pour toutes les mesures de sécurité techniques, pas seulement `-r + x`.
Luis Colorado
2014-09-04 17:07:46 UTC
view on stackexchange narkive permalink

L'autorisation d'exécution du bit est vérifiée par le noyau lors de l'exécution de l'appel système exec (2) (et ses cousins). Vous n'en aurez besoin que pour exécuter des programmes au niveau du noyau.

Seuls les programmes avec ce bit activé (quel que soit le résultat qui vous est attribué en tant que propriétaire, groupe ou autre est ce qui est vérifié) peuvent être exec () ed par le noyau.

Une autre chose différente est ce que fait le shell lors de l'interprétation d'un script shell ou perl, ou quel que soit l'interpréteur que vous avez. Sur les scripts, le noyau vérifie le #! ... au début du fichier comme un nombre magique, et lance le shell indiqué ici (vous aurez également besoin d'une autorisation d'exécution pour le shell), et vous ont besoin des autorisations de lecture sur ce script, car le shell doit l'ouvrir et le lire pour être interprété. Pour les scripts shell, vous aurez besoin d'une autorisation de lecture ainsi que d'une autorisation d'exécution. Mais pour les scripts shell, vous avez uniquement besoin d'une autorisation de lecture, car vous pouvez toujours exécuter un script shell en exécutant le shell et en passant le script shell en tant que paramètre (ou fichier d'entrée )

Bien sûr, comme cela a été indiqué, le bit d'exécution peut être contourné en copiant le programme et en le rendant exécutable, mais vous ne pourrez pas le copier si vous n'avez pas lu autorisations pour faire cette copie (vous continuez à pouvoir l'exécuter).

Essayez de changer (en tant que root bien sûr) les autorisations en ls (1) et faites-en 0111 ( --- x - x - x ) et essayez d'en faire une copie exécutable, et voyez comment vous ne pouvez pas obtenir votre copie exécutable, même si vous continuez à pouvoir l'exécuter.

Sur les répertoires, exécuter bit signifie une chose différente. Le noyau utilise l'autorisation ' x ' lors de l'itération dans le chemin (dans la fonction noyau namei () ) donc si vous n'avez pas les autorisations d'exécution sur un répertoire, vous ne soit l'utiliser, ni les fichiers accessibles par son intermédiaire. Même vous pouvez lire le contenu d'un répertoire avec des autorisations de lecture, mais vous ne pouvez pas accéder aux fichiers qu'il contient. Ou au contraire, vous pouvez avoir des autorisations d'exécution sur un répertoire mais pas un accès en lecture, et vous pourrez utiliser les fichiers à l'intérieur, mais vous ne pourrez pas voir le contenu du répertoire.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...