¿Por qué no se puede ejecutar root cuando los bits ejecutables no están configurados?

¿Por qué no se puede ejecutar root cuando los bits ejecutables no están configurados?

rootusuariopoderescribir en un archivo incluso si sus writepermisos no están establecidos.

rootusuariopoderleer un archivo incluso si sus readpermisos no están establecidos.

rootusuariopoder cden un directorio incluso si sus executepermisos no están establecidos.

rootusuariono puedoejecutar un archivo cuando sus executepermisos no están establecidos.

¿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

Respuesta1

En definitiva, porque el bit de ejecución se considera especial; si no está configuradoen absoluto, entonces se considera que el archivo no es ejecutable y, por lo tanto, no se puede ejecutar.

Sin embargo, si se establece incluso UNO de los bits de ejecución, el root puede ejecutarlo y lo ejecutará.

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!

Respuesta2

En los viejos tiempos, las herramientas de administración de sistemas vivían en /etctales como /etc/restore, /etc/rrestore, /etc/init, /etc/halt, etc. Imagínese lo que pasaría si root's PATHestuviera configurado /etc:/biny rootejecutado passwd.

No funcionaría bien.

Para empeorar las cosas, en los viejos tiempos, los ejecutables binarios no tenían encabezados mágicos, por lo que verificar si el binario era un ejecutable no era realmente posible excepto verificando los bits de permiso. Por lo tanto, hicieron que los archivos no fueran objetivos válidos de exec* a menos que en realidad fueran archivos (sin directorios, etc.) y tuvieran al menos un bit de ejecución establecido.

*La verificación podría haber sido en execvp, que es una función en modo de usuario.

Sigue siendo una comprobación útil ya que, en teoría, cualquier cosa podría ser un script de shell, entonces, ¿por qué eliminarlo?

información relacionada