Por que o root não pode ser executado quando os bits executáveis ​​não estão definidos?

Por que o root não pode ser executado quando os bits executáveis ​​não estão definidos?

rootdo utilizadorpodegravar em um arquivo mesmo que suas writepermissões não estejam definidas.

rootdo utilizadorpodeleia um arquivo mesmo que suas readpermissões não estejam definidas.

rootdo utilizadorpode cdem um diretório mesmo que suas executepermissões não estejam definidas.

rootdo utilizadornão podeexecutar um arquivo quando suas executepermissões não estiverem definidas.

Por que?

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

Responder1

Resumindo, porque o bit de execução é considerado especial; se não estiver definidode forma alguma, o arquivo será considerado não executável e, portanto, não poderá ser executado.

No entanto, se pelo menos UM dos bits de execução estiver definido, o root pode e irá executá-lo.

Observar:

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!

Responder2

Antigamente, existiam ferramentas de administração de sistema /etccomo /etc/restore, /etc/rrestore, /etc/init, /etc/halt, etc. Imagine o que aconteceria se rooto ' PATHfosse configurado /etc:/bine rootexecutado passwd.

Não funcionaria direito.

Para piorar a situação, antigamente, os executáveis ​​binários não tinham cabeçalhos mágicos, portanto, verificar se o binário era um executável não era realmente possível, exceto verificando os bits de permissão. Portanto, eles transformaram os arquivos em alvos não válidos de exec*, a menos que fossem realmente arquivos (sem diretórios, etc.) e tivessem pelo menos um bit de execução definido.

*A verificação pode ter sido feita em execvp, que é uma função de modo de usuário.

Ainda é uma verificação útil, pois em teoria qualquer coisa poderia ser um script de shell, então por que retirá-lo?

informação relacionada