
root
do utilizadorpodegravar em um arquivo mesmo que suas write
permissões não estejam definidas.
root
do utilizadorpodeleia um arquivo mesmo que suas read
permissões não estejam definidas.
root
do utilizadorpode cd
em um diretório mesmo que suas execute
permissões não estejam definidas.
root
do utilizadornão podeexecutar um arquivo quando suas execute
permissõ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 /etc
como /etc/restore
, /etc/rrestore
, /etc/init
, /etc/halt
, etc. Imagine o que aconteceria se root
o ' PATH
fosse configurado /etc:/bin
e root
executado 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?