Anda bisa menjalankan program yang salah. Seseorang dapat membuat Anda menjalankan program mereka.
The -execdir
tindakan menjalankan perintah Anda dari direktori yang berisi file (s) ditemukan. Ketika $PATH
berisi jalur relatif, seperti .
atau apa pun yang tidak dimulai/
, -execdir
tidak aman karena direktori tempat file ditemukan (atau direktori lain yang diselesaikan relatif terhadapnya) juga bisa berisi executable dengan nama yang sama dengan yang Anda coba untuk berlari. Eksekusi yang berpotensi tidak dipercaya itu kemudian akan dijalankan.
Ini dapat dengan sengaja dieksploitasi oleh pengguna lain untuk menyebabkan Anda menjalankan program mereka, yang dapat menyebabkan kerusakan atau melanggar keamanan data, alih-alih program yang Anda coba jalankan. Atau, yang lebih jarang, itu hanya dapat mengakibatkan program yang salah dijalankan secara tidak sengaja, bahkan tanpa ada yang berusaha membuat masalah terjadi.
Jika segala sesuatu di Anda PATH
variabel lingkungan adalah path absolut, kesalahan ini seharusnya tidak terjadi, bahkan jika direktori yang Anda cari dan -execdir
ing dari yang terkandung dalam PATH
. (Saya telah memeriksa apakah ini berfungsi.) Jika Anda yakin Anda tidak memiliki direktori relatif $PATH
tetapi masih mendapatkan kesalahan ini, harap perbarui pertanyaan Anda dengan perincian termasuk output dari echo "$PATH"
.
Contoh nyata.
Sebagai contoh apa yang bisa salah, anggap:
- Alice memiliki
.
di dalam dirinya $PATH
karena dia ingin dapat menjalankan program di direktori apa pun dia cd
akan, tanpa repot-repot untuk mengawali nama mereka dengan ./
.
- Hawa frenemy Alice telah berbagi
/home/eve/shared
dengan Alice.
- Alice ingin statistik (baris, kata, byte) pada
.c
file yang telah dibagikan Eve dengannya.
Jadi Alice menjalankan:
find ~eve/shared -name \*.c -execdir wc {} \;
Sayangnya untuk Alice, Eve telah membuat skripnya sendiri, menamainya wc
, mengaturnya executable ( chmod +x
), dan menempatkannya secara sembunyi-sembunyi di salah satu direktori di bawah /home/eve/shared
. Script Eve terlihat seperti ini:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Jadi ketika Alice menggunakan find
dengan -execdir
untuk menjalankan wc
pada file yang Hawa telah bagikan, dan itu akan ke file dalam direktori yang sama dengan wc
skrip kustom Hawa, Hawa wc
berjalan - dengan semua hak istimewa Alice!
(Menjadi licik, Hawa telah membuat wc
skripnya bertindak sebagai pembungkus untuk sistem wc
, sehingga Alice bahkan tidak akan tahu ada yang tidak beres, yaitu yang do_evil
dijalankan. Namun, variasi yang lebih sederhana - dan juga lebih canggih - dimungkinkan. )
Bagaimana find
mencegahnya?
find
mencegah masalah keamanan ini terjadi dengan menolak untuk mengambil -execdir
tindakan ketika $PATH
berisi direktori relatif.
find
menawarkan dua pesan diagnostik tergantung pada situasi spesifik.
Jika .
ada di $PATH
, maka (seperti yang Anda lihat) dikatakan:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
Mungkin memiliki pesan khusus untuk .
kasus ini karena sangat umum.
Jika path relatif selain .
--say, foo
--appears di $PATH
dan Anda menjalankan find
dengan -execdir
, ia mengatakan:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
Lebih baik tidak memiliki jalur relatif $PATH
sama sekali.
Risiko memiliki .
atau jalur relatif lain $PATH
secara khusus meningkat ketika menggunakan utilitas yang secara otomatis mengubah direktori, yang mengapa find
tidak akan membiarkan Anda menggunakan -execdir
dalam situasi ini.
Tetapi memiliki jalur relatif, khususnya .
, dalam diri Anda $PATH
secara inheren berisiko dan sebaiknya dihindari. Perhatikan situasi fiksi dalam contoh di atas. Misalkan bukannya berjalan find
, Alice hanya cd
s untuk ~eve/shared/blah
dan berjalan wc *.c
. Jika blah
mengandung wc
skrip Eve , do_evil
jalankan sebagai Alice.
Ada banyak informasi terperinci di sini . Referensi hebat lainnya ada di sini . Mengutip dari referensi pertama:
Dari referensi kedua:
sumber
Masalah utama adalah dengan nilai variabel sistem
PATH
yang berisi folder relatif di dalamnya, jadi untuk alasan keamananfind
perintah tidak akan memungkinkan Anda untuk mengeksekusi binari, karena berpotensi ia dapat menjalankan program yang salah.Jadi misalnya, jika Anda memiliki dir Anda saat ini di PATH Anda sesuai peringatan yang Anda dapatkan:
dan Anda akan menjalankan perintah Anda:
jika Anda memiliki skrip lokal (
rm
dengan flag yang dapat dieksekusi) yang berisirm -fr /
di dalamnya, ia dapat menghapus semua file Anda, karena alih-alih mengeksekusi yang diharapkan/bin/rm
, Anda akan mengeksekusirm
dari direktori saat ini, jadi mungkin itu bukan yang Anda inginkan.Sebagai catatan, ini adalah masalah yang diketahui di Travis CI ( GH # 2811 ) ketika gagal dengan kesalahan:
Jadi solusinya adalah menghapus entri yang terpengaruh dari variabel PATH, misalnya
seperti yang diusulkan oleh drogus . Kemajuan bug ini, bisa diikuti di GH # 4862 .
Ini adalah solusi untuk versi Bash:
Contoh penggunaan (meneruskan filter
PATH
ke perintah tertentu):sumber
sed
yang tampaknya menghapus semua hal yangfind
tidak disukainya: askubuntu.com/questions/621132/…xargs
danbash -c cd
solusinyaOke, saya menyerah:
sed
solusiSedikit kurang baik dari solusi sebelumnya:
Sebuah testcase:
Untuk
rename
secara spesifik, Anda juga dapat bekerja dengan beberapa regex-fu Perl: /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971RTFS berharap hancur
Bagi mereka yang memiliki harapan bahwa ada cara untuk mengabaikan pendapat
find
, biarkan saya hancurkan dengan beberapa sumber:Dari itu kita melihat bahwa tampaknya tidak ada cara untuk mematikan pemeriksaan jalan.
Aturan persis yang diperiksa adalah: gagal jika
PATH
kosong atau tidak dimulai/
.sumber