Почему root не может выполнить действие, если исполняемые биты не установлены?

Почему root не может выполнить действие, если исполняемые биты не установлены?

rootпользовательможетзапись в файл, даже если для него writeне установлены разрешения.

rootпользовательможетчитать файл, даже если для него readне установлены разрешения.

rootпользовательможет cdв каталог, даже если для него executeне установлены разрешения.

rootпользовательне могувыполнить файл, если для него executeне установлены разрешения.

Почему?

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

решение1

Короче говоря, потому что бит выполнения считается специальным; если он не установленсовсем, то файл считается не исполняемым и, следовательно, не может быть выполнен.

Однако если установлен хотя бы ОДИН из битов выполнения, root может и будет его выполнять.

Наблюдать:

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!

решение2

В старые времена инструменты системного администрирования размещались в /etcтаких файлах, как /etc/restore, /etc/rrestore, /etc/init, /etc/haltи т. д. Представьте, что бы произошло, если бы roots PATHбыл установлен /etc:/binи rootзапущен passwd.

Это не сработает как надо.

Хуже того, в старые времена исполняемые двоичные файлы не имели магических заголовков, поэтому проверка того, является ли двоичный файл исполняемым, была невозможна, за исключением проверки битов разрешений. Поэтому они сделали файлы недопустимыми целями exec*, если только они не были фактическими файлами (не каталогами и т. д.) и не имели по крайней мере одного установленного бита выполнения.

*Проверка могла быть в execvp, которая является функцией пользовательского режима.

Это все еще полезная проверка, поскольку теоретически все что угодно может оказаться скриптом оболочки, так зачем же ее убирать?

Связанный контент