Perché il root non può essere eseguito quando i bit eseguibili non sono impostati?


26

rootl'utente può scrivere su un file anche se le sue writeautorizzazioni non sono impostate.

rootl'utente può leggere un file anche se le sue readautorizzazioni non sono impostate.

rootl'utente può cd accedere a una directory anche se le sue executeautorizzazioni non sono impostate.

rootl'utente non può eseguire un file quando le sue executeautorizzazioni non sono impostate.

Perché?

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

Risposte:


25

In breve, perché il bit di esecuzione è considerato speciale; se non è impostato a tutti , allora il file è considerato non un eseguibile e quindi non può essere eseguito.

Tuttavia, se è impostato anche UNO dei bit di esecuzione, root può e lo eseguirà.

Osservare:

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

Ai vecchi strumenti di amministrazione di sistema giorni vissuti in /etcquali /etc/restore, /etc/rrestore, /etc/init, /etc/halt, ecc immaginare cosa accadrebbe se root's PATHè stato impostato su /etc:/bine rootcorse passwd.

Non funzionerebbe bene.

A peggiorare le cose, ai vecchi tempi, gli eseguibili binari non avevano intestazioni magiche, quindi controllare se il binario fosse un eseguibile non era davvero possibile se non controllando i bit di autorizzazione. Quindi hanno creato file non validi come target di exec* a meno che non fossero effettivamente file (nessuna directory, ecc.) E avevano almeno un bit di esecuzione impostato.

* Il controllo potrebbe essere stato in execvp, che è una funzione in modalità utente.

È ancora un controllo utile poiché in teoria qualsiasi cosa potrebbe essere uno script di shell, quindi perché eliminarlo?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.