Tại sao sudo thay đổi PATH?


281

Đây là PATHbiến không có sudo:

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

Đây là PATHbiến có sudo:

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

Theo như tôi có thể nói, sudođược cho là PATHkhông bị ảnh hưởng. Chuyện gì đang xảy ra vậy? Làm thế nào để tôi thay đổi điều này? (Đây là trên Ubuntu 8.04).

CẬP NHẬT: theo như tôi có thể thấy, không có đoạn script nào bắt đầu khi root thay đổi PATHtheo bất kỳ cách nào.

Từ man sudo:

Để ngăn chặn giả mạo lệnh, sudo kiểm tra ``. '' Và `` '' (cả hai biểu thị thư mục hiện tại) lần cuối khi tìm kiếm một lệnh trong PATH của người dùng (nếu một hoặc cả hai đều nằm trong PATH). Tuy nhiên, lưu ý rằng biến môi trường PATH thực tế không được sửa đổi và được truyền không thay đổi cho chương trình mà sudo thực thi.


Liệu root có bất cứ thứ gì thiết lập PATH trong .bashrc không? Điều này giả định rằng vì bạn đang dùng Linux, sh thực sự rất bash.
Greg Hewgill

Câu trả lời:


241

Đây là một chức năng gây phiền nhiễu một tính năng của sudo trên nhiều bản phân phối.

Để khắc phục "sự cố" này trên Ubuntu, tôi làm như sau trong ~ / .bashrc

alias sudo='sudo env PATH=$PATH'

Lưu ý ở trên sẽ hoạt động đối với các lệnh không tự đặt lại $ PATH. Tuy nhiên, 'su' đặt lại nó là $ PATH nên bạn phải sử dụng -p để nói là không. I E:

sudo su -p

46
"Chức năng gây phiền nhiễu" này ngăn bạn khỏi bị trojan. Tôi nói việc buộc $ PATH cụ thể là một tính năng, không phải là lỗi --- nó khiến bạn viết ra đường dẫn đầy đủ đến một chương trình nằm ngoài $ PATH.
Chris Jester-Young

29
Vâng, nhưng nó hoàn toàn phản trực giác. Nó có lẽ đánh lừa những người tốt hơn những kẻ xấu.
Brian Armstrong

31
Không chỉ là phản trực giác, nó còn được ghi lại không chính xác. Đọc các trang man cho sudo và so sánh cấu hình với hộp Fedora, tôi nghĩ rằng đường dẫn nên được giữ nguyên. Thật vậy, "sudo -V" thậm chí còn nói "Biến môi trường cần bảo tồn: PATH".
Jason R. Coombs

6
phiền thật đấy. giai đoạn = Stage. nếu nó có thể 'khiến bạn bị trojan' bởi sudo, nó có thể khiến bạn bị trojan giống như vậy mà không có nó. cấp, khó hơn, nhưng nếu bạn đang chạy mã từ sai vị trí ngay cả với người dùng thông thường của bạn, thì mọi thứ đã đủ tồi tệ.
gcb

7
Đừng bí danh sudo; xem câu trả lời từ @Jacob về Mặc định env_reset.
greg_1_anderson

121

Trong trường hợp người khác chạy theo điều này và muốn vô hiệu hóa tất cả các biến đường dẫn thay đổi cho tất cả người dùng.
Truy cập tệp sudoers của bạn bằng cách sử dụng lệnh : visudo. Bạn sẽ thấy dòng sau đây ở đâu đó:

Mặc định env_reset

mà bạn nên thêm vào sau đây trên dòng tiếp theo

Mặc định! Secure_path

Secure_path được bật theo mặc định. Tùy chọn này chỉ định những gì để tạo $ PATH khi sudoing. Dấu chấm than sẽ vô hiệu hóa tính năng này.


6
một cách khác:Defaults env_keep = "PATH"
gcb

1
Mặc định! Secure_path hoạt động rất tốt cho tôi trên các hệ thống hiện đại; trên một hộp ubfox 8.04 cũ, Mặc định env_keep = "PATH" đã thực hiện thủ thuật này.
greg_1_anderson

