Mengapa sudo mengubah PATH?


281

Ini adalah PATHvariabel tanpa sudo:

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

Ini adalah PATHvariabel dengan sudo:

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

Sejauh yang saya tahu, sudoseharusnya PATHtidak tersentuh. Apa yang sedang terjadi? Bagaimana saya mengubahnya? (Ini di Ubuntu 8.04).

PEMBARUAN: sejauh yang saya bisa lihat, tidak ada satu pun skrip yang memulai perubahan root PATHdengan cara apa pun.

Dari man sudo:

Untuk mencegah spoofing perintah, sudo memeriksa ``. '' Dan `` '' (keduanya menunjukkan direktori saat ini) terakhir saat mencari perintah di PATH pengguna (jika salah satu atau keduanya berada di PATH). Perhatikan, bagaimanapun, bahwa variabel lingkungan PATH sebenarnya tidak dimodifikasi dan diteruskan tidak berubah ke program yang dijalankan sudo.


Apakah root memiliki sesuatu yang menetapkan PATH di .bashrc? Ini dengan asumsi bahwa karena Anda menggunakan Linux, sh benar-benar bash.
Greg Hewgill

Jawaban:


241

Ini adalah fungsi yang mengganggu fitur sudo pada banyak distribusi.

Untuk mengatasi "masalah" ini di ubuntu saya melakukan hal berikut di ~ / .bashrc saya

alias sudo='sudo env PATH=$PATH'

