Warum kann Root nicht ausgeführt werden, wenn die ausführbaren Bits nicht gesetzt sind?

Warum kann Root nicht ausgeführt werden, wenn die ausführbaren Bits nicht gesetzt sind?

rootBenutzerdürfenin eine Datei schreiben, auch wenn die writeBerechtigungen dafür nicht festgelegt sind.

rootBenutzerdürfenLesen Sie eine Datei, auch wenn ihre readBerechtigungen nicht festgelegt sind.

rootBenutzerdürfen cdin ein Verzeichnis, auch wenn dessen executeBerechtigungen nicht festgelegt sind.

rootBenutzerkann nichtFühren Sie eine Datei aus, wenn ihre executeBerechtigungen 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 /etcwie /etc/restore, /etc/rrestore, /etc/init, /etc/halt, usw. Stellen Sie sich vor, was passieren würde, wenn root's PATHauf eingestellt wäre /etc:/binund rootausgefü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?

verwandte Informationen