it-swarm.com.de

Warum ändert Sudo den Pfad?

Dies ist die Variable PATH ohne Sudo:

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

Dies ist die Variable PATH 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, soll SudoPATH unberührt lassen. Was ist los? Wie ändere ich das? (Dies ist auf Ubuntu 8.04).

UPDATE: Soweit ich sehen kann, hat keines der Skripte als root change PATH begonnen.

Von man Sudo:

Um das Spoofing von Befehlen zu verhindern, überprüft Sudo "." Und "." (Beides bezeichnet das aktuelle Verzeichnis) als letztes, wenn im PFAD des Benutzers nach einem Befehl gesucht wird (wenn sich einer oder beide im PFAD 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.

278
Michiel de Mare

Das ist eine nervige funktioneine Eigenschaft von Sudo auf viele Distributionen.

Um dieses "Problem" auf Ubuntu zu umgehen, gehe ich in meinem ~/.bashrc folgendermaßen vor

alias Sudo='Sudo env PATH=$PATH'

Beachten Sie, dass das obige für Befehle funktioniert, die den $ PATH selbst nicht zurücksetzen. `Su 'setzt jedoch $ PATH zurück, sodass Sie -p verwenden müssen, um dies zu verhindern. I.E .:

Sudo su -p
234
pixelbeat

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

Standard env_reset

womit Sie in der nächsten Zeile Folgendes hinzufügen sollten

Standardeinstellungen! Secure_path

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

118
Jacob

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

Dazu benötigen Sie spezielle Berechtigungen.

Von man Sudo

 -E Die -E Die Option (preserve environment) überschreibt die Option env_reset 
 in sudoers (5). Es ist nur verfügbar, wenn entweder der Befehl match - 
 Das Tag SETENV hat oder die Option setenv in Sudo - 
 (5). 
 Eingestellt ist.
 Umgebungsvariablen, die für den Befehl festgelegt werden sollen, können auch in der Befehlszeile in Form von 
 Übergeben werden VAR= Wert, z.B. LD_LIBRARY_PATH=/usr/local/pkg/lib. Variablen, die in der Befehlszeile 
 Übergeben werden, unterliegen denselben Einschränkungen wie normale Umgebungsvariablen - 
 Mit einer wichtigen Ausnahme. Wenn die Option setenv in 
 Sudoers festgelegt ist, für den auszuführenden Befehl das Tag SETENV festgelegt ist oder für den Befehl 
 ALL festgelegt ist, kann der Benutzer Variablen festlegen, die für - 
 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

 man 5 sudoers: 
 
 env_reset Wenn diese Option aktiviert ist, setzt Sudo die Umgebung so zurück, dass sie nur 
 LOGNAME, Shell, USER, USERNAME und die Sudo_ * -Variable enthält. 
 fähig. Alle Variablen in der Umgebung des Aufrufers, die 
 Mit den Listen env_keep und env_check übereinstimmen, werden dann hinzugefügt. 
 Der Standardinhalt der Listen env_keep und env_check 
 Wird angezeigt, wenn Sudo von root mit ausgeführt wird die Option 
 -V. Wenn Sudo mit der Option SECURE_PATH 
 Kompiliert wurde, wird sein Wert für die Umgebungsvariable PATH 
 Verwendet. Dieses Flag ist standardmäßig aktiviert. 

Daher muss möglicherweise überprüft werden, ob dies in 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}" 
32
Kent Fredric

Sieht so aus, als ob dieser Bug schon eine ganze Weile existiert! Hier sind einige Fehlerreferenzen, die Sie möglicherweise hilfreich finden (und die Sie abonnieren/abstimmen, hinweisen, hinweisen ... möchten):


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

Es scheint, dass Bug # 20996 in dieser Version von Sudo immer noch vorhanden ist. Das Changelog sagt, 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 in Ubuntu 8.10 mache, gibt es mir diesen Fehler:

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

buntu-Fehler # 50797 ("Sudo mit --with-secure-path ist problematisch"

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


Ja. Es muss eine Möglichkeit geben, dieses "Feature" zu überschreiben, ohne es 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, es auszuschalten.


Das ist echt nervig. Es mag aus Sicherheitsgründen ratsam sein, das aktuelle Verhalten standardmäßig beizubehalten, aber es sollte eine andere Möglichkeit zum Überschreiben geben, als das Neukompilieren aus dem Quellcode! Viele Menschen brauchen PATH-Vererbung. Ich frage mich, warum sich kein Betreuer damit befasst, was leicht zu einer akzeptablen Lösung zu kommen scheint.


Ich habe das 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 "[email protected]"

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


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

Da ein Duplikat dieses Fehlers ursprünglich im Juli 2006 eingereicht wurde, ist mir nicht klar, wie lange ein ineffektiver env_keep in Betrieb ist. Unabhängig von den Vorteilen, die es mit sich bringt, Benutzer zu Tricks wie den oben aufgeführten zu zwingen, sollten die Manpages für Sudo und Sudoer sicherlich die Tatsache widerspiegeln, dass Optionen zum Ändern des PATH praktisch überflüssig sind.

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


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

Ich muss in der Lage sein, Sudo mit zusätzlichen nicht-Standard-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 ... bekam.

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

  1. Verwendung der "Sudo -E "Option - hat nicht funktioniert. Mein bestehender PFAD wurde noch von Sudo zurückgesetzt

  2. Ändern "Defaults env_reset "bis" Defaults !env_reset "in/etc/sudoers - funktionierte auch nicht (selbst in Kombination mit Sudo -E)

  3. Kommentar entfernen env_reset (z.B. "#Defaults env_reset ") in/etc/sudoers - hat auch nicht funktioniert.

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

Natürlich ist Sudo - trotz der Man-Dokumentation - in Bezug auf PATH vollständig fest codiert und lässt keine Flexibilität in Bezug auf die Beibehaltung des PATH des Benutzers zu. Sehr ärgerlich, da ich mit Sudo keine Nicht-Standard-Software unter Root-Berechtigungen ausführen kann.

17
Tyler Rick

Das schien für mich zu funktionieren

Sudo -i 

die auf dem Nicht-Sudo nimmt PATH

13
axsuul

Ich denke, es ist in der Tat wünschenswert, dass Sudo den PFAD zurücksetzt: Andernfalls könnte ein Angreifer, der Ihr Benutzerkonto kompromittiert hat, Backdoor-Versionen aller Arten von Tools auf den PFAD Ihrer Benutzer setzen und diese werden ausgeführt, wenn Sie Sudo verwenden.

(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_group oder env_keep.

Dies ist auch praktisch, weil Sie Verzeichnisse hinzufügen können, die nur für root nützlich sind (z. B. /sbin und /usr/sbin) zum Sudo-Pfad, ohne sie den Pfaden Ihrer Benutzer hinzuzufügen. So legen Sie den von Sudo zu verwendenden Pfad fest:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"
11
Arnout Engelen
# 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"
4
daggerok

Bearbeiten Sie einfach env_keep im /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"

Hänge einfach PATH am Ende an, damit es nach der Änderung so 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.

3
temp_sny

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

3
user297612

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

 Sudo visudo 

Und anhängen

 Standard exempt_group = your_goup 

Wenn Sie eine Gruppe von Benutzern ausschließen möchten, erstellen Sie eine Gruppe, fügen Sie ihr alle Benutzer hinzu, und verwenden Sie diese als Ihre Gruppe "exempt_group". Mann 5 Sudoer für mehr.

2
user378555

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

    Sudo mv $HOME/bash/script.sh /usr/sbin/ 
1
LeGilles

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 die folgende Zeile auskommentieren, 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
inman320

das Auskommentieren von "Default env_reset" und "Defaults secure_path ..." in der Datei/etc/sudoers funktioniert für mich

1
user3622173

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

Wenn Sie sich in Ihr System einloggen, bestimmen Ihre Profileinstellungen den Wert von $ PATH.

Jetzt schauen wir mal: -

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 Benutzer in der tatsächlichen Bedeutung root diesen Befehl aus.

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

[email protected]$ whoami
username
[email protected]$ Sudo whoami
root
[email protected]$ 

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

0
Deepak Dixit

Der PFAD wird zurückgesetzt, wenn su oder Sudo verwendet werden, und zwar gemäß der in /etc/login.defs definierten Definition von ENV_SUPATH und ENV_PATH

0
Bradley Allen

Äh, es ist kein wirklicher Test, wenn Sie Ihrem Pfad nichts hinzufügen:

 bill @ bill-desktop: ~ $ ls -l /opt/pkg/bin[.____.₱total 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
BIll Broadley