Catatan di atas akan berfungsi untuk perintah yang tidak mengatur ulang $ PATH sendiri. Namun `su 'me-reset $ PATH jadi Anda harus menggunakan -p untuk tidak melakukannya. YAITU:

sudo su -p

46
"Fungsi menjengkelkan" ini mencegah Anda dari trojan. Saya katakan memaksa $ PATH spesifik adalah fitur, bukan bug --- itu membuat Anda menulis path lengkap ke program yang di luar $ PATH.
Chris Jester-Young

29
Ya, tapi itu sangat berlawanan dengan intuisi. Mungkin menipu orang baik lebih dari orang jahat.
Brian Armstrong

31
Tidak hanya itu berlawanan dengan intuisi, itu juga salah didokumentasikan. Membaca halaman manual untuk sudo, dan membandingkan konfigurasi terhadap kotak Fedora, saya pikir jalan harus dilestarikan. Memang, "sudo -V" bahkan mengatakan "Variabel lingkungan untuk dilestarikan: PATH".
Jason R. Coombs

6
itu menyebalkan. Titik. jika itu bisa 'membuat Anda trojaned' oleh sudo itu bisa membuat Anda trojaned sama tanpa itu. memang, lebih sulit, tetapi jika Anda menjalankan kode dari tempat yang salah bahkan dengan pengguna biasa Anda, maka semuanya sudah cukup buruk.
gcb

7
Jangan alias sudo; lihat jawaban dari @Jacob tentang Defaults env_reset.
greg_1_anderson

121

Jika ada orang lain yang menjalankan ini dan ingin menonaktifkan semua perubahan path variabel untuk semua pengguna.
Mengakses file yang sudoers dengan menggunakan perintah: visudo. Anda akan melihat baris berikut di suatu tempat:

Default env_reset

yang harus Anda tambahkan berikut pada baris berikutnya

Default! Secure_path

secure_path diaktifkan secara default. Opsi ini menentukan apa yang membuat $ PATH saat sudoing. Tanda seru menonaktifkan fitur.


6
cara lain:Defaults env_keep = "PATH"
gcb

1
Default! Secure_path bekerja sangat baik untuk saya di sistem modern; pada kotak 8.04 Ubuntu lama, Defaults env_keep = "PATH" melakukan trik.
greg_1_anderson

29
Alih-alih menonaktifkan secure_path, Anda dapat menambahkannya. Sebagai contoh dalam kasus saya, saya menambahkan baris "Defaults secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / some / custom / direktori" di mana "some / custom / direktori" adalah jalur yang saya butuhkan agar tersedia untuk sudo.
Hector Correa

Solusi @HectorCorrea adalah cara IMO yang lebih baik.
chakrit

32

PATH adalah variabel lingkungan, dan karena itu secara default diatur ulang oleh sudo.

Anda perlu izin khusus untuk diizinkan melakukan ini.

Dari man sudo

       -E Opsi -E (lingkungan perlindungan) akan menggantikan env_reset
           opsi dalam sudoers (5)). Ini hanya tersedia saat pencocokan
           Perintah ing memiliki tag SETENV atau opsi setenv diatur dalam sudo-
           ers (5).
       Variabel lingkungan yang akan ditetapkan untuk perintah juga dapat diteruskan
       baris perintah dalam bentuk VAR = nilai, misalnya
        LD_LIBRARY_PATH = / usr / local / pkg / lib. Variabel diteruskan pada perintah
       baris tunduk pada batasan yang sama seperti variasi lingkungan normal
       mampu dengan satu pengecualian penting. Jika opsi setenv diatur dalam
       sudoers, perintah yang akan dijalankan memiliki set tag SETENV atau perintah
       cocok adalah SEMUA, pengguna dapat mengatur variabel yang akan menjadi
       dilarang. Lihat sudoers (5) untuk informasi lebih lanjut.

Contoh penggunaan:

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

memperbarui

man 5 sudoers: 

     env_reset Jika diatur, sudo akan mengatur ulang lingkungan agar hanya berisi
                       LOGNAME, SHELL, USER, USERNAME dan SUDO_ * vari-
                       ables Setiap variabel di lingkungan pemanggil itu
                       cocok dengan daftar env_keep dan env_check kemudian ditambahkan.
                       Isi default env_keep dan env_check
                       daftar ditampilkan ketika sudo dijalankan oleh root dengan
                       Opsi -V. Jika sudo dikompilasi dengan SECURE_PATH
                       opsi, nilainya akan digunakan untuk lingkungan PATH
                       variabel. Bendera ini aktif secara default.

Jadi mungkin perlu memeriksa apakah ini dikompilasi.

Secara default di 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

Sepertinya bug ini sudah ada cukup lama! Berikut adalah beberapa referensi bug yang mungkin bermanfaat bagi Anda (dan mungkin ingin berlangganan / memberikan suara, memberi petunjuk, memberi petunjuk ...):


Bug Debian # 85123 ("sudo: SECURE_PATH masih tidak dapat ditimpa") (mulai 2001!)

Tampaknya Bug # 20996 masih ada dalam versi sudo ini. Changelog mengatakan bahwa itu dapat diganti pada saat runtime tetapi saya belum menemukan caranya.

Mereka menyebutkan menempatkan sesuatu seperti ini di file sudoers Anda:

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

tetapi ketika saya melakukannya di Ubuntu 8.10 setidaknya, itu memberi saya kesalahan ini:

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

Bug Ubuntu # 50797 ("sudo dibangun dengan --with-secure-path bermasalah")

Lebih buruk lagi, sejauh yang saya tahu, tidak mungkin meresesifikasi secure_path dalam file sudoers. Jadi, jika, misalnya, Anda ingin menawarkan pengguna Anda akses mudah ke sesuatu di bawah / opt, Anda harus mengkompilasi ulang sudo.


Iya. Sana perlu menjadi cara untuk menimpa ini "fitur" tanpa harus mengkompilasi ulang. Tidak ada yang lebih buruk dari para fanatik keamanan yang memberi tahu Anda apa yang terbaik untuk lingkungan Anda dan kemudian tidak memberi Anda cara untuk mematikannya.


Ini sangat menjengkelkan. Mungkin bijaksana untuk menjaga perilaku saat ini secara default untuk alasan keamanan, tetapi harus ada cara menimpanya selain mengkompilasi ulang dari kode sumber! Banyak orang yang membutuhkan warisan PATH. Saya bertanya-tanya mengapa tidak ada pengelola yang melihatnya, yang tampaknya mudah untuk menghasilkan solusi yang dapat diterima.


Saya mengatasinya seperti ini:

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

kemudian buat file / usr / bin / sudo yang berisi yang berikut ini:

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

maka sudo reguler Anda berfungsi seperti sudo non-path aman


Bug Ubuntu # 192651 ("jalur sudo selalu disetel ulang")

Mengingat bahwa duplikat bug ini awalnya diajukan pada Juli 2006, saya tidak jelas berapa lama env_keep tidak efektif telah beroperasi. Apa pun manfaatnya memaksa pengguna untuk menggunakan trik seperti yang tercantum di atas, tentu saja halaman manual untuk sudo dan sudoer harus mencerminkan fakta bahwa opsi untuk memodifikasi PATH secara efektif berlebihan.

Memodifikasi dokumentasi untuk mencerminkan eksekusi yang sebenarnya tidak mengganggu dan sangat membantu.


Bug Ubuntu # 226595 ("mustahil untuk mempertahankan / menentukan PATH")

Saya harus dapat menjalankan sudo dengan folder biner non-std tambahan di PATH. Setelah menambahkan persyaratan saya ke / etc / environment Saya terkejut ketika saya mendapatkan kesalahan tentang perintah yang hilang ketika menjalankannya di bawah sudo .....

Saya mencoba yang berikut ini untuk memperbaikinya tanpa berhasil:

  1. Menggunakan opsi " sudo -E" - tidak berfungsi. PATH saya yang ada masih direset oleh sudo

  2. Mengubah " Defaults env_reset" menjadi " Defaults !env_reset" di / etc / sudoers - juga tidak berhasil (bahkan ketika dikombinasikan dengan sudo -E)

  3. Membatalkan komentar env_reset(misalnya " #Defaults env_reset") di / etc / sudoers - juga tidak berfungsi.

  4. Menambahkan ' Defaults env_keep += "PATH"' ke / etc / sudoers - juga tidak berhasil.

Jelas - meskipun ada dokumentasi manual - sudo sepenuhnya di-hardcode tentang PATH dan tidak memungkinkan fleksibilitas mengenai mempertahankan PATH pengguna. Sangat menjengkelkan karena saya tidak dapat menjalankan perangkat lunak non-standar di bawah izin root menggunakan sudo.


13

Ini sepertinya bekerja untuk saya

sudo -i 

yang mengambil non-sudo PATH


'sudo -i' tidak membantu di Ubuntu (saya memeriksa Ubuntu 14.04.3 LTS). $ PATH masih dimodifikasi oleh sudo.
Marcin Raczyński

11

Saya pikir itu sebenarnya diinginkan untuk sudo me-reset PATH: jika tidak seorang penyerang mengkompromikan akun pengguna Anda bisa meletakkan versi backdoored semua jenis alat pada PATH pengguna Anda, dan mereka akan dieksekusi ketika menggunakan sudo.

(tentu saja setelah sudo reset PATH bukan solusi lengkap untuk masalah seperti ini, tetapi membantu)

Inilah yang sebenarnya terjadi ketika Anda menggunakan

Defaults env_reset

di / etc / sudoers tanpa menggunakan exempt_groupatau env_keep.

Ini juga nyaman karena Anda dapat menambahkan direktori yang hanya berguna untuk root (seperti /sbindan /usr/sbin) ke jalur sudo tanpa menambahkannya ke jalur pengguna Anda. Untuk menentukan jalur yang akan digunakan oleh sudo:

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

seorang penyerang yang mendapatkan akses ke akun sudoer dapat melakukan hal-hal yang lebih buruk.
user508546

Nasihat yang layak. Di ubuntu 12.04 Server, pengaturan serupa adalah default.
Tsutomu

7

Bekerja sekarang menggunakan sudo dari repositori karma. Detail dari konfigurasi saya:

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

Luar biasa akhirnya bisa diselesaikan tanpa menggunakan retasan.


4
Mungkin Anda akan mempertimbangkan untuk menulis ulang ini untuk menunjukkan bagaimana seseorang dengan pemasangan Karmic yang bersih dapat memperbarui konfigurasi mereka untuk menyelesaikan masalah khusus ini.
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

Cukup komentari "Defaults env_reset" di / etc / sudoers


3

Cukup edit env_keep di/etc/sudoers

Itu terlihat seperti ini:

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"

Cukup tambahkan PATH di bagian akhir, jadi setelah perubahan akan terlihat seperti ini:

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"

Tutup terminal dan kemudian buka lagi.


Tunggu PATH perlu 2 **? Mengapa PATH perlu **?
CMCDragonkai

@ CMCDragonkai Itu diformat sebagai huruf tebal (dalam penurunan harga), tetapi seseorang (stack overflow tidak akan membiarkan saya menunjukkan jari) mengeditnya untuk menandainya sebagai kode.
1j01

2

Secure_path adalah teman Anda, tetapi jika Anda ingin membebaskan diri dari secure_path lakukan saja

sudo visudo

Dan tambahkan

Default exempt_group = your_goup

Jika Anda ingin membebaskan sekelompok pengguna membuat grup, tambahkan semua pengguna ke dalamnya, dan gunakan itu sebagai exempt_group Anda. man 5 sudoers untuk lebih.


1

solusi yang direkomendasikan dalam komentar di distro OpenSUSE menyarankan untuk berubah:

Defaults env_reset

untuk:

Defaults !env_reset

dan mungkin mengomentari baris berikut yang tidak diperlukan:

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

komentar kedua "Default env_reset" dan "Default secure_path ..." di file / etc / sudores bekerja untuk saya


1

Anda juga dapat memindahkan file Anda di direktori sudoers bekas:

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

0

Eh, ini bukan ujian jika Anda tidak menambahkan sesuatu ke jalur Anda:

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: ~ $ yang foo
/ opt / pkg / bin / foo
bill @ bill-desktop: ~ $ sudo su
root @ bill-desktop: / home / bill # yang foo
root @ bill-desktop: / home / bill # 

0

PATH akan diatur ulang saat menggunakan su atau sudo dengan definisi ENV_SUPATH, dan ENV_PATH didefinisikan dalam /etc/login.defs


0

$ PATH adalah variabel lingkungan dan itu berarti bahwa nilai $ PATH dapat berbeda untuk pengguna lain.

Ketika Anda melakukan login ke sistem Anda, maka pengaturan profil Anda menentukan nilai $ PATH .

Sekarang, mari kita lihat: -

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

Misalkan ini adalah nilai $ PATH untuk pengguna yang berbeda. Sekarang ketika Anda menjalankan perintah apa pun dengan sudo maka dalam arti sebenarnya pengguna root mengeksekusi perintah itu.

Anda dapat mengonfirmasi dengan menjalankan perintah-perintah ini pada terminal: -

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

Ini alasannya. Saya pikir itu jelas bagi Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.