Question:
accessibilité des variables d'environnement sous Linux
Yoav Aner
2012-04-20 22:47:40 UTC
view on stackexchange narkive permalink

C'est peut-être une question triviale, mais dans quelle mesure les variables d'environnement sous Linux sont-elles accessibles entre différents utilisateurs?

par exemple si Alice exécute

  export FAVORITE_FOOD = `cat /home/alice/fav_food.txt`

Eve peut-elle dire quel est le plat préféré d'Alice? (En supposant qu'Alice et Eve soient des utilisateurs normaux et qu'Eve n'a pas d'accès en lecture à /home/alice/fav_food.txt )

Cinq réponses:
Gilles 'SO- stop being evil'
2012-04-21 03:22:38 UTC
view on stackexchange narkive permalink

Trouvons le flux des données confidentielles. Dans cette analyse, il est entendu que tout ce qu'Alice peut faire, root peut aussi le faire. Un observateur externe «d'un niveau supérieur» (par exemple, avec un accès physique à la surveillance sur le bus de disque, ou dans l'hyperviseur si le code est en cours d'exécution dans la machine virtuelle) peut également accéder aux données.

Tout d'abord, les données sont chargées à partir d'un fichier. En supposant que seule Alice a l'autorisation de lecture sur le fichier et que le fichier n'est pas autrement divulgué, seule Alice peut appeler cat /home/alice/fav_food.txt avec succès. Les données sont alors dans la mémoire du processus cat , où seul ce processus peut y accéder. Les données sont transmises via un tube de la commande cat au shell appelant; seuls les deux processus impliqués peuvent voir les données sur le tuyau. Les données sont alors dans la mémoire du processus shell, encore une fois privé pour ce processus.

À un moment donné, les données finiront dans l'environnement du shell. En fonction du shell, cela peut se produire lorsque l'instruction export est exécutée, ou uniquement lorsque le shell exécute un programme externe. À ce stade, les données seront un argument d'un appel système execve . Après cet appel, les données seront dans l'environnement du processus enfant.

L'environnement d'un processus est tout aussi privé que le reste de la mémoire de ce processus (de mm->env_start à mm->env_end dans la carte mémoire du processus). Il est contigu à la pile du thread initial. Cependant, il existe un mécanisme spécial qui permet à d'autres processus de visualiser une copie de l'environnement: le fichier environ dans le répertoire / proc du processus ( / proc / $ pid / environ ). Ce fichier n'est lisible que par son propriétaire, qui est l'utilisateur exécutant le processus (pour un processus privilégié, c'est l'UID effectif). (Notez que les arguments de ligne de commande dans / proc / $ pid / cmdline , par contre, sont lisibles par tous.) Vous pouvez auditer la source du noyau pour vérifier que c'est le seul moyen de fuite l'environnement d'un processus.

Il existe une autre source potentielle de fuite de l'environnement: lors de l'appel execve . L'appel système execve ne fuit pas directement l'environnement. Cependant, il existe un mécanisme d'audit générique qui peut enregistrer les arguments de chaque appel système, y compris execve . Ainsi, si l'audit est activé, l'environnement peut être envoyé via le mécanisme d'audit et se retrouver dans un fichier journal. Sur un système correctement configuré, seul l'administrateur a accès au fichier journal (sur mon installation Debian par défaut, il s'agit de /var/log/audit/audit.log , uniquement lisible par root, et écrit par le démon auditd fonctionnant en tant que root).

J'ai menti plus haut: j'ai écrit que la mémoire d'un processus ne peut pas être lue par un autre processus. Ce n'est en fait pas vrai: comme tous les unices, Linux implémente l'appel système ptrace . Cet appel système permet à un processus d'inspecter la mémoire et même d'exécuter du code dans le contexte d'un autre processus. C'est ce qui permet aux débogueurs d'exister. Seule Alice peut retracer les processus d'Alice. De plus, si un processus est privilégié (setuid ou setgid), seul root peut le tracer.

Conclusion: l’environnement d’un processus n’est disponible que pour l’utilisateur (euid) exécutant le processus .

Notez que je suppose qu'il n'y a aucun autre processus qui pourrait divulguer les données. Il n'y a pas de programme racine setuid sur une installation Linux normale qui pourrait exposer l'environnement d'un processus. (Sur certains unices plus anciens, ps était un programme racine setuid qui analysait une partie de la mémoire du noyau; certaines variantes afficheraient volontiers l'environnement d'un processus à tous. Sous Linux, ps est non privilégié et obtient ses données de / proc comme tout le monde.).

(Notez que cela s'applique aux versions raisonnablement actuelles de Linux. Il y a très longtemps, je pense que dans le 1.x jours du noyau, l'environnement était lisible partout dans le monde.)

Grande réponse Gilles! Beaucoup plus complet et détaillé que ce à quoi je m'attendais. Il est bon de savoir qu'il y a une certaine sécurité dans les variables d'environnement et comment (au moins moderne) Linux sépare l'accès entre les comptes.
Je voudrais ajouter la commande que j'utilise sous Linux pour afficher l'environnement d'un autre processus (en tant que root ou même utilisateur): xargs -0 -n1 / environ Je la trouve utile pour le débogage.
logicalscope
2012-04-20 23:11:03 UTC
view on stackexchange narkive permalink

