Estou experimentando recursos no Debian GNU / Linux.
Eu copiei / bin / ping para o meu diretório de trabalho atual. Como esperado, não funciona, foi originalmente root setuid.
Eu, então, dou meu ping com os recursos mínimos (não root) fazendo sudo /sbin/setcap cap_net_raw=ep ./ping
, e meu ping funciona, como esperado.
Em seguida, sudo /sbin/setcap -r ./ping
para revogar essa capacidade. Agora não está funcionando como esperado.
Agora tento fazer o ping funcionar usando capsh
.
capsh
não tem privilégios, portanto, preciso executá-lo como root, mas, em seguida, descartar raiz e, assim, todos os outros privilégios.
Acho que também preciso de secure-keep-caps
, isso não está documentado em capsh
, mas está no manual de recursos. Eu tenho os números de bits de /usr/include/linux/securebits.h
. Eles parecem corretos, pois a saída de --print
mostra que esses bits estão corretos.
Eu tenho mexido por horas, até agora eu tenho isso.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
No entanto, ping
erros com ping: icmp open socket: Operation not permitted
, é o que acontece quando não tem capacidade. Além disso, o --print
mostra Current: =p cap_net_raw+i
, isso não é suficiente, precisamos de e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
definirá a capacidade para Current: = cap_net_raw+eip
, mas nos deixa como root
.
Editar-1
Já experimentei sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Isso produz:
touch: cannot touch 'zz': Permission denied
ping: icmp open socket: Operation not permitted
O primeiro erro é esperado como secure-noroot: yes
Mas o segundo não é Current: = cap_net_raw+eip
Editar-2
Se eu colocar ==
antes do --print
, ele mostrará Current: = cap_net_raw+i
, então isso explica o erro anterior, mas não porque estamos perdendo capacidade ao sair do root, eu acho que secure-keep-caps
deve corrigir isso.
Editar-3
Pelo que vejo, estou perdendo Effective (e) e Permitted (p), quando exec é chamado. Isso é esperado, mas achei que secure-keep-caps deveria impedi-los de serem perdidos. Estou faltando alguma coisa?
Editar-4
Estou pesquisando mais e lendo o manual novamente. Parece que normalmente os recursos e
e p
são perdidos quando: você alterna do usuário root
(ou aplica secure-noroot
, tornando root um usuário normal), isso pode ser substituído por secure-keep-caps
; quando você chama exec
, tanto quanto eu posso dizer isso é invariante.
Tanto quanto eu posso dizer, está trabalhando de acordo com o manual. Tanto quanto eu posso dizer, não há como fazer algo útil com capsh
. Tanto quanto eu posso dizer, para usar os recursos que você precisa: usar recursos de arquivo ou ter um programa ciente de recursos, que não usa exec
. Portanto, nenhum wrapper privilegiado.
Então, agora, minha pergunta é o que estou perdendo, o que é capsh
.
Versões:
-
capsh
do pacote libcap2-bin
versão 1:2.22-1.2
- antes da edição 3 peguei a última
capsh
de git://git.debian.org/collab-maint/libcap2.git
e comecei a usá-la.
-
uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
O usuário-terra é 32bit.