Bagaimana cara menggunakan capsh: Saya mencoba menjalankan ping yang tidak terjangkau, dengan kemampuan minimal


13

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:

  • capsh dari paket libcap2-bin versi1:2.22-1.2
  • sebelum edit-3 saya mengambil yang terbaru capshdari git://git.debian.org/collab-maint/libcap2.gitdan mulai menggunakannya.
  • uname -a Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux User-land adalah 32bit.

1
Apakah Anda mencoba contoh Lekensteyn dengan rilis upstream nanti ? Mendapatkan capshdari repo collab-Maint tidak akan memberi Anda "terbaru" capsh, paket Debian masih tidak mendukung kemampuan ambient. Hulu 2.27 tidak.
Stephen Kitt

1
@StephenKitt baik untuk diketahui, tetapi pertanyaan aslinya adalah apa gunanya capsh, dengan tidak adanya ambient (seperti aslinya). Apa yang saya lewatkan. Itu harus digunakan.
ctrl-alt-delor

Jawaban:


11

Kemampuan adalah sifat dari proses. Secara tradisional ada tiga set:

  • Kemampuan yang diizinkan ( p ): kemampuan yang dapat "diaktifkan" dalam proses saat ini.
  • Kemampuan efektif ( e ): kemampuan yang saat ini dapat digunakan dalam proses saat ini.
  • Kemampuan yang dapat diwarisi ( i ): kemampuan file yang mungkin diwariskan.

Program berjalan sebagai root selalu memiliki kapabilitas penuh yang diizinkan dan efektif, sehingga "menambahkan" lebih banyak kemampuan tidak memiliki efek yang nyata. (Set kemampuan bawaan biasanya kosong.) Dengan setcap cap_net_raw+ep pingAnda mengaktifkan kemampuan ini secara default untuk setiap pengguna yang menjalankan program ini.

Sayangnya kemampuan ini terikat pada file yang dieksekusi dan tidak dipertahankan setelah menjalankan proses anak baru. Linux 4.3 memperkenalkan kemampuan Ambient yang memungkinkan kemampuan untuk diwarisi oleh proses anak. (Lihat juga Transformasi kemampuan selama execve () dalam kemampuan (7) .)

Saat bermain dengan kemampuan, perhatikan perangkap ini:

  • Ketika mengubah pengguna dari akar ke non-root, efektif dan kemampuan diizinkan dihapus (lihat Pengaruh perubahan ID pengguna pada kemampuan dalam kemampuan (7) ). Anda dapat menggunakan --keep=1opsi capshuntuk menghindari mengosongkan set.
  • Set kemampuan sekitar dihapus ketika mengubah ID pengguna atau grup. Solusi: tambahkan kemampuan sekitar setelah mengubah ID pengguna, tetapi sebelum menjalankan proses anak.
  • Suatu kapabilitas hanya dapat ditambahkan ke kapabilitas ambient yang ditetapkan jika kapabilitas tersebut sudah ada dalam kapabilitas yang diizinkan dan yang dapat diwariskan.

The capshprogram dari libcap 2,25 tidak memiliki kemampuan untuk mengubah kemampuan ambient, tapi kemudian rilis menambahkan opsi baru. Perhatikan bahwa urutan opsi signifikan. Contoh penggunaan:

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

Tip: Anda dapat menambahkan --printopsi di mana saja di capshbaris perintah dan melihat status kemampuan saat ini.

Catatan: cap_setpcapdiperlukan untuk --addambsementara cap_setuid,cap_setgiddibutuhkan untuk --useropsi.


6

Jawaban Lekensteyn tampaknya akurat dan lengkap, tetapi saya akan mencoba memberikan penjelasan lain dari sudut yang berbeda yang akan mencoba untuk menekankan masalah yang diselesaikan oleh kemampuan ambien.

Saat Anda menjalankan sudo capsh --user=<some_user> --Ada 2 panggilan sistem yang menarik yang menyebabkan kemampuan dapat dihitung ulang (dan berpotensi turun):

  1. setuid: Menurut man capabilities:

SECBIT_KEEP_CAPS Mengatur bendera ini memungkinkan utas yang memiliki satu atau lebih 0 UID untuk mempertahankan kemampuannya ketika ia mengalihkan semua UIDnya ke nilai yang bukan nol. Jika flag ini tidak disetel, maka UIDswitch tersebut menyebabkan utas kehilangan semua kemampuan.

Dengan kata lain, dalam capshperintah kami di atas, kami perlu memastikan bahwa SECBIT_KEEP_CAPS diatur selama setuidpanggilan sistem. Kalau tidak, semua kemampuan akan hilang. Inilah yang --keep=1dilakukannya. Jadi sekarang perintahnya menjadisudo capsh --user=<some_user> --keep=1 --

  1. execve: Jika kita menggunakan --keep=1pilihan, semua set kemampuan (efektif, diizinkan, diwariskan) yang diawetkan sampai yang execvesystem call, namun execvemenyebabkan kemampuan untuk dihitung ulang (untuk pengguna non-root) juga, dan dengan cara yang tidak begitu jelas. Singkatnya, sebelum penambahan set kapabilitas ambient , untuk kapabilitas berada di set "diizinkan" utas setelah execvepanggilan, baik:

    • File harus memiliki kemampuan itu dalam set "diizinkan" . Ini bisa dilakukan dengan setcap cap_net_raw+p /bin/bash. Melakukan hal ini menjadikan seluruh latihan tidak berguna karena set kemampuan thread (selain set bounding) tidak lagi memiliki efek.
    • Baik file dan utas harus memiliki kemampuan itu dalam set "yang dapat diwariskan" . Anda mungkin berpikir itu setcap cap_net_raw+iakan melakukan trik tetapi ternyata hal itu execvemenyebabkan izin yang dapat diwarisi dari sebuah thread dibatalkan ketika dipanggil oleh pengguna yang tidak memiliki hak pribadi (yang saat ini kami berterima kasih setuid). Jadi tidak ada cara untuk memenuhi kondisi ini sebagai pengguna yang tidak memiliki hak.

Kemampuan ambient yang diperkenalkan di Linux 4.3 memungkinkan thread untuk mempertahankan kapabilitasnya bahkan setelah setuidpengguna yang tidak mampu diikuti oleh execve, tanpa harus bergantung pada kemampuan file.


2

Mungkin ada bug / fitur di kernel. Ada beberapa diskusi:

Saya tidak tahu, jika ada yang dilakukan, untuk memperbaikinya.

Jangan salah paham - perilaku saat ini aman. Tapi itu sangat aman sehingga menghalangi hal-hal yang seharusnya bekerja.

Sunting: Menurut http://man7.org/linux/man-pages/man7/capabilities.7.html ada set kemampuan baru Ambient (sejak Linux 4.3). Sepertinya ini akan memungkinkan apa yang dibutuhkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.