Apa masalah keamanan dan kondisi lomba dalam menggunakan `find -exec`?

14

Dari findhalaman manual :

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

Apa artinya ini? Mengapa ada kondisi balapan dengan menjalankannya dari direktori awal? Dan bagaimana risiko keamanan ini?

Danny Tuppeny
sumber
Terkait: Mengapa mengulangi hasil praktik buruk? di mana itu tercakup dalam beberapa jawaban.
Stéphane Chazelas

Jawaban:

13

Temukan detailnya di sini :

The -execaksi menyebabkan program lain untuk dijalankan. Ini meneruskan ke program nama file yang sedang dipertimbangkan pada saat itu. Program yang dipanggil biasanya akan melakukan beberapa tindakan pada file itu. Sekali lagi, ada kondisi ras yang bisa dieksploitasi di sini. Kami akan mengambil sebagai contoh spesifik perintah

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

Dalam contoh sederhana ini, kami mengidentifikasi hanya satu file yang akan dihapus dan meminta /bin/rmuntuk menghapusnya. Ada masalah karena ada kesenjangan waktu antara titik di mana menemukan memutuskan bahwa ia perlu memproses -exectindakan dan titik di mana /bin/rmperintah sebenarnya mengeluarkan pemutusan sistem () untuk menghapus file dari sistem file. Dalam periode waktu ini, seorang penyerang dapat mengganti nama /tmp/umsp direktori, menggantinya dengan tautan simbolis /etc. Tidak ada cara untuk /bin/rmmenentukan bahwa ia bekerja pada file yang sama yang ada dalam pikiran. Setelah tautan simbolis berada di tempat, penyerang telah membujuk menemukan untuk menyebabkan penghapusan /etc/passwdfile, yang bukan efek yang dimaksudkan oleh perintah yang sebenarnya dipanggil.

Tidak yakin seberapa besar kemungkinan seseorang dapat mengeksploitasi ini; tapi saya kira ada jawabannya!

Danny Tuppeny
sumber
Dalam kasus di atas, execdirpertama chdir /tmp/umspsebelum menjalankan perintah, dan secara teoritis, penyerang yang menautkan kembali direktori tidak akan berpengaruh .. jika penautan ulang terjadi setelah menemukan "memutuskan" untuk mengevaluasi -exectetapi sebelum rmperintah dapat melakukan tugasnya. Tapi saya bertanya-tanya mengapa ini akan membuat perbedaan: penyerang hanya dapat melakukan relink setelah pengguna memutuskan untuk menulis findperintah.
Otheus
1
@RuiFRibeiro Tautan ini bukan argumen yang diteruskan ke perintah, ini adalah direktori perantara. /tmp/umspadalah direktori ketika findmelihatnya, tetapi ketika rmdijalankan, yang diserang telah mengubahnya menjadi tautan simbolis ke /etc. /tmp/umsp/passwdadalah file biasa selama ini, tapi tidak sama.
Gilles 'SO- stop being evil'
2

Saya percaya bahwa alasan mengapa -execberbahaya adalah karena jika pengguna tidak menentukan nama lengkap dan jalur ke program yang akan dieksekusi, itu berpotensi mengeksekusi program yang salah.

Contoh:

find /some/path -exec coolprogram

Di /some/path, seseorang membuat yang lain coolprogram, dan mengunggah semua data Anda ke aktor yang buruk.

Tapi tunggu, katamu, bukankah kamu harus melakukannya ./coolprogram? Ya, tetapi beberapa orang memilikinya PATH=.:/bin:whatever, yang akan menjalankan program di direktori saat ini.

Ini mungkin disederhanakan, tetapi saya pikir itu bisa berbahaya dalam beberapa kasus. Saya harus memecahkan masalah sekali ketika nol-byte cpioberakhir di direktori yang salah. Itu menyebabkan program crash karena cpiotidak berfungsi karena menjalankan file nol-byte di direktori.

Doug
sumber
3
Risiko-risiko ini tidak diisolasi find -exec. Jika Anda sudah menempatkan .path Anda, maka mengeksekusi coolprogramdi dir Anda saat ini sudah berbahaya, apakah Anda menggunakannya findatau tidak!
Danny Tuppeny
1
Setuju, tetapi tampaknya -execdir mengawasi kondisi yang saya sebutkan juga:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug
Saya kira moral dari cerita ini adalah memiliki itu. di jalan Anda adalah ide yang buruk juga, itulah sebabnya saya memastikan itu tidak ada di sana.
Doug
Menarik untuk mengetahui tentang pelarangan .di jalur dan {}di perintah. Mungkin di masa depan Linux hanya akan melarang .sepenuhnya path dan alat tidak perlu menerapkan pemeriksaan keamanan mereka sendiri! :)
Danny Tuppeny
1
Saya pikir 90% dari kode yang saya tulis hanya untuk menangkap 5% dari hal-hal yang salah. :)
Doug