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

26

rooto usuário pode gravar em um arquivo mesmo que suas writepermissões não estejam definidas.

rooto usuário pode ler um arquivo mesmo que suas readpermissões não estejam definidas.

rooto usuário pode cd entrar em um diretório, mesmo que suas executepermissões não estejam definidas.

rooto usuário não pode executar um arquivo quando suas executepermissões não estão definidas.

Por quê?

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
fonte

Respostas:

25

Em resumo, porque o bit de execução é considerado especial; se não for definido em tudo , então o arquivo é considerado não um executável e, portanto, não pode ser executado.

No entanto, se um dos bits de execução estiver definido, o root poderá 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!
Shadur
fonte
0

Nos velhos ferramentas de administração dias sistema viviam em /etctais como /etc/restore, /etc/rrestore, /etc/init, /etc/halt, etc. Imagine o que aconteceria se root's PATHfoi definido para /etc:/bine rootcorreu passwd.

Não funcionaria direito.

Para piorar as coisas, 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 criaram arquivos que não são alvos válidos de exec*, a menos que fossem arquivos (sem diretórios etc.) e tivessem pelo menos um conjunto de bits de execução.

* A verificação pode estar no execvp, que é uma função do modo de usuário.

Ainda é uma verificação útil, pois, em teoria, qualquer coisa poderia ser um shell script, então por que fazer isso?

Joshua
fonte