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 ./pingaby 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 --printpokazuje, ż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 pingz błędami ping: icmp open socket: Operation not permitted, dzieje się tak, gdy nie ma takiej możliwości. Także --printprogramy 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+eiptego 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-capspowinno 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 ei pmoż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ć capshmoż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:
capshzlibcap2-binwersji pakietu1:2.22-1.2- przed Edit-3 złapałem ostatni
capshodgit://git.debian.org/collab-maint/libcap2.giti zaczął go używać. uname -aLinux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/LinuxObszar użytkownika jest 32-bitowy.
capsh, przy braku otoczenia (jak pierwotnie było). Czego mi brakuje. To musi mieć zastosowanie.
capshz repozytorium collab-maint nie dałoby ci „najnowszego”capshpakietu Debian nadal nie obsługuje możliwości otoczenia. Tak działa Upstream 2.27.