Warum ändert sudo den PFAD?


281

Dies ist die PATHVariable ohne sudo:

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

Dies ist die PATHVariable mit sudo:

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

Soweit ich das beurteilen kann, sudosoll es PATHunberührt bleiben. Was ist los? Wie ändere ich das? (Dies ist unter Ubuntu 8.04).

UPDATE: Soweit ich sehen kann, wurde keines der Skripte PATHin irgendeiner Weise als Root-Änderung gestartet .

Von man sudo:

Um das Spoofing von Befehlen zu verhindern, überprüft sudo zuletzt ``. '' Und `` '' (beide bezeichnen das aktuelle Verzeichnis), wenn im PATH des Benutzers nach einem Befehl gesucht wird (wenn sich einer oder beide im PATH befinden). Beachten Sie jedoch, dass die tatsächliche Umgebungsvariable PATH nicht geändert und unverändert an das von sudo ausgeführte Programm übergeben wird.


Hat root irgendetwas, das PATH in .bashrc setzt? Dies setzt voraus, dass sh unter Linux wirklich Bash ist, da Sie unter Linux arbeiten.
Greg Hewgill

Antworten:


241

Das ist eine nervige Funktion ein Merkmal von sudo auf vielen Distributionen.

Um dieses "Problem" auf Ubuntu zu umgehen, gehe ich in meinem ~ / .bashrc wie folgt vor

alias sudo='sudo env PATH=$PATH'

