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

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!

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?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.