Menurut man 7 capabilities
CAP_DAC_READ_SEARCH
* Bypass file read permission checks and directory read and execute permission checks;
* Invoke open_by_handle_at(2).
Ini bekerja untuk saya. (baris yang dimulai dengan '#' adalah root, '$' adalah non-root) dalam hal ini pengguna non-root ada di wheel
grup.
# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root
find: ‘/root’: Permission denied
$ sudofind /root
/root /root
/root/Testbed
...
...
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec 4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =
Mengingat apa yang diberikan kemampuan, itu cocok dengan apa yang Anda inginkan. Saya belum memeriksa secara mendalam apakah find
memiliki fitur yang memungkinkan Anda membaca byte di dalam file, tetapi hal-hal yang jelas seperti LD_PRELOAD
dan serangan perpustakaan shim seharusnya tidak berfungsi karena sifat pemeriksaan setuid di Linux, dan bit kemampuan juga tidak diwarisi oleh proses anak (tidak seperti setuid mentah) jadi itu bonus lainnya.
Ingatlah bahwa apa yang ingin Anda lakukan memang meningkatkan kemungkinan masalah privasi sehubungan dengan pembuatan atau akses file sementara, dan program dapat digunakan sebagai dasar untuk memasang upaya eskalasi kondisi balapan / hak istimewa (terhadap program yang membuat nama file terkenal tapi jangan lakukan pemeriksaan keamanan yang benar).
Selain itu, beberapa aplikasi yang ditulis dengan buruk mungkin mengandalkan metadata file atau struktur pohon sebagai cara untuk menyampaikan makna atau menyembunyikan data. Hal ini dapat menyebabkan pelepasan informasi yang dibatasi atau mengungkapkan dokumen istimewa yang tidak diketahui sebelumnya (keamanan melalui ketidakjelasan yang saya tahu, tetapi ini adalah hal yang sangat disukai vendor sumber tertutup, sayangnya).
Oleh karena itu, berhati-hatilah dan berhati-hatilah saat melakukannya dan pahami bahwa masih ada risiko yang terkait dengan hal ini meskipun hal yang sudah jelas tidak berhasil.
Oh, dan saya tertarik untuk melihat apakah seseorang memiliki bukti serangan konsep yang menggunakan mekanisme ini sebagai dasar untuk eskalasi hak istimewa dalam komentar!
Bagaimana dengan menemukan?
loc membaca satu atau lebih database yang disiapkan oleh updatedb(8) dan menulis nama file yang cocok dengan setidaknya satu POLA ke output standar, satu per baris. Jika --regex tidak ditentukan, POLA dapat berisi karakter globbing. Jika ada PATTERN yang tidak berisi karakter globbing, lokasi berperilaku seolah-olah polanya adalah PATTERN .
Secara default, cari tidak memeriksa apakah file yang ditemukan di database masih ada. loc tidak pernah dapat melaporkan file yang dibuat setelah pembaruan terbaru dari database yang relevan.
Atau bahkan mungkin slocate:
Secure Locate menyediakan cara yang aman untuk mengindeks dan mencari file dengan cepat di sistem Anda. Ini menggunakan pengkodean inkremental seperti lokasi GNU untuk mengompres basis datanya agar pencarian lebih cepat, tetapi juga akan menyimpan izin dan kepemilikan file sehingga pengguna tidak akan melihat file yang tidak dapat mereka akses.
Halaman manual ini mendokumentasikan slocate versi GNU. slocateMemungkinkan pengguna sistem untuk mencari seluruh sistem file tanpa menampilkan file yang tidak sah.
Saya akan memberikan izin yang tepat kepada pengguna.
Secara default, jika umask adalah 022
, direktori dibuat agar setiap orang dapat membuat daftar dan stat file di dalamnya. Jika tidak, Anda dapat secara manual mengubah izin direktori menjadi bitwise atau izin lama dan 0555
:
chmod +0555 foo
Dan jika pengguna tersebut tidak memiliki izin eksekusi pada semua induk direktori tersebut (misalnya, direktori beranda pengguna lain), mungkin Anda harus meletakkan direktori pertama di tempat lain.
Jika Anda hanya ingin mengizinkan beberapa pengguna untuk membaca dan mengeksekusi direktori tersebut, Anda dapat mengubah modenya menjadi 0750
, masukkan pengguna tersebut ke dalam grup, dan ubah pemilik grup direktori menjadi grup tersebut:
groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo