Pourquoi sudo change-t-il le CHEMIN?

281

Ceci est la PATHvariable sans sudo:

$ echo 'echo $PATH' | sh 
/opt/local/ruby/bin:/usr/bin:/bin

C'est la PATHvariable avec sudo:

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Pour autant que je sache, sudoest censé rester PATHintact. Que se passe-t-il? Comment puis-je changer cela? (C'est sur Ubuntu 8.04).

MISE À JOUR: pour autant que je puisse voir, aucun des scripts n'a commencé comme changement de racine PATHde quelque façon que ce soit.

De man sudo:

Pour éviter l'usurpation de commande, sudo vérifie ``. '' Et `` '' (les deux indiquant le répertoire actuel) en dernier lors de la recherche d'une commande dans le CHEMIN de l'utilisateur (si l'un ou les deux se trouvent dans le CHEMIN). Notez cependant que la variable d'environnement PATH réelle n'est pas modifiée et est transmise inchangée au programme que sudo exécute.

Michiel de Mare
la source
La racine a-t-elle quelque chose qui définit PATH dans .bashrc? Cela suppose que puisque vous êtes sous Linux, sh est vraiment bash.
Greg Hewgill

Réponses:

241

C'est une fonction ennuyeuse une fonctionnalité de sudo sur de nombreuses distributions.

Pour contourner ce "problème" sur ubuntu, je fais ce qui suit dans mon ~ / .bashrc

alias sudo='sudo env PATH=$PATH'

Notez que ce qui précède fonctionnera pour les commandes qui ne réinitialisent pas $ PATH elles-mêmes. Cependant `su 'réinitialise son $ PATH, vous devez donc utiliser -p pour lui dire de ne pas le faire. C'EST À DIRE:

sudo su -p
pixelbeat
la source
46
Cette "fonction gênante" vous empêche de devenir cheval de Troie. Je dis que forcer un $ PATH spécifique est une fonctionnalité, pas un bug --- cela vous fait écrire le chemin complet vers un programme qui est en dehors de $ PATH.
Chris Jester-Young,
29
Oui, mais c'est totalement contre-intuitif. Cela trompe probablement plus les bons que les méchants.
Brian Armstrong
31
Non seulement c'est contre-intuitif, mais il est mal documenté. En lisant les pages de manuel de sudo et en comparant la configuration avec une boîte Fedora, j'ai pensé que le chemin devait être conservé. En effet, "sudo -V" dit même "Variables d'environnement à conserver: PATH".
Jason R. Coombs
6
c'est ennuyant. période. s'il pouvait «vous faire trojaned» par sudo, il pourrait vous faire trojaned même sans lui. accordé, plus difficile, mais si vous exécutez du code au mauvais endroit, même avec votre utilisateur normal, les choses sont déjà assez mauvaises.
gcb
7
Ne pas alias sudo; voir la réponse de @Jacob sur les paramètres par défaut env_reset.
greg_1_anderson
121

Dans le cas où quelqu'un d'autre s'exécute à travers cela et veut simplement désactiver toutes les variables de chemin changeant pour tous les utilisateurs.
Accédez à votre fichier sudoers en utilisant la commande: visudo. Vous devriez voir la ligne suivante quelque part:

Par défaut env_reset

que vous devez ajouter ce qui suit sur la ligne suivante

Par défaut! Secure_path

secure_path est activé par défaut. Cette option spécifie quoi faire $ PATH lors du sudoing. Le point d'exclamation désactive la fonctionnalité.

Jacob
la source
6
une autre façon:Defaults env_keep = "PATH"
gcb
1
Secure_path a très bien fonctionné pour moi sur les systèmes modernes; sur une vieille boîte ubuntu 8.04, Defaults env_keep = "PATH" a fait l'affaire.
greg_1_anderson
29
Au lieu de désactiver le chemin d'accès sécurisé, vous pouvez y ajouter. Par exemple, dans mon cas, j'ai ajouté la ligne "Defaults secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / some / custom / directory" où "some / custom / directory" est le chemin dont j'avais besoin mettre à la disposition de sudo.
Hector Correa
La solution @HectorCorrea est la meilleure façon OMI.
chakrit
32

PATH est une variable d'environnement, et en tant que telle est par défaut réinitialisée par sudo.

Pour ce faire, vous avez besoin d'autorisations spéciales.

De man sudo

       -E L' option -E (préserver l'environnement) remplacera l'env_reset
           option dans sudoers (5)). Il n'est disponible que lorsque la correspondance
           La commande ing possède la balise SETENV ou l'option setenv est définie dans sudo-
           (5).
       Les variables d'environnement à définir pour la commande peuvent également être transmises
       la ligne de commande sous la forme d'une valeur VAR =, par exemple
        LD_LIBRARY_PATH = / usr / local / pkg / lib. Variables passées sur la commande
       sont soumises aux mêmes restrictions que les variations de l’environnement
       aptes à une exception importante. Si l'option setenv est définie dans
       sudoers, la commande à exécuter a la balise SETENV définie ou la commande
       correspond à TOUS, l'utilisateur peut définir des variables qui seraient
       bidden. Voir sudoers (5) pour plus d'informations.

Un exemple d'utilisation:

cat >> test.sh
env | grep "MYEXAMPLE" ;
^D
sh test.sh 
MYEXAMPLE=1 sh test.sh
# MYEXAMPLE=1
MYEXAMPLE=1 sudo sh test.sh 
MYEXAMPLE=1 sudo MYEXAMPLE=2 sh test.sh 
# MYEXAMPLE=2

mettre à jour

homme 5 sudoers: 

     env_reset Si défini, sudo réinitialisera l'environnement pour ne contenir que
                       LOGNAME, SHELL, USER, USERNAME et la variante SUDO_ *
                       aptes. Toutes les variables de l'environnement de l'appelant qui
                       correspondent aux listes env_keep et env_check sont ensuite ajoutées.
                       Le contenu par défaut de env_keep et env_check
                       les listes sont affichées lorsque sudo est exécuté par root avec le
                       Option -V. Si sudo a été compilé avec SECURE_PATH
                       , sa valeur sera utilisée pour l'environnement PATH
                       variable. Ce drapeau est activé par défaut.

Il faudra donc peut-être vérifier que cela n'est pas compilé.

C'est par défaut dans Gentoo

# ( From the build Script )
....
ROOTPATH=$(cleanpath /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin${ROOTPATH:+:${ROOTPATH}})
....
econf --with-secure-path="${ROOTPATH}" 
Kent Fredric
la source
17

On dirait que ce bug existe depuis un bon moment! Voici quelques références de bogues que vous pourriez trouver utiles (et que vous voudrez peut-être vous abonner / voter, indice, indice ...):


Bogue Debian # 85123 ("sudo: SECURE_PATH ne peut toujours pas être remplacé") (à partir de 2001!)

Il semble que le bogue n ° 20996 soit toujours présent dans cette version de sudo. Le journal des modifications indique qu'il peut être remplacé lors de l'exécution, mais je n'ai pas encore découvert comment.

Ils mentionnent mettre quelque chose comme ça dans votre fichier sudoers:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin"

mais quand je fais ça dans Ubuntu 8.10 au moins, cela me donne cette erreur:

visudo: unknown defaults entry `secure_path' referenced near line 10

Bogue Ubuntu # 50797 ("sudo construit avec --with-secure-path est problématique")

Pire encore, pour autant que je sache, il est impossible de spécifier à nouveau secure_path dans le fichier sudoers. Donc, si, par exemple, vous voulez offrir à vos utilisateurs un accès facile à quelque chose sous / opt, vous devez recompiler sudo.


Oui. Il doit y avoir un moyen de remplacer cette "fonctionnalité" sans avoir à recompiler. Rien de pire que les bigots de sécurité qui vous disent ce qui est le mieux pour votre environnement et ne vous donnent pas de moyen de le désactiver


C'est vraiment ennuyeux. Il peut être judicieux de conserver le comportement actuel par défaut pour des raisons de sécurité, mais il devrait y avoir un moyen de le remplacer autre que la recompilation à partir du code source! Beaucoup de gens ont besoin de l'héritage PATH. Je me demande pourquoi aucun responsable ne s'y penche, ce qui semble facile à trouver avec une solution acceptable.


J'ai travaillé comme ça:

mv /usr/bin/sudo /usr/bin/sudo.orig

puis créez un fichier / usr / bin / sudo contenant les éléments suivants:

#!/bin/bash
/usr/bin/sudo.orig env PATH=$PATH "$@"

alors votre sudo normal fonctionne exactement comme le sudo non sécurisé


Bogue Ubuntu # 192651 ("le chemin sudo est toujours réinitialisé")

Étant donné qu'un doublon de ce bogue a été initialement déposé en juillet 2006, je ne sais pas depuis combien de temps un env_keep inefficace est en service. Quels que soient les avantages de forcer les utilisateurs à utiliser des astuces telles que celles répertoriées ci-dessus, les pages de manuel de sudo et sudoers devraient sûrement refléter le fait que les options de modification du CHEMIN sont effectivement redondantes.

La modification de la documentation pour refléter l'exécution réelle n'est pas déstabilisante et très utile.


Bogue Ubuntu # 226595 ("impossible de conserver / spécifier le CHEMIN")

J'ai besoin de pouvoir exécuter sudo avec des dossiers binaires non std supplémentaires dans le PATH. Ayant déjà ajouté mes exigences à / etc / environment, j'ai été surpris de recevoir des erreurs concernant des commandes manquantes lors de leur exécution sous sudo ...

J'ai essayé ce qui suit pour résoudre ce problème sans succès:

  1. L'utilisation de l' sudo -Eoption " " - n'a pas fonctionné. Mon CHEMIN existant a toujours été réinitialisé par sudo

  2. Changer " Defaults env_reset" en " Defaults !env_reset" dans / etc / sudoers - n'a pas fonctionné non plus (même en combinaison avec sudo -E)

  3. Décommentation env_reset(par exemple " #Defaults env_reset") dans / etc / sudoers - n'a pas fonctionné non plus.

  4. L'ajout de ' Defaults env_keep += "PATH"' à / etc / sudoers - n'a pas fonctionné non plus.

De toute évidence - malgré la documentation de l'homme - sudo est complètement codé en dur concernant PATH et ne permet aucune flexibilité concernant la conservation des utilisateurs PATH. Très ennuyeux car je ne peux pas exécuter de logiciel non par défaut sous les autorisations root en utilisant sudo.

Tyler Rick
la source
13

Cela a semblé fonctionner pour moi

sudo -i 

qui prend le non-sudo PATH

axsuul
la source
'sudo -i' n'aide pas sur Ubuntu (j'ai vérifié Ubuntu 14.04.3 LTS). $ PATH est toujours modifié par sudo.
Marcin Raczyński
11

Je pense qu'il est en fait souhaitable d'avoir sudo réinitialisé le PATH: sinon un attaquant ayant compromis votre compte d'utilisateur pourrait mettre des versions détournées de toutes sortes d'outils sur le PATH de vos utilisateurs, et ils seraient exécutés lors de l'utilisation de sudo.

