Dlaczego root nie może wykonać, gdy bity wykonywalne nie są ustawione?

26

rootużytkownik może zapisywać do pliku, nawet jeśli jego writeuprawnienia nie są ustawione.

rootużytkownik może odczytać plik, nawet jeśli jego readuprawnienia nie są ustawione.

rootużytkownik może cd wejść do katalogu, nawet jeśli jego executeuprawnienia nie są ustawione.

rootużytkownik nie może wykonać pliku, gdy jego executeuprawnienia nie są ustawione.

Czemu?

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
musa
źródło

Odpowiedzi:

25

Krótko mówiąc, ponieważ bit wykonania jest uważany za specjalny; jeśli nie jest ustawiony w ogóle , to plik jest uważany za nie wykonywalny, a tym samym nie może być wykonana.

Jeśli jednak ustawiony jest JEDEN z bitów wykonania, root może go wykonać.

Przestrzegać:

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!
Shadur
źródło
0

W dawnych narzędzi administracyjnych dzień żyli w systemie /etc, takich jak /etc/restore, /etc/rrestore, /etc/init, /etc/halt, itd. Wyobraź sobie, co by się stało, gdyby root„s PATHbył ustawiony /etc:/bini rootran passwd.

To by nie działało dobrze.

Co gorsza, w dawnych czasach binarne pliki wykonywalne nie miały magicznych nagłówków, więc sprawdzenie, czy plik binarny był plikiem wykonywalnym, nie było tak naprawdę możliwe, poza sprawdzeniem bitów uprawnień. Zrobili więc pliki niepoprawnymi obiektami docelowymi exec*, chyba że faktycznie były plikami (bez katalogów itp.) I mieli co najmniej jeden zestaw bitów wykonania.

* Sprawdzenie mogło być wykonane w execvp, który jest funkcją trybu użytkownika.

To wciąż przydatna kontrola, ponieważ teoretycznie wszystko może być skryptem powłoki, więc po co to wyjmować?

Jozuego
źródło