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