Apakah mungkin untuk menjalankan skrip jika tidak ada izin untuk membacanya? Dalam mode root, saya membuat skrip dan saya ingin pengguna lain mengeksekusi skrip ini tetapi tidak membacanya. Saya melakukan chmod
untuk melarang membaca dan menulis tetapi mengizinkan eksekusi, namun dalam mode pengguna, saya melihat pesan yang mengatakan: izin ditolak.
65
Jawaban:
Masalahnya adalah bahwa script tidak apa yang sedang berjalan, tetapi juru (
bash
,perl
,python
, dll). Dan penerjemah perlu membaca skrip. Ini berbeda dari program "biasa", sepertils
, dalam hal program dimuat langsung ke dalam kernel, seperti yang dilakukan oleh penerjemah. Karena kernel itu sendiri sedang membaca file program, tidak perlu khawatir tentang akses baca. Penerjemah perlu membaca file skrip, karena file normal perlu dibaca.sumber
Ini hanya mungkin untuk binari.
Sebagai pengguna yang tidak memiliki hak:
Sekarang, inilah kickernya. Meskipun file tidak dapat dibaca dengan cara konvensional, Anda sebenarnya tidak dapat mencegah membaca file. Ini sebenarnya sebuah tantangan di http://smashthestack.org/ (level 13). Ada utilitas terkenal yang disebut
hktrace
yang memungkinkan Anda membaca file menggunakanptrace
.sumber
Ini tidak mungkin, setidaknya di Linux (Unix lain mungkin mengizinkannya); Pikirkan tentang hal ini, ketika Anda menjalankan skrip, shell perlu membacanya untuk mengetahui apa yang harus dilakukan.
sumber
Anda bisa, saya pikir, melakukan ini dengan
setuid
.Kecuali Anda tidak bisa karena sebagian besar distro (tampaknya) telah
setuid
dinonaktifkan karena ini merupakan lubang keamanan besar. Ini dinonaktifkan pada saya, jadi saya tidak benar-benar tahu bahwa jawaban ini akan berhasil, saya tetap mempostingnya karena saya pikir itu harus .Lagi pula, jika saya ingin melakukan apa yang ingin Anda lakukan - dan saya memiliki distro yang
setuid
diaktifkan untuk skrip - saya akan melakukan sesuatu seperti:Artinya saya akan menulis skrip lain yang tujuan utamanya adalah memanggil skrip root-read-only, mengubahnya menjadi dimiliki oleh root, dan memberikannya setuid izin. (Bersamaan dengan status petugas yang tidak dapat ditulis oleh orang lain.)
Karena fungsi myscript-nonroot dapat dibaca oleh semua orang, itu dapat dibaca dan dieksekusi, dan saat Anda mendapatkan dua baris di mana Anda benar-benar mengeksekusi skrip Anda (
bash myscript
) itu dijalankan sebagai root (atau siapa pun yang Anda inginkan, pengguna yang tepat tidak masalah, selama file wrapper dimiliki oleh pengguna yang sama.)sumber
4
set yang setuid bit. Lihat bagian Mode di halaman manual chmod di manpagez .755
sedikit.chmod 755
sama dengan 0775 oktal. ada banyak kebingungan di sekitar itu .. Halaman ini ( manpagez.com/man/1/chmod ) memiliki gulir horizontal yang mengerikan dan tidak diawetkan yang tidak dapat saya mengerti ...Pada situasi ini saya menggunakan sudo dengan opsi NOPASSWD sehingga pengguna dapat menjalankan skrip tanpa bisa membacanya.
sumber
Ada setengah kebenaran dari pernyataan sebelumnya. Anda dapat mengatur skrip sehingga tidak dapat dibaca oleh pengguna, tetapi masih dapat dieksekusi. Prosesnya sedikit berlarut-larut, tetapi bisa dilakukan dengan membuat pengecualian di / etc / sudoer sehingga pengguna dapat menjalankan skrip sebagai diri Anda sementara waktu tanpa diminta kata sandi. Metode ini: - menyiasati patch setuid untuk distro lain. - memungkinkan Anda untuk memberikan izin tinggi untuk skrip tertentu tanpa memberikan hak sudo pengguna untuk semuanya.
Ikuti instruksi pada posting ini: Izin file hanya dijalankan
sumber
Ini bekerja pada OpenBSD
Seperti yang telah disebutkan dalam komentar oleh @eradman, ini dimungkinkan pada OpenBSD.
Sebagai root:
Sebagai pengguna biasa:
Itu bekerja dengan mengirimkan
/dev/fd/3
(atau apa pun fd terbuka ke skrip) ke penerjemah. Trik itu tidak akan berfungsi di Linux, di mana/dev/fd/N
bukan perangkat karakter khusus yang mengembalikan adup(2)
fd ketika dibuka, tetapi "sulap" symlinks ke file asli / gigi, yang membuka file dari awal [1]. Ini dapat diimplementasikan dalam Free / NetBSD atau Solaris ...Tapi itu bukan apa yang harus terjadi
Pada dasarnya memberikan
x
izin (mengeksekusi) berarti juga memberikanr
izin (baca) pada file apa pun yang memiliki shebang [2]:ktrace
bukan satu-satunya cara; jika interpreter terkait secara dinamis dapat dieksekusi sepertiperl
ataupython
,LD_PRELOAD
hack ed yang menimparead(2)
fungsi dapat digunakan sebagai gantinya.Dan tidak, menjadikannya setuid tidak akan mencegah pengguna biasa melihat kontennya; dia bisa menjalankannya di bawah
ptrace(2)
, yang akan menyebabkan bit setuid diabaikan:Sebagai root:
Sebagai pengguna biasa:
(maaf jika ini bukan cara yang paling sulit untuk menunjukkannya)
[1] ini dapat ditiru di Linux dengan menggunakan
binfmt_misc
, tetapi penerjemah harus dimodifikasi, atau pembungkus harus digunakan; lihat bagian terakhir dari jawaban ini untuk contoh yang sengaja dibuat tidak aman.[2] atau secara umum, file apa pun yang tidak akan menyebabkannya
execve()
kembaliENOEXEC
.sumber
Ya, jika Anda pengguna root, Anda dapat mengeksekusi file tanpa izin baca
Tetapi jika Anda masuk dengan pengguna lain, Anda tidak dapat menjalankan file ini
sumber
Untuk membuat skrip Anda tidak dapat dibaca namun dapat dieksekusi, Anda memiliki 3 opsi utama:
Pilihan pertama
Gunakan perintah openssl untuk mengenkripsi secara manual. Dan di masa mendatang, ketika Anda ingin menjalankan skrip, Anda harus menjalankan openssl secara manual lagi, dan memberikan kata sandi untuk didekripsi.
Enkripsi dengan openssl:
cat yourscript.sh | openssl aes-128-cbc -a -salt -k yourpassword> yourscript.enc
Dekripsi dengan openssl:
cat yourscript.enc | openssl aes-128-cbc -a -d -salt -k yourpassword> yourscript.dec
herscript.dec akan sama dengan script asli milikmu Script Anda
Opsi kedua
Gunakan situs seperti www.Enscryption.com untuk mengenkripsi skrip Anda secara otomatis dan membuat versi terenkripsi dari skrip tersebut dapat dieksekusi. Situs ini menggunakan kemampuan enkripsi openssl dan beberapa metode kebingungan lainnya untuk menyulitkan penyusup untuk membuka skrip Anda atau mengungkap rahasia yang ingin Anda sembunyikan. Dengan situs ini, Anda dapat mengenkripsi skrip shell dan perl baris perintah, skrip python, ruby. Saya pikir php juga.
Opsi ketiga
Gunakan alat seperti shc . Sepertinya belum diperbarui sejak 2012. tapi saya telah menggunakannya di masa lalu. Anda harus mengkompilasi skrip untuk setiap OS tempat Anda ingin menggunakannya, jika OS berbeda dari yang Anda gunakan untuk mengompilasinya.
Ringkasan:
Jika menyembunyikan kode Anda sangat penting bagi Anda, hanya mengandalkan izin dan kepemilikan akan membantu Anda, karena siapa pun dengan root dapat melakukannya. Itu hanya fakta. Apa yang dapat Anda lakukan, jika Anda benar-benar ingin mencegah melihat kode Anda oleh orang lain adalah menulis skrip di sekitar perintah openssl. Buat agar, sebelum skrip berjalan, itu akan meminta kata sandi DAN setelah kata sandi diberikan, itu akan menjalankan skrip tanpa menulisnya ke file temp. Jika ini kedengarannya terlalu banyak bekerja maka opsi 2 dan 3 harus cukup untuk tujuan Anda.
sumber