29
Thay vì vô hiệu hóa safe_path, bạn có thể thêm vào nó. Ví dụ: trong trường hợp của tôi, tôi đã thêm dòng "Mặc định safe_path = / sbin: / bin: / usr / sbin: / usr / bin: / some / custom / thư mục" trong đó "some / custom / thư mục" là đường dẫn mà tôi cần để sẵn sàng cho sudo.
Hector Correa

Giải pháp @HectorCorrea là cách tốt hơn IMO.
chakrit

32

PATH là một biến môi trường và như vậy là theo mặc định được đặt lại bởi sudo.

Bạn cần quyền đặc biệt để được phép làm điều này.

Từ man sudo

       -E Tùy chọn -E (bảo vệ môi trường) sẽ ghi đè env_reset
           tùy chọn trong sudoers (5)). Nó chỉ khả dụng khi một trong hai trận đấu-
           Lệnh ing có thẻ SETENV hoặc tùy chọn setenv được đặt trong sudo-
           ers (5).
       Các biến môi trường được đặt cho lệnh cũng có thể được truyền vào
       dòng lệnh ở dạng VAR = value, ví dụ
        LD_LIBRARY_PATH = / usr / local / pkg / lib. Các biến được truyền vào lệnh
       dòng có thể bị hạn chế giống như môi trường bình thường
       ables với một ngoại lệ quan trọng. Nếu tùy chọn setenv được đặt trong
       sudoers, lệnh được chạy có bộ thẻ SETENV hoặc lệnh
       khớp là TẤT CẢ, người dùng có thể đặt các biến quá mức sẽ là-
       bị cấm Xem sudoers (5) để biết thêm thông tin.

Một ví dụ về việc sử dụng:

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

cập nhật

người đàn ông 5 sudoers: 

     env_reset Nếu được đặt, sudo sẽ đặt lại môi trường thành chỉ chứa
                       LOGNAME, SHELL, USER, USERNAME và SUDO_ * vari-
                       ables. Bất kỳ biến nào trong môi trường của người gọi
                       phù hợp với danh sách env_keep và env_check sau đó được thêm vào.
                       Nội dung mặc định của env_keep và env_check
                       danh sách được hiển thị khi sudo được chạy bằng root với
                       Tùy chọn -V. Nếu sudo được biên dịch với SECURE_PATH
                       tùy chọn, giá trị của nó sẽ được sử dụng cho môi trường PATH
                       Biến đổi. Cờ này được bật theo mặc định.

Vì vậy, có thể cần phải kiểm tra xem đây là / không được biên dịch trong.

Theo mặc định trong 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

Có vẻ như lỗi này đã xuất hiện khá lâu! Dưới đây là một số tài liệu tham khảo lỗi bạn có thể thấy hữu ích (và có thể muốn đăng ký / bỏ phiếu, gợi ý, gợi ý ...):


Lỗi Debian # 85123 ("sudo: SECURE_PATH vẫn không thể bị ghi đè") (từ năm 2001!)

Có vẻ như Bug # 20996 vẫn có mặt trong phiên bản sudo này. Thay đổi nói rằng nó có thể bị ghi đè khi chạy nhưng tôi chưa khám phá ra làm thế nào.

Họ đề cập đến việc đưa một cái gì đó như thế này vào tập tin sudoers của bạn:

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

nhưng ít nhất khi tôi làm điều đó trong Ubuntu 8.10, nó sẽ báo lỗi này:

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

Lỗi Ubuntu # 50797 ("sudo được xây dựng với - với đường dẫn an toàn là có vấn đề")

Tệ hơn nữa, theo như tôi có thể nói, không thể xác nhận lại Secure_path trong tệp sudoers. Vì vậy, nếu, ví dụ, bạn muốn cung cấp cho người dùng của mình quyền truy cập dễ dàng vào nội dung / opt, bạn phải biên dịch lại sudo.


Đúng. Có cần phải là một cách để ghi đè lên "tính năng" này mà không cần phải biên dịch lại. Không có gì tệ hơn sau đó các nhóm bảo mật cho bạn biết những gì tốt nhất cho môi trường của bạn và sau đó không cung cấp cho bạn cách tắt nó.


