Saya bereksperimen dengan kemampuan, di Debian Gnu / Linux.
Saya telah menyalin / bin / ping ke direktori kerja saya saat ini. Seperti yang diharapkan itu tidak berhasil, ini awalnya setuid root.
Saya kemudian memberikan ping saya kemampuan minimal (bukan root) dengan melakukan sudo /sbin/setcap cap_net_raw=ep ./ping, dan ping saya berfungsi, seperti yang diharapkan.
Kemudian sudo /sbin/setcap -r ./pinguntuk mencabut kemampuan itu. Sekarang tidak berfungsi seperti yang diharapkan.
Saya sekarang mencoba membuat ping berfungsi menggunakan capsh.
capsh tidak memiliki hak istimewa, jadi saya perlu menjalankannya sebagai root, tetapi kemudian drop root dan dengan demikian semua hak istimewa lainnya.
Saya pikir saya juga perlu secure-keep-caps, ini tidak didokumentasikan capsh, tetapi dalam manual kemampuan. Saya mendapat nomor bit dari /usr/include/linux/securebits.h. Mereka tampak benar, karena output dari --printbit-bit ini benar.
Saya telah bermain-main selama berjam-jam, sejauh ini saya punya ini.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Namun pingkesalahan dengan ping: icmp open socket: Operation not permitted, inilah yang terjadi ketika tidak memiliki kemampuan. Juga --printpertunjukkan Current: =p cap_net_raw+i, ini tidak cukup yang kita butuhkan e.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"akan mengatur kemampuan untuk Current: = cap_net_raw+eipini benar, tetapi membiarkan kita root.
Edit-1
Saya sekarang sudah mencoba sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Ini menghasilkan:
touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted
Kesalahan pertama diharapkan sebagai secure-noroot: yes
Tapi yang kedua tidakCurrent: = cap_net_raw+eip
Edit-2
Jika saya meletakkan ==sebelum --print, itu sekarang menunjukkan Current: = cap_net_raw+i, sehingga menjelaskan kesalahan sebelumnya, tetapi tidak mengapa kita kehilangan kemampuan ketika beralih dari root, saya pikir itu secure-keep-capsharus memperbaikinya.
Edit-3
Dari apa yang saya lihat, saya kehilangan Efektif (e), dan Diizinkan (p), ketika exec dipanggil. Ini diharapkan, tetapi saya berpikir bahwa tutup pengaman harus dihentikan agar tidak hilang. Apakah saya melewatkan sesuatu.
Edit-4
Saya telah melakukan lebih banyak penelitian, dan membaca manual lagi. Sepertinya itu normale dan pkemampuan hilang ketika: Anda beralih dari pengguna root(atau menerapkan secure-noroot, sehingga menjadikan root sebagai pengguna normal), ini dapat diganti dengan secure-keep-caps; ketika Anda menelepon exec, sejauh yang saya tahu ini adalah invarian.
Sejauh yang saya tahu, itu bekerja sesuai dengan manual. Sejauh yang saya tahu tidak ada cara untuk melakukan sesuatu yang bermanfaat capsh. Sejauh yang saya tahu, untuk menggunakan kapabilitas yang Anda butuhkan: menggunakan kapabilitas file atau memiliki program yang sadar kapabilitas, yang tidak digunakan exec. Karenanya tidak ada pembungkus istimewa.
Jadi sekarang pertanyaan saya adalah apa yang saya lewatkan, untuk apa capsh.
Edit-5
Saya telah menambahkan jawaban tentang kemampuan sekitar. Mungkincapsh juga dapat digunakan dengan kemampuan yang diwarisi, tetapi untuk menjadi berguna ini perlu diatur pada file yang dapat dieksekusi. Saya tidak dapat melihat bagaimana capsh dapat melakukan apa pun yang berguna tanpa kemampuan sekitar, atau untuk memungkinkan kemampuan bawaan.
Versi:
capshdari paketlibcap2-binversi1:2.22-1.2- sebelum edit-3 saya mengambil yang terbaru
capshdarigit://git.debian.org/collab-maint/libcap2.gitdan mulai menggunakannya. uname -aLinux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/LinuxUser-land adalah 32bit.
capsh, dengan tidak adanya ambient (seperti aslinya). Apa yang saya lewatkan. Itu harus digunakan.
capshdari repo collab-Maint tidak akan memberi Anda "terbaru"capsh, paket Debian masih tidak mendukung kemampuan ambient. Hulu 2.27 tidak.