Apa kasus penggunaan yang valid untuk izin file "eksekusi saja"?

20

Saya membaca tentang chmod dan mode oktalnya . Saya melihat itu 1hanya mengeksekusi. Apa kasus penggunaan yang valid untuk izin yang hanya menjalankan? Untuk mengeksekusi file, orang biasanya ingin membaca dan mengeksekusi izin.

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo
popedotninja
sumber

Jawaban:

41

Skrip Shell memerlukan izin baca untuk dijalankan, tetapi file biner tidak:

$ cat hello.cpp
#include<iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission

Menampilkan konten file dan mengeksekusinya adalah dua hal yang berbeda. Dengan skrip shell, hal-hal ini terkait karena mereka "dieksekusi" dengan "membacanya" menjadi shell baru (atau yang sekarang), jika Anda akan memaafkan penyederhanaan. Inilah sebabnya mengapa Anda harus bisa membacanya. Biner tidak menggunakan mekanisme itu.

Untuk direktori, izin eksekusi sedikit berbeda; itu berarti Anda dapat melakukan hal-hal pada file di dalam direktori tersebut (misalnya membaca atau menjalankannya). Jadi katakanlah Anda memiliki seperangkat alat /toolsyang Anda inginkan agar orang dapat menggunakannya, tetapi hanya jika mereka mengetahuinya. chmod 711 /tools. Maka hal-hal yang /toolsdapat dieksekusi di dapat dijalankan secara eksplisit (misalnya /tools/mytool), tetapi ls /tools/akan ditolak. Demikian pula, dokumen dapat disimpan di /private-docsmana dapat dibaca jika dan hanya jika nama file diketahui.

DopeGhoti
sumber
1
Kebetulan tidak ada gunanya mengatur eksekusi-saja pada sistem biner lagi kecuali Anda menjalankan ftp anonim.
Joshua
1
Juga, mengatur bit yang dapat dieksekusi pada direktori memungkinkan Anda untuk cdmelakukannya.
gardenhead
1
Sebuah skrip juga dapat dibuat untuk dieksekusi tanpa izin baca
phuclv
1
BTW, Tidak perlu untuk menyertakan header C di stdio.hsini. Saya sarankan menghapusnya.
Spikatrix
1
@Kevin: Mungkin karena tidak memiliki lsdan penyelesaian tab bekerja membuat pemeliharaan pekerjaan mengganggu, dan memberikan sedikit jika ada manfaat keamanan yang sebenarnya. Sebagian besar file yang penyerang mungkin tertarik berada di lokasi standar yang diketahui, atau lokasi mereka dapat ditemukan secara tidak langsung dari data dalam file lain (selain itu bagaimana program yang secara sah menggunakan file-file itu tahu di mana menemukannya?).
Ilmari Karonen
4

Di Gentoo, program yang dapat dieksekusi yang disetuid (disetel untuk dijalankan dengan izin pemiliknya alih-alih penyerbunya) ditolak akses baca (mode 4711). Ini untuk menambahkan lapisan perlindungan terhadap eksploitasi bug untuk membantu eskalasi hak istimewa.

Jika penyerang yang tidak memiliki hak pribadi dapat membaca file setuid, dan mengetahui bug yang memungkinkan serangan gaya kembali ke libc , mereka mungkin dapat menggunakan konten file untuk memprediksi di mana fungsi atau pustaka tertentu yang berguna kemungkinan akan ditempatkan di memori ketika program dipanggil.

Sistem modern sering menyertakan perlindungan tambahan yang lebih efektif, seperti ASLR , tetapi pembatasan yang ada dalam platform 32-bit mungkin membuat mereka lebih mudah dieksploitasi.

Tak seorangpun
sumber
Perhatikan bahwa perlindungan hanya berlaku untuk distro berbasis sumber. Dengan distro berbasis biner, penyerang bisa melihat salinan program mereka sendiri untuk mencari tahu di mana hal-hal menarik.
Markus
Biner yang hanya dapat dijalankan juga dapat memiliki kata sandi yang disematkan. Pengguna dapat menjalankan program, dan itu dapat mengirim kata sandi ke server, tetapi pengguna tidak akan bisa mendapatkan kata sandi dari itu (sistem juga tidak memungkinkan mereka untuk membuat dump inti).
Barmar
1

Sepertinya nilai "eksekusi saja" tidak memiliki banyak kegunaan untuk file, tetapi dapat digunakan untuk mencegah seseorang dari membaca isi direktori.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
popedotninja
sumber
1
Perlu disebutkan bahwa alasan ini berguna adalah karena Anda masih dapat membaca foo / bar jika Anda tahu nama filenya. Saya telah menggunakan ini di server web.
Random832
0

Anda harus membaca dan menjalankan izin untuk menjalankan skrip. Membaca isi skrip adalah apa yang memungkinkannya untuk dieksekusi, jadi Anda harus bisa read and execute. Kalau tidak, Anda tidak dapat menjalankan skrip tanpanya.

Apa kasus penggunaan yang valid untuk izin yang hanya menjalankan?

Keamanan. Beberapa mungkin ingin melindungi file mereka dan menghentikan orang lain dari mengeksekusi atau menggunakannya.

Jordan Savell
sumber
2
chmod 000Akan menganggap izin kepada siapa pun kecuali root. Terkadang Anda tidak perlu bertindak terlalu luas hanya untuk perlindungan - itu tergantung pada niat pengguna. Untuk itu, katakanlah "re-chmod" file kembali ke izin yang dapat dibaca dan ditulis Anda harus melakukan ini melalui root. Jika Anda tidak dapat mengakses root, maka itu akan terbukti sulit.
Jordan Savell
2
Katakanlah Anda memiliki seperangkat alat /toolsyang Anda inginkan agar orang dapat menggunakannya, tetapi hanya jika mereka mengetahuinya. chmod 711 /tools. Maka hal-hal yang dapat dieksekusi di /tools dapat dijalankan secara eksplisit, tetapi ls /tools/akan ditolak.
DopeGhoti
1
Jawaban yang bagus! Mengajari saya sesuatu di sana juga. Mengapa file biner tidak memerlukan izin baca untuk dijalankan?
Jordan Savell
2
Karena menampilkan isi file dan mengeksekusinya adalah dua hal yang berbeda. Skrip shell "dieksekusi" dengan "membacanya" ke dalam shell baru (jika Anda memaafkan penyederhanaan), itulah sebabnya Anda harus bisa membacanya. Biner tidak menggunakan mekanisme itu.
DopeGhoti
1
Ah akal sehat. Saya pikir itu sesuatu yang berbeda - terima kasih!
Jordan Savell