Sto sperimentando le capacità su Debian Gnu / Linux.
Ho copiato / bin / ping nella mia directory di lavoro corrente. Come previsto, non funziona, originariamente era root setuid.
Dò quindi al mio ping le capacità minime (non root) facendo sudo /sbin/setcap cap_net_raw=ep ./ping
, e il mio ping funziona, come previsto.
Quindi sudo /sbin/setcap -r ./ping
revocare tale capacità. Ora non funziona come previsto.
Ora provo a far funzionare il ping usando capsh
.
capsh
non ha privilegi, quindi devo eseguirlo come root, ma poi rilasciare root e quindi tutti gli altri privilegi.
Penso di aver bisogno anche di secure-keep-caps
questo, non è documentato capsh
, ma è nel manuale delle funzionalità. Ho ricevuto i numeri di bit da /usr/include/linux/securebits.h
. Sembrano corretti, poiché l'output di --print
mostra che questi bit sono corretti.
Ho giocherellato per ore, finora ho questo.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Tuttavia , ping
con errori ping: icmp open socket: Operation not permitted
, questo è ciò che accade quando non ha la capacità. Anche gli --print
spettacoli Current: =p cap_net_raw+i
, questo non è abbastanza di cui abbiamo bisogno e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
imposterà la capacità su Current: = cap_net_raw+eip
questo è corretto, ma ci lascia come root
.
Edit-1
Ora ci ho provato sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Questo produce:
touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted
Il primo errore è previsto, secure-noroot: yes
ma il secondo noCurrent: = cap_net_raw+eip
Edit-2
Se lo metto ==
prima di --print
, ora mostra Current: = cap_net_raw+i
, quindi ciò spiega l'errore precedente, ma non il motivo per cui stiamo perdendo capacità quando si passa da root, ho pensato che secure-keep-caps
dovrebbe risolverlo.
Edit-3
Da quello che posso vedere, sto perdendo Effettivo (e) e Consentito (p), quando viene chiamato exec. Questo è previsto, ma ho pensato che Secure-Keep-Caps, dovrebbe impedire loro di perdersi. Mi sto perdendo qualcosa.
Edit-4
Ho fatto ulteriori ricerche e ho letto di nuovo il manuale. Sembra che normalmente e
e le p
capacità vengano perse quando: si passa da un utente root
(o si applica secure-noroot
, facendo di root un utente normale), questo può essere ignorato secure-keep-caps
; quando chiami exec
, per quanto posso dire questo è un invariante.
Per quanto ne so, funziona secondo il manuale. Per quanto ne so, non c'è modo di fare nulla di utile capsh
. Per quanto ne so, per usare le capacità è necessario: usare le capacità dei file o avere un programma consapevole delle capacità, che non usa exec
. Pertanto nessun wrapper privilegiato.
Quindi ora la mia domanda è cosa mi sto perdendo, a cosa serve capsh
.
Edit-5
Ho aggiunto una risposta alle capacità ambientali. Forse capsh
può anche essere usato con funzionalità ereditate, ma per essere utili queste dovrebbero essere impostate sul file eseguibile. Non riesco a vedere come capsh possa fare qualcosa di utile senza capacità ambientali o per consentire capacità ereditate.
versioni:
capsh
dallalibcap2-bin
versione del pacchetto1:2.22-1.2
- prima di edit-3 ho afferrato l'ultimo
capsh
dagit://git.debian.org/collab-maint/libcap2.git
e iniziato a usarlo. uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
L'utente-land è a 32 bit.
capsh
, in assenza di ambiente (com'era in origine). Cosa mi sto perdendo. Deve avere un uso.
capsh
dal repository collab-maint non ti avrebbe dato il "più recente"capsh
, il pacchetto Debian non supporta ancora le funzionalità ambientali. A monte 2.27 lo fa.