Điều này thực sự gây phiền nhiễu. Có thể là khôn ngoan để giữ hành vi hiện tại theo mặc định vì lý do bảo mật, nhưng nên có cách ghi đè lên nó ngoài việc biên dịch lại từ mã nguồn! Nhiều người đang cần thừa kế PATH. Tôi tự hỏi tại sao không có người bảo trì nhìn vào nó, có vẻ dễ dàng đưa ra một giải pháp chấp nhận được.


Tôi đã làm việc xung quanh nó như thế này:

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

sau đó tạo một tập tin / usr / bin / sudo chứa các mục sau:

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

sau đó sudo thông thường của bạn hoạt động giống như sudo không bảo mật


Lỗi Ubuntu # 192651 ("đường dẫn sudo luôn được đặt lại")

Cho rằng một bản sao của lỗi này ban đầu được nộp vào tháng 7 năm 2006, tôi không rõ một env_keep không hiệu quả đã hoạt động được bao lâu. Bất kể giá trị nào của việc buộc người dùng sử dụng các thủ thuật như được liệt kê ở trên, chắc chắn các trang dành cho sudo và sudoers sẽ phản ánh thực tế rằng các tùy chọn để sửa đổi PATH có hiệu quả.

Sửa đổi tài liệu để phản ánh thực thi thực tế là không ổn định và rất hữu ích.


Lỗi Ubuntu # 226595 ("không thể giữ lại / chỉ định PATH")

Tôi cần có khả năng chạy sudo với các thư mục nhị phân không phải tiêu chuẩn bổ sung trong PATH. Khi đã thêm các yêu cầu của tôi vào / etc / môi trường, tôi rất ngạc nhiên khi tôi gặp lỗi về các lệnh bị thiếu khi chạy chúng dưới sudo .....

Tôi đã thử cách sau để khắc phục điều này mà không thành công:

  1. Sử dụng sudo -Etùy chọn "" - không hoạt động. PATH hiện tại của tôi vẫn được đặt lại bởi sudo

  2. Thay đổi " Defaults env_reset" thành " Defaults !env_reset" trong / etc / sudoers - cũng không hoạt động (ngay cả khi kết hợp với sudo -E)

  3. Uncommenting env_reset(ví dụ " #Defaults env_reset") trong / etc / sudoers - cũng không hoạt động.

  4. Thêm ' Defaults env_keep += "PATH"' vào / etc / sudoers - cũng không hoạt động.

Rõ ràng - mặc dù tài liệu hướng dẫn - sudo hoàn toàn được mã hóa liên quan đến PATH và không cho phép bất kỳ sự linh hoạt nào liên quan đến việc giữ lại người dùng PATH. Rất khó chịu vì tôi không thể chạy phần mềm không mặc định dưới quyền root bằng sudo.


13

Điều này dường như làm việc cho tôi

sudo -i 

mà không có sudo PATH


'sudo -i' không giúp ích gì cho Ubuntu (Tôi đã kiểm tra Ubuntu 14.04.3 LTS). $ PATH vẫn được sửa đổi bởi sudo.
Marcin Raczyński

11

Tôi nghĩ rằng trên thực tế rất mong muốn sudo đặt lại PATH: nếu không, kẻ tấn công đã xâm phạm tài khoản người dùng của bạn có thể đặt các phiên bản backlink của tất cả các loại công cụ trên PATH của người dùng của bạn và chúng sẽ được thực thi khi sử dụng sudo.

(tất nhiên việc sudo reset PATH không phải là giải pháp hoàn chỉnh cho các loại vấn đề này, nhưng nó giúp)

Đây thực sự là những gì xảy ra khi bạn sử dụng

Defaults env_reset

trong / etc / sudoers mà không sử dụng exempt_grouphoặcenv_keep .

Điều này cũng thuận tiện vì bạn có thể thêm các thư mục chỉ hữu ích cho root (chẳng hạn như /sbin/usr/sbin) vào đường dẫn sudo mà không cần thêm chúng vào đường dẫn của người dùng. Để chỉ định đường dẫn được sử dụng bởi sudo:

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

