
root
Benutzerdürfenin eine Datei schreiben, auch wenn die write
Berechtigungen dafür nicht festgelegt sind.
root
BenutzerdürfenLesen Sie eine Datei, auch wenn ihre read
Berechtigungen nicht festgelegt sind.
root
Benutzerdürfen cd
in ein Verzeichnis, auch wenn dessen execute
Berechtigungen nicht festgelegt sind.
root
Benutzerkann nichtFühren Sie eine Datei aus, wenn ihre execute
Berechtigungen nicht festgelegt sind.
Warum?
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
Antwort1
Kurz gesagt, weil das Execute-Bit als speziell angesehen wird; wenn es nicht gesetzt istüberhaupt, dann wird die Datei als nicht ausführbar betrachtet und kann somit nicht ausgeführt werden.
Wenn jedoch auch nur EINES der Ausführungsbits gesetzt ist, kann und wird Root es ausführen.
Beobachten:
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!
Antwort2
Früher befanden sich Systemadministrationstools /etc
wie /etc/restore
, /etc/rrestore
, /etc/init
, /etc/halt
, usw. Stellen Sie sich vor, was passieren würde, wenn root
's PATH
auf eingestellt wäre /etc:/bin
und root
ausgeführt würde passwd
.
Es würde nicht richtig funktionieren.
Um die Sache noch schlimmer zu machen, hatten binäre ausführbare Dateien früher keine magischen Header, sodass man nur durch Überprüfen der Berechtigungsbits überprüfen konnte, ob die Binärdatei ausführbar war. Daher wurden Dateien zu keinen gültigen Zielen von exec
*, es sei denn, es handelte sich tatsächlich um Dateien (keine Verzeichnisse usw.) und mindestens ein Ausführungsbit war gesetzt.
*Die Prüfung erfolgte möglicherweise in execvp, einer Benutzermodusfunktion.
Es handelt sich dennoch um eine nützliche Prüfung, da theoretisch alles ein Shell-Skript sein könnte. Warum also sollte man es herausnehmen?