Mengapa tidak dapat melakukan root eksekusi ketika bit yang dapat dieksekusi tidak diatur?

26

rootpengguna dapat menulis ke file bahkan jika writeizinnya tidak ditetapkan.

rootpengguna dapat membaca file bahkan jika readizinnya tidak ditetapkan.

rootpengguna dapat cd masuk ke direktori bahkan jika executeizinnya tidak ditetapkan.

rootpengguna tidak dapat mengeksekusi file ketika executeizinnya tidak diatur.

Mengapa?

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
sumber

Jawaban:

25

Singkatnya, karena bit eksekusi dianggap spesial; jika tidak disetel sama sekali , maka file tersebut dianggap tidak dapat dieksekusi dan karenanya tidak dapat dieksekusi.

Namun, jika bahkan SATU bit eksekusi diatur, root dapat dan akan mengeksekusi itu.

Mengamati:

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
sumber
0

Dalam alat administrasi hari sistem lama tinggal di /etcseperti /etc/restore, /etc/rrestore, /etc/init, /etc/halt, dll Bayangkan apa yang akan terjadi jika root's PATHditetapkan untuk /etc:/bindan rootberlari passwd.

Itu tidak akan berhasil.

Lebih buruk lagi, di masa lalu, executable biner tidak memiliki header ajaib, jadi memeriksa apakah biner adalah executable tidak benar-benar mungkin kecuali dengan memeriksa bit izin. Jadi mereka membuat file bukan target yang valid dari exec* kecuali mereka benar-benar file (tidak ada direktori, dll.) Dan memiliki setidaknya satu set bit eksekusi.

* Pemeriksaan mungkin di execvp, yang merupakan fungsi mode pengguna.

Ini masih merupakan pemeriksaan yang berguna karena secara teori apapun bisa berupa skrip shell, jadi mengapa mengeluarkannya?

Joshua
sumber