Eksperymentuję z możliwościami na Debian Gnu / Linux.
Skopiowałem / bin / ping do mojego bieżącego katalogu roboczego. Zgodnie z oczekiwaniami nie działa, pierwotnie był to setuid root.
Następnie daję swojemu pingowi minimalne możliwości (nie rootowanie) sudo /sbin/setcap cap_net_raw=ep ./ping
, a mój ping działa zgodnie z oczekiwaniami.
Następnie, sudo /sbin/setcap -r ./ping
aby odwołać tę funkcję. Teraz nie działa zgodnie z oczekiwaniami.
Teraz próbuję uruchomić ping przy użyciu capsh
.
capsh
nie ma żadnych uprawnień, więc muszę uruchomić go jako root, ale potem upuścić roota, a tym samym wszystkie inne uprawnienia.
Myślę, że też potrzebuję secure-keep-caps
, nie jest to udokumentowane capsh
, ale znajduje się w podręczniku zdolności. Mam numery bitów od /usr/include/linux/securebits.h
. Wydają się poprawne, ponieważ wynik --print
pokazuje, że te bity są poprawne.
Bawiłem się godzinami, jak dotąd mam to.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Jednak ping
z błędami ping: icmp open socket: Operation not permitted
, dzieje się tak, gdy nie ma takiej możliwości. Także --print
programy Current: =p cap_net_raw+i
, to nam nie wystarczy e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
ustawi zdolność do Current: = cap_net_raw+eip
tego jest poprawna, ale pozostawia nas jako root
.
Edycja-1
Próbowałem teraz sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Daje to:
touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted
Pierwszy błąd jest oczekiwany, secure-noroot: yes
ale drugi nie jestCurrent: = cap_net_raw+eip
Edycja-2
Jeśli postawię ==
przed --print
, pokazuje to teraz Current: = cap_net_raw+i
, więc to wyjaśnia poprzedni błąd, ale nie dlatego, że tracimy możliwości przy wyłączaniu roota, pomyślałem, że to secure-keep-caps
powinno to naprawić.
Edycja-3
Z tego, co widzę, tracę Efektywny (e) i Dozwolony (p), gdy wywoływane jest exec. Jest to oczekiwane, ale pomyślałem, że czapki z daszkiem powinny zatrzymać ich zagubienie. Czy coś mi umknęło?
Edycja-4
Przeprowadziłem więcej badań i ponownie przeczytałem instrukcję. Wydaje się, że normalnie e
i p
możliwości są tracone, gdy: przełączysz się z użytkownika root
(lub zastosujesz secure-noroot
, dzięki czemu root stanie się normalnym użytkownikiem), można to zmienić secure-keep-caps
; kiedy dzwonisz exec
, o ile wiem, to niezmiennik.
O ile wiem, działa zgodnie z instrukcją. O ile wiem, nie ma sposobu, aby zrobić coś pożytecznego capsh
. O ile mi wiadomo, aby korzystać z możliwości, musisz: korzystać z możliwości plików lub mieć program obsługujący możliwości, który nie korzysta exec
. Dlatego nie ma uprzywilejowanego opakowania.
Więc teraz moje pytanie brzmi: po co mi tęsknię, po co capsh
.
Edycja-5
Dodałem odpowiedź dotyczącą możliwości otoczenia. Być capsh
może można go również używać z odziedziczonymi funkcjami, ale aby były użyteczne, trzeba je ustawić w pliku wykonywalnym. Nie widzę, w jaki sposób capsh może zrobić coś użytecznego bez funkcji otoczenia lub pozwolić na odziedziczone funkcje.
Wersje:
capsh
zlibcap2-bin
wersji pakietu1:2.22-1.2
- przed Edit-3 złapałem ostatni
capsh
odgit://git.debian.org/collab-maint/libcap2.git
i zaczął go używać. uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
Obszar użytkownika jest 32-bitowy.
capsh
, przy braku otoczenia (jak pierwotnie było). Czego mi brakuje. To musi mieć zastosowanie.
capsh
z repozytorium collab-maint nie dałoby ci „najnowszego”capsh
pakietu Debian nadal nie obsługuje możliwości otoczenia. Tak działa Upstream 2.27.