(bien sûr, avoir sudo réinitialisé le PATH n'est pas une solution complète à ce genre de problèmes, mais cela aide)

C'est en effet ce qui se passe lorsque vous utilisez

Defaults env_reset

dans / etc / sudoers sans utiliser exempt_groupou env_keep.

Cela est également pratique car vous pouvez ajouter des répertoires qui ne sont utiles que pour la racine (comme /sbinet /usr/sbin) au chemin sudo sans les ajouter aux chemins de vos utilisateurs. Pour spécifier le chemin à utiliser par sudo:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"
Arnout Engelen
la source
un attaquant qui accède à un compte sudoer peut faire pire encore.
user508546
Un conseil décent. Sur ubuntu 12.04 Server, un paramètre similaire est par défaut.
Tsutomu
7

Fonctionne maintenant en utilisant sudo des dépôts karmiques. Détails de ma configuration:

root@sphinx:~# cat /etc/sudoers | grep -v -e '^$' -e '^#'
Defaults    env_reset
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/grub-1.96/sbin:/opt/grub-1.96/bin"
root    ALL=(ALL) ALL
%admin ALL=(ALL) ALL
root@sphinx:~# cat /etc/apt/sources.list
deb http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe

deb http://security.ubuntu.com/ubuntu jaunty-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu jaunty-security main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe

deb http://security.ubuntu.com/ubuntu karmic-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted universe
root@sphinx:~# 

root@sphinx:~# cat /etc/apt/preferences 
Package: sudo
Pin: release a=karmic-security
Pin-Priority: 990

Package: sudo
Pin: release a=karmic-updates
Pin-Priority: 960

Package: sudo
Pin: release a=karmic
Pin-Priority: 930

Package: *
Pin: release a=jaunty-security
Pin-Priority: 900

Package: *
Pin: release a=jaunty-updates
Pin-Priority: 700

Package: *
Pin: release a=jaunty
Pin-Priority: 500

Package: *
Pin: release a=karmic-security
Pin-Priority: 450

Package: *
Pin: release a=karmic-updates
Pin-Priority: 250

Package: *
Pin: release a=karmic
Pin-Priority: 50
root@sphinx:~# apt-cache policy sudo
sudo:
  Installed: 1.7.0-1ubuntu2
  Candidate: 1.7.0-1ubuntu2
  Package pin: 1.7.0-1ubuntu2
  Version table:
 *** 1.7.0-1ubuntu2 930
         50 http://au.archive.ubuntu.com karmic/main Packages
        100 /var/lib/dpkg/status
     1.6.9p17-1ubuntu3 930
        500 http://au.archive.ubuntu.com jaunty/main Packages
root@sphinx:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin
root@sphinx:~# exit
exit
abolte@sphinx:~$ echo $PATH
/home/abolte/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/chromium-17593:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/xpra-0.0.6/bin
abolte@sphinx:~$ 

C'est merveilleux d'avoir enfin résolu cela sans utiliser de hack.


la source
4
Vous pourriez peut-être envisager de réécrire ceci pour indiquer comment quelqu'un avec une installation Karmic propre pourrait mettre à jour sa configuration pour résoudre ce problème particulier.
Jason R. Coombs
4
# cat .bash_profile | grep PATH
PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH

# cat /etc/sudoers | grep Defaults
Defaults    requiretty
Defaults    env_reset
Defaults    env_keep = "SOME_PARAM1 SOME_PARAM2 ... PATH"
poignard
la source
3

Il suffit de commenter "Defaults env_reset" dans / etc / sudoers


la source
3

Modifiez simplement env_keepdans/etc/sudoers

Cela ressemble à ceci:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE"

Ajoutez simplement PATH à la fin, donc après le changement, cela ressemblera à ceci:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE PATH"

Fermez le terminal puis rouvrez-le.

temp_sny
la source
Attendez que PATH ait besoin de 2 **? Pourquoi PATH a-t-il besoin **?
CMCDragonkai
@CMCDragonkai Il a été formaté en gras (dans la démarque), mais quelqu'un (le débordement de la pile ne me laisse pas pointer du doigt) l'a modifié pour le marquer comme code.
1j01
2

Secure_path est votre ami, mais si vous voulez vous exempter de secure_path, faites-le

sudo visudo

Et ajouter

Par défaut exemption_group = your_goup

Si vous souhaitez exempter un groupe d'utilisateurs, créez un groupe, ajoutez-y tous les utilisateurs et utilisez-le comme votre groupe exempté. homme 5 sudoers pour plus.

user378555
la source
1

la solution recommandée dans les commentaires sur la distribution OpenSUSE suggère de changer:

Defaults env_reset

à:

Defaults !env_reset

puis sans doute pour commenter la ligne suivante qui n'est pas nécessaire:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE    MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L    ANGUAGE LINGUAS XDG_SESSION_COOKIE"
inman320
la source
1

commenter "Default env_reset" et "Default secure_path ..." dans le fichier / etc / sudores fonctionne pour moi

user3622173
la source
1

Vous pouvez également déplacer votre fichier dans un répertoire utilisé par sudoers:

    sudo mv $HOME/bash/script.sh /usr/sbin/ 

la source
0

Euh, ce n'est pas vraiment un test si vous n'ajoutez rien à votre chemin:

bill @ bill-desktop: ~ $ ls -l / opt / pkg / bin
12 au total
-rwxr-xr-x 1 racine racine 28 2009-01-22 18:58 foo
bill @ bill-desktop: ~ $ qui foo
/ opt / pkg / bin / foo
bill @ bill-desktop: ~ $ sudo su
root @ bill-desktop: / home / bill # which foo
root @ bill-desktop: / home / bill # 

la source
0

Le CHEMIN sera réinitialisé lors de l'utilisation de su ou sudo par la définition de ENV_SUPATH et ENV_PATH défini dans /etc/login.defs

Bradley Allen
la source
0

$ PATH est une variable d'environnement et cela signifie que la valeur de $ PATH peut différer pour un autre utilisateur.

Lorsque vous vous connectez à votre système, votre paramètre de profil décide de la valeur de $ PATH .

Voyons maintenant: -

User       |        Value of $PATH
--------------------------
root                /var/www
user1               /var/www/user1
user2               /var/www/html/private

Supposons que ce sont les valeurs de $ PATH pour différents utilisateurs. Maintenant, lorsque vous exécutez une commande avec sudo, l' utilisateur racine exécute en réalité cette commande.

Vous pouvez confirmer en exécutant ces commandes sur le terminal: -

user@localhost$ whoami
username
user@localhost$ sudo whoami
root
user@localhost$ 

C'est la raison. Je pense que c'est clair pour vous.

Deepak Dixit
la source