kẻ tấn công giành được tài khoản sudoer có thể làm những việc còn tồi tệ hơn.
dùng508546

Một lời khuyên đàng hoàng. Trên máy chủ Ubuntu 12.04, một cài đặt tương tự được mặc định.
Tsutomu

7

Hiện đang hoạt động bằng cách sử dụng sudo từ kho lưu trữ nghiệp. Chi tiết từ cấu hình của tôi:

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

Thật tuyệt vời khi cuối cùng đã giải quyết vấn đề này mà không cần sử dụng hack.


4
Có lẽ bạn sẽ cân nhắc viết lại phần này để cho biết ai đó với bản cài đặt Karmic sạch có thể cập nhật cấu hình của họ để giải quyết vấn đề cụ thể này.
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

Chỉ cần nhận xét "Mặc định env_reset" trong / etc / sudoers


3

Chỉ cần chỉnh sửa env_keeptrong/etc/sudoers

Nó trông giống như thế này:

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"

Chỉ cần thêm PATH vào cuối, vì vậy sau khi thay đổi, nó sẽ trông như thế này:

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"

Đóng thiết bị đầu cuối và sau đó mở lại.


Đợi PATH cần 2 **? Tại sao PATH cần **?
CMCDragonkai

@CMCDragonkai Nó được định dạng là đậm (in markdown), nhưng ai đó (stack overflow sẽ không cho tôi chỉ tay) chỉnh sửa nó để đánh dấu nó thành mã.
1j01

2

Secure_path là bạn của bạn, nhưng nếu bạn muốn miễn cho mình khỏi safe_path, hãy làm

sudo visudo

Và chắp thêm

Mặc định miễn_group = your_goup

Nếu bạn muốn miễn cho một nhóm người dùng tạo một nhóm, hãy thêm tất cả người dùng vào đó và sử dụng nhóm đó làm nhóm miễn trừ của bạn. người đàn ông 5 sudoers để biết thêm.


1

giải pháp được đề xuất trong các nhận xét về bản phân phối OpenSUSE đề nghị thay đổi:

Defaults env_reset

đến:

Defaults !env_reset

và sau đó có lẽ để bình luận về dòng sau đây không cần thiết:

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

nhận xét cả "Mặc định env_reset" và "Mặc định Secure_path ..." trong tệp / etc / sudores hoạt động với tôi


1

Bạn cũng có thể di chuyển tệp của mình trong thư mục được sử dụng sudoers:

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

0

Er, nó không thực sự là một thử nghiệm nếu bạn không thêm thứ gì vào đường dẫn của mình:

bill @ bill-desktop: ~ $ ls -l / opt / pkg / bin
tổng số 12
-rwxr-xr-x 1 root root 28 2009-01-22 18:58 foo
bill @ bill-desktop: ~ $ mà foo
/ opt / pkg / bin / foo
bill @ bill-desktop: ~ $ sudo su
root @ bill-desktop: / home / bill # mà foo
root @ bill-desktop: / home / bill # 

0

PATH sẽ được đặt lại khi sử dụng su hoặc sudo theo định nghĩa của ENV_SUPATH và ENV_PATH được xác định trong /etc/login.defs


0

$ PATH là một biến môi trường và điều đó có nghĩa là giá trị của $ PATH có thể khác nhau đối với người dùng khác.

Khi bạn đang đăng nhập vào hệ thống thì cài đặt hồ sơ của bạn sẽ quyết định giá trị của $ PATH .

Bây giờ, hãy xem: -

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

Giả sử rằng đây là các giá trị của $ PATH cho người dùng khác nhau. Bây giờ khi bạn đang thực thi bất kỳ lệnh nào với sudo thì thực tế người dùng root thực thi lệnh đó.

Bạn có thể xác nhận bằng cách thực hiện các lệnh này trên thiết bị đầu cuối: -

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

Đây là lý do. Tôi nghĩ rằng nó rõ ràng với bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.