Au départ, j'allais dire "non". Les valeurs des variables d'environnement sont par utilisateur et aucun autre utilisateur ne peut lire ou écrire dans l'environnement d'un autre utilisateur. vars. Cependant, il y a une information intéressante sur SO qui indique que root est capable au moins de lire ces informations via / proc / <pid> / environ . Je n'étais pas au courant de cette interface spécifique à Linux jusqu'à présent.

https://stackoverflow.com/a/532284/643314

Cela dit , il semble que cette interface est toujours illisible pour les autres utilisateurs, même s'ils sont dans les mêmes groupes. Les permissions sont définies sur 400 pour le fichier environ et / proc empêche chmod de l'affecter. Je soupçonne que le domaine de sécurité pour la séparation des variables d'environnement entre les utilisateurs est toujours intact et ne peut pas être contourné par des moyens normaux.

Bien que les détails soient spécifiques à Linux, de nombreuses variantes d'Unix ont un système de fichiers `/ proc` qui expose des informations sur un processus, y compris éventuellement l'environnement. Là où il n'existe pas, il doit y avoir un moyen (par exemple un appel système) pour que `ps` et les commandes similaires fonctionnent. Il existe (ou du moins y avait) même des variantes Unix où `ps` est un programme racine setuid qui lit directement la mémoire du noyau.
Merci @logicalscope. Très bonne réponse. J'aurais volontiers accepté, mais Gilles a fourni une explication beaucoup plus complète et détaillée que je n'ai qu'à choisir la sienne. +1 de moi cependant!
/ dev / mem et / dev / kmem donnent tous deux un accès direct à la mémoire, ce qui permettrait de lire les variables d'environnement (et à peu près tout le reste).Ceux-ci sont également pris en charge sur d'autres variantes UNIX - https://www.freebsd.org/cgi/man.cgi?query=mem&sektion=4&apropos=0&manpath=FreeBSD+9.1-RELEASE
slowhand
2014-04-29 23:53:10 UTC
view on stackexchange narkive permalink

Malgré la réponse théoriquement correcte de Gilles: je ne mettrais pas de secrets dans les variables d'environnement.

  • Les variables d'environnement sont généralement définies vers le haut de l'arborescence des processus (par exemple via $ HOME / .profile ).
  • Les utilisateurs ne traitent pas le contenu de l'environnement comme des secrets.

Il suffit qu'un seul processus enregistre les variables d'environnement dans un fichier lisible par le monde: env >> env-traces.txt ou similaire. Vous ne pouvez pas le contrôler.

Il serait inhabituel de placer des données confidentielles dans ".profile". Habituellement, les données confidentielles sont placées dans l'environnement par un programme qui souhaite transmettre des données à un sous-processus spécifique, au lieu d'utiliser des arguments de ligne de commande (qui sont généralement visibles par les autres utilisateurs).
Je dirais que les chemins vers des clés ssh spécifiques ajoutées à ssh-agent et à des choses similaires sont à la limite de la confidentialité, et ceux-ci vont en .profile tout le temps. J'ai aussi des administrateurs DB2 qui aiment vraiment mettre les mots de passe de connexion dans leur .profile (en fait le .profile d'un compte "administrateur de base de données" partagé), mais j'espère que ce n'est pas courant du tout. : /
Steven Stewart-Gallus
2014-07-05 10:27:44 UTC
view on stackexchange narkive permalink

Dans la plupart des cas, un autre utilisateur ne peut pas lire vos variables d'environnement. Cependant, la faille de sécurité bien connue selon laquelle une instance d'un programme setuid s'exécute avec le même utilisateur que toute autre instance d'un programme setuid peut être exploitée. Cela signifie que si quelqu'un exécute un programme setuid et que quelqu'un d'autre peut exploiter un autre programme qui est setuid au même utilisateur pour lire depuis / proc / <pid> / environ alors ils peuvent lire les variables d'environnement du programme. C'est l'une des raisons pour lesquelles vous devriez utiliser un nouvel utilisateur pour tout démon que vous écrivez au lieu d'abuser de l'utilisateur nobody.

Alexey Vesnin
2016-01-02 10:24:04 UTC
view on stackexchange narkive permalink

s'il n'y a pas de politique stricte, THÉORIQUE, il y a un moyen si cette exportation est effectuée dans un script utilisateur bash-login pour Alice: Eve crée un script pour imprimer l'environnement et définit les bits SETUIDGID dans chmod , puis chown est-il à Alice, puis exécute. Le script sera exécuté sous l'uid d'Alice et son autorun bash sera celui d'Alice. Ensuite, il fuit les données via stdout =) Mais il doit y avoir une configuration système très faible pour effectuer de telles astuces. J'ai vu des boîtes tellement mal configurées dans ma pratique médico-légale, donc ce n'est pas une blague.



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...