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 ./ping
untuk 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 --print
bit-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 ping
kesalahan dengan ping: icmp open socket: Operation not permitted
, inilah yang terjadi ketika tidak memiliki kemampuan. Juga --print
pertunjukkan 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+eip
ini 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-caps
harus 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 p
kemampuan 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 paketlibcap2-bin
versi1:2.22-1.2
- sebelum edit-3 saya mengambil yang terbaru
capsh
darigit://git.debian.org/collab-maint/libcap2.git
dan 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.
sumber
capsh
dari repo collab-Maint tidak akan memberi Anda "terbaru"capsh
, paket Debian masih tidak mendukung kemampuan ambient. Hulu 2.27 tidak.capsh
, dengan tidak adanya ambient (seperti aslinya). Apa yang saya lewatkan. Itu harus digunakan.Jawaban:
Kemampuan adalah sifat dari proses. Secara tradisional ada tiga set:
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 ping
Anda 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:
--keep=1
opsicapsh
untuk menghindari mengosongkan set.The
capsh
program dari libcap 2,25 tidak memiliki kemampuan untuk mengubah kemampuan ambient, tapi kemudian rilis menambahkan opsi baru. Perhatikan bahwa urutan opsi signifikan. Contoh penggunaan:Tip: Anda dapat menambahkan
--print
opsi di mana saja dicapsh
baris perintah dan melihat status kemampuan saat ini.Catatan:
cap_setpcap
diperlukan untuk--addamb
sementaracap_setuid,cap_setgid
dibutuhkan untuk--user
opsi.sumber
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):setuid
: Menurutman capabilities
:Dengan kata lain, dalam
capsh
perintah kami di atas, kami perlu memastikan bahwa SECBIT_KEEP_CAPS diatur selamasetuid
panggilan sistem. Kalau tidak, semua kemampuan akan hilang. Inilah yang--keep=1
dilakukannya. Jadi sekarang perintahnya menjadisudo capsh --user=<some_user> --keep=1 --
execve
: Jika kita menggunakan--keep=1
pilihan, semua set kemampuan (efektif, diizinkan, diwariskan) yang diawetkan sampai yangexecve
system call, namunexecve
menyebabkan 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 setelahexecve
panggilan, baik: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.setcap cap_net_raw+i
akan melakukan trik tetapi ternyata hal ituexecve
menyebabkan izin yang dapat diwarisi dari sebuah thread dibatalkan ketika dipanggil oleh pengguna yang tidak memiliki hak pribadi (yang saat ini kami berterima kasihsetuid
). 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
setuid
pengguna yang tidak mampu diikuti olehexecve
, tanpa harus bergantung pada kemampuan file.sumber
Mungkin ada bug / fitur di kernel. Ada beberapa diskusi:
Saya tidak tahu, jika ada yang dilakukan, untuk memperbaikinya.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.
sumber