Tại sao root không thể thực thi khi bit thực thi không được đặt?


26

rootngười dùng có thể ghi vào một tập tin ngay cả khi writequyền của nó không được thiết lập.

rootngười dùng có thể đọc một tập tin ngay cả khi readquyền của nó không được thiết lập.

rootngười dùng có thể cd vào một thư mục ngay cả khi executequyền của nó không được đặt.

rootngười dùng không thể thực thi một tập tin khi executequyền của nó không được thiết lập.

Tại sao?

user$ echo '#!'$(which bash) > file
user$ chmod 000 file
user$ ls -l file
---------- 1 user user 12 Jul 17 11:11 file
user$ cat file                      # Normal user cannot read
cat: file: Permission denied
user$ su
root$ echo 'echo hello' >> file     # root can write
root$ cat file                      # root can read
#!/bin/bash
echo hello
root$ ./file                        # root cannot execute
bash: ./file: Permission denied

Câu trả lời:


25

Nói tóm lại, vì bit thực thi được coi là đặc biệt; nếu nó không được thiết lập ở tất cả , sau đó các tập tin được coi là không phải là một thực thi và do đó không thể được thực hiện.

Tuy nhiên, nếu thậm chí MỘT trong số các bit thực thi được đặt, root có thể và sẽ thực thi nó.

Quan sát:

caleburn: ~/ >cat hello.sh
#!/bin/sh

echo "Hello!"

caleburn: ~/ >chmod 000 hello.sh
caleburn: ~/ >./hello.sh
-bash: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
sudo: ./hello.sh: command not found

caleburn: ~/ >chmod 100 hello.sh
caleburn: ~/ >./hello.sh
/bin/sh: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
Hello!

0

Trong công cụ quản trị hệ thống cũ ngày sống trong /etcnhư /etc/restore, /etc/rrestore, /etc/init, /etc/haltvv Hãy tưởng tượng điều gì sẽ xảy ra nếu root's PATHđã được thiết lập để /etc:/binrootran passwd.

Nó sẽ không hoạt động đúng.

Để làm cho vấn đề tồi tệ hơn, vào thời xưa, các tệp thực thi nhị phân không có các tiêu đề ma thuật, vì vậy việc kiểm tra xem nhị phân có phải là một thực thi không thực sự có thể ngoại trừ bằng cách kiểm tra các bit cho phép. Vì vậy, họ đã tạo các tệp không phải là mục tiêu hợp lệ của exec* trừ khi chúng thực sự là các tệp (không có thư mục, v.v.) và có ít nhất một tập bit thực thi.

* Kiểm tra có thể đã có trong execvp, đó là chức năng chế độ người dùng.

Đây vẫn là một kiểm tra hữu ích vì trên lý thuyết, mọi thứ đều có thể là kịch bản shell, vậy tại sao lại lấy nó ra?

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.