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

26

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
Musa
источник

Ответы:

25

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

Однако, если установлен ОДИН из битов выполнения, 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!
Shadur
источник
0

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

Это не будет работать правильно.

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

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

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

Джошуа
источник