
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
и т. д. Представьте, что бы произошло, если бы root
s PATH
был установлен /etc:/bin
и root
запущен passwd
.
Это не сработает как надо.
Хуже того, в старые времена исполняемые двоичные файлы не имели магических заголовков, поэтому проверка того, является ли двоичный файл исполняемым, была невозможна, за исключением проверки битов разрешений. Поэтому они сделали файлы недопустимыми целями exec
*, если только они не были фактическими файлами (не каталогами и т. д.) и не имели по крайней мере одного установленного бита выполнения.
*Проверка могла быть в execvp, которая является функцией пользовательского режима.
Это все еще полезная проверка, поскольку теоретически все что угодно может оказаться скриптом оболочки, так зачем же ее убирать?