Beachten Sie, dass das oben Gesagte für Befehle funktioniert, die $ PATH selbst nicht zurücksetzen. `Su 'setzt jedoch $ PATH zurück, sodass Sie -p verwenden müssen, um anzuweisen, dass dies nicht der Fall ist. IE:

sudo su -p

46
Diese "nervige Funktion" verhindert, dass Sie trojanisiert werden. Ich sage, das Erzwingen eines bestimmten $ PATH ist eine Funktion, kein Fehler - Sie können den vollständigen Pfad zu einem Programm außerhalb von $ PATH aufschreiben.
Chris Jester-Young

29
Ja, aber es ist völlig uninteressant. Es täuscht wahrscheinlich die Guten mehr als die Bösen.
Brian Armstrong

31
Es ist nicht nur nicht intuitiv, es ist auch falsch dokumentiert. Als ich die Manpages für sudo las und die Konfiguration mit einer Fedora-Box verglich, dachte ich, der Pfad sollte beibehalten werden. In der Tat sagt "sudo -V" sogar "Umgebungsvariablen, die erhalten bleiben müssen: PATH".
Jason R. Coombs

6
es ist nervig. Zeitraum. Wenn es Sie von Sudo "trojanisieren" könnte, könnte es Sie auch ohne Sudo trojanisieren. Zugegeben, schwieriger, aber wenn Sie selbst mit Ihrem normalen Benutzer Code von der falschen Stelle ausführen, sind die Dinge bereits schlimm genug.
GCB

7
Nicht alias sudo; Siehe Antwort von @Jacob zu Defaults env_reset.
Greg_1_anderson

121

Für den Fall, dass jemand anderes dies tut und einfach alle Pfadvariablenänderungen für alle Benutzer deaktivieren möchte.
Greifen Sie mit dem folgenden Befehl auf Ihre sudoers-Datei zu : visudo. Sie sollten irgendwo die folgende Zeile sehen:

Standardmäßig env_reset

In der nächsten Zeile sollten Sie Folgendes hinzufügen

Standard! Secure_path

Der sichere Pfad ist standardmäßig aktiviert. Diese Option gibt an, was beim Sudoing $ PATH machen soll. Das Ausrufezeichen deaktiviert die Funktion.


6
ein anderer Weg:Defaults env_keep = "PATH"
gcb

1
Defaults! Secure_path hat auf modernen Systemen hervorragend funktioniert. Auf einer alten Ubuntu 8.04-Box hat Defaults env_keep = "PATH" den Trick gemacht.
Greg_1_anderson

29
Anstatt den sicheren Pfad zu deaktivieren, können Sie ihn hinzufügen. In meinem Fall habe ich beispielsweise die Zeile "Defaults Secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / some / custom / directory" hinzugefügt, wobei "some / custom / directory" der Pfad ist, den ich brauchte sudo zur Verfügung stellen.
Hector Correa

@ HectorCorrea-Lösung ist der bessere Weg IMO.
Chakrit

32

PATH ist eine Umgebungsvariable und wird daher standardmäßig von sudo zurückgesetzt.

Sie benötigen spezielle Berechtigungen, um dies zu tun.

Von man sudo

       -E Das -E Option (Umgebung beibehalten) überschreibt env_reset
           Option in Sudoers (5)). Es ist nur verfügbar, wenn entweder das Match-
           Der Befehl ing hat das Tag SETENV oder die Option setenv ist in sudo- gesetzt
           ers (5).
       Umgebungsvariablen, die für den Befehl festgelegt werden sollen, können ebenfalls weitergegeben werden
       die Befehlszeile in Form von VAR = Wert, zB
        LD_LIBRARY_PATH = / usr / local / pkg / lib. Auf den Befehl übergebene Variablen
       Leitungen unterliegen den gleichen Einschränkungen wie normale Umgebungsvariablen
       mit einer wichtigen Ausnahme. Wenn die Option setenv aktiviert ist
       sudoers, für den auszuführenden Befehl ist das SETENV-Tag oder der Befehl festgelegt
       Matched ist ALL, der Benutzer kann Variablen setzen, die übermäßig for-
       verboten. Weitere Informationen finden Sie unter sudoers (5).

Ein Anwendungsbeispiel:

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

aktualisieren

Mann 5 Sudoers: 

     env_reset Wenn gesetzt, setzt sudo die Umgebung so zurück, dass sie nur enthält
                       der LOGNAME, SHELL, USER, USERNAME und die SUDO_ * -Variable
                       fähig. Alle Variablen in der Umgebung des Aufrufers, die
                       Übereinstimmung mit den Listen env_keep und env_check werden dann hinzugefügt.
                       Der Standardinhalt von env_keep und env_check
                       Listen werden angezeigt, wenn sudo von root mit dem ausgeführt wird
                       -V Option. Wenn sudo mit SECURE_PATH kompiliert wurde
                       Option, wird sein Wert für die PATH-Umgebung verwendet
                       Variable. Dieses Flag ist standardmäßig aktiviert.

Möglicherweise muss also überprüft werden, ob dies kompiliert ist / nicht.

Es ist standardmäßig in 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}" 

17

Sieht so aus, als ob es diesen Fehler schon eine ganze Weile gibt! Hier sind einige Fehlerreferenzen, die Sie möglicherweise hilfreich finden (und die Sie abonnieren / abstimmen möchten, Hinweis, Hinweis ...):


Debian-Fehler # 85123 ("sudo: SECURE_PATH kann immer noch nicht überschrieben werden") (ab 2001!)

Es scheint, dass Bug # 20996 in dieser Version von sudo noch vorhanden ist. Das Changelog besagt, dass es zur Laufzeit überschrieben werden kann, aber ich habe noch nicht herausgefunden, wie.

Sie erwähnen, dass Sie so etwas in Ihre Sudoers-Datei aufnehmen:

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

aber wenn ich das zumindest in Ubuntu 8.10 mache, gibt es mir diesen Fehler:

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

Ubuntu-Fehler # 50797 ("Sudo mit --with-Secure-Path ist problematisch")

Schlimmer noch, soweit ich das beurteilen kann, ist es unmöglich, den sicheren Pfad in der sudoers-Datei erneut anzugeben. Wenn Sie Ihren Benutzern beispielsweise einen einfachen Zugriff auf etwas unter / opt bieten möchten, müssen Sie sudo neu kompilieren.


Ja. Es muss eine Möglichkeit geben, diese "Funktion" zu überschreiben, ohne sie neu kompilieren zu müssen. Nichts ist schlimmer als Sicherheits-Bigots, die Ihnen sagen, was für Ihre Umgebung am besten ist, und Ihnen dann keine Möglichkeit geben, sie auszuschalten.


Das ist wirklich nervig. Es mag aus Sicherheitsgründen ratsam sein, das aktuelle Verhalten standardmäßig beizubehalten, aber es sollte eine andere Möglichkeit geben, es zu überschreiben, als es aus dem Quellcode neu zu kompilieren! Viele Menschen brauchen eine PATH-Vererbung. Ich frage mich, warum sich keine Betreuer damit befassen, was leicht zu finden scheint, um eine akzeptable Lösung zu finden.


Ich habe es so umgangen:

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

Erstellen Sie dann eine Datei / usr / bin / sudo, die Folgendes enthält:

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

dann funktioniert Ihr reguläres sudo genauso wie das nicht sichere sudo


Ubuntu-Fehler # 192651 ("Sudo-Pfad wird immer zurückgesetzt")

Angesichts der Tatsache, dass ein Duplikat dieses Fehlers ursprünglich im Juli 2006 eingereicht wurde, ist mir nicht klar, wie lange ein ineffektiver env_keep in Betrieb war. Unabhängig davon, welche Vorteile es hat, Benutzer zu zwingen, Tricks wie die oben aufgeführten anzuwenden, sollten die Manpages für sudo und sudoers sicherlich die Tatsache widerspiegeln, dass Optionen zum Ändern des PATH effektiv überflüssig sind.

Das Ändern der Dokumentation, um die tatsächliche Ausführung widerzuspiegeln, ist nicht destabilisierend und sehr hilfreich.


Ubuntu-Fehler # 226595 ("PATH kann nicht beibehalten / angegeben werden")

Ich muss in der Lage sein, sudo mit zusätzlichen nicht standardmäßigen Binärordnern im PATH auszuführen. Nachdem ich meine Anforderungen bereits zu / etc / environment hinzugefügt hatte, war ich überrascht, als ich Fehler über fehlende Befehle beim Ausführen unter sudo erhielt .....

Ich habe Folgendes versucht, um dies ohne Erfolg zu beheben:

  1. Verwenden der sudo -EOption " " - hat nicht funktioniert. Mein vorhandener PFAD wurde immer noch von sudo zurückgesetzt

  2. Das Ändern von " Defaults env_reset" in " Defaults !env_reset" in / etc / sudoers - hat auch nicht funktioniert (auch in Kombination mit sudo -E)

  3. Das Kommentieren env_reset(zB " #Defaults env_reset") in / etc / sudoers - hat auch nicht funktioniert.

  4. Das Hinzufügen von ' Defaults env_keep += "PATH"' zu / etc / sudoers - hat auch nicht funktioniert.

Trotz der Man-Dokumentation ist sudo in Bezug auf PATH eindeutig fest codiert und lässt keine Flexibilität hinsichtlich der Beibehaltung des PATH-Benutzers zu. Sehr ärgerlich, da ich mit sudo keine nicht standardmäßige Software unter Root-Berechtigungen ausführen kann.


13

Das schien für mich zu funktionieren

sudo -i 

das nimmt das Nicht-Sudo auf PATH


'sudo -i' hilft unter Ubuntu nicht (ich habe Ubuntu 14.04.3 LTS überprüft). $ PATH wird immer noch von sudo geändert.
Marcin Raczyński

11

Ich denke, es ist in der Tat wünschenswert, dass sudo den PATH zurücksetzt: Andernfalls könnte ein Angreifer, der Ihr Benutzerkonto kompromittiert hat, Backdoor-Versionen aller Arten von Tools auf den PATH Ihrer Benutzer setzen, die bei Verwendung von sudo ausgeführt werden.

(Natürlich ist das Zurücksetzen des Pfads durch sudo keine vollständige Lösung für diese Art von Problemen, aber es hilft)

Dies ist in der Tat, was passiert, wenn Sie verwenden

Defaults env_reset

in / etc / sudoers ohne exempt_groupoderenv_keep .

Dies ist auch praktisch, da Sie dem sudo-Pfad Verzeichnisse hinzufügen können, die nur für root (wie /sbinund /usr/sbin) nützlich sind, ohne sie den Pfaden Ihrer Benutzer hinzuzufügen. So geben Sie den von sudo zu verwendenden Pfad an:

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

Ein Angreifer, der Zugang zu einem Sudoer-Konto erhält, kann noch schlimmere Dinge tun.
user508546

Ein anständiger Rat. Unter Ubuntu 12.04 Server ist eine ähnliche Einstellung die Standardeinstellung.
Tsutomu

7

Funktioniert jetzt mit Sudo aus den karmischen Repositories. Details aus meiner Konfiguration:

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:~$ 

Es ist wunderbar, dies endlich ohne Hack lösen zu können.


4
Vielleicht würden Sie dies umschreiben, um anzuzeigen, wie jemand mit einer sauberen Karmic-Installation seine Konfiguration aktualisieren könnte, um dieses spezielle Problem zu lösen.
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"

3

Kommentieren Sie einfach "Defaults env_reset" in / etc / sudoers aus


3

Nur bearbeiten env_keepin/etc/sudoers

Es sieht ungefähr so ​​aus:

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"

Fügen Sie am Ende einfach PATH hinzu, damit es nach der Änderung folgendermaßen aussieht:

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"

Schließen Sie das Terminal und öffnen Sie es erneut.


Warten PATH braucht 2 **? Warum braucht PATH **?
CMCDragonkai

@CMCDragonkai Es wurde fett formatiert (in Markdown), aber jemand (Stapelüberlauf lässt mich nicht mit den Fingern zeigen) hat es bearbeitet, um es als Code zu markieren.
1j01

2

Secure_path ist dein Freund, aber wenn du dich von Secure_path befreien willst, tu es einfach

sudo visudo

Und anhängen

Standardeinstellungenempt_group = your_goup

Wenn Sie eine Gruppe von Benutzern ausnehmen möchten, erstellen Sie eine Gruppe, fügen Sie alle Benutzer hinzu und verwenden Sie diese als Ihre Ausnahmegruppe. Mann 5 Sudoers für mehr.


1

Die empfohlene Lösung in den Kommentaren zur OpenSUSE-Distribution schlägt vor, Folgendes zu ändern:

Defaults env_reset

zu:

Defaults !env_reset

und dann vermutlich, um die folgende Zeile zu kommentieren, die nicht benötigt wird:

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"

1

Das Auskommentieren von "Standard-env_reset" und "Standard-sicherer_Pfad ..." in der Datei / etc / sudores funktioniert für mich


1

Sie können Ihre Datei auch in ein von sudoers verwendetes Verzeichnis verschieben:

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

0

Ähm, es ist nicht wirklich ein Test, wenn Sie Ihrem Pfad nichts hinzufügen:

bill @ bill-desktop: ~ $ ls -l / opt / pkg / bin
insgesamt 12
-rwxr-xr-x 1 root root 28 2009-01-22 18:58 foo
bill @ bill-desktop: ~ $ welches foo
/ opt / pkg / bin / foo
bill @ bill-desktop: ~ $ sudo su
root @ bill-desktop: / home / bill # welche foo
root @ bill-desktop: / home / bill # 

0

Der PATH wird bei Verwendung von su oder sudo durch die Definition von ENV_SUPATH und ENV_PATH zurückgesetzt, die in /etc/login.defs definiert sind


0

$ PATH ist eine Umgebungsvariable und bedeutet, dass der Wert von $ PATH für andere Benutzer unterschiedlich sein kann.

Wenn Sie sich bei Ihrem System anmelden, entscheidet Ihre Profileinstellung über den Wert von $ PATH .

Schauen wir uns jetzt Folgendes an: -

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

Angenommen, dies sind die Werte von $ PATH für verschiedene Benutzer. Wenn Sie nun einen Befehl mit sudo ausführen, führt der Root- Benutzer diesen Befehl tatsächlich aus.

Sie können dies bestätigen, indem Sie die folgenden Befehle auf dem Terminal ausführen: -

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

Das ist der Grund. Ich denke es ist dir klar.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.