Estou experimentando recursos, no Debian Gnu / Linux.
Copiei / bin / ping para o meu diretório de trabalho atual. Como esperado, ele não funciona, foi originalmente definido como raiz.
Então, dou ao meu ping os recursos mínimos (não raiz) sudo /sbin/setcap cap_net_raw=ep ./ping
, e meu ping funciona como esperado.
Em seguida, sudo /sbin/setcap -r ./ping
revogar essa capacidade. Agora não está funcionando conforme o esperado.
Agora eu tento fazer o ping funcionar usando capsh
.
capsh
não tem privilégios, então eu preciso executá-lo como root, mas depois largue o root e, portanto, todos os outros privilégios.
Acho que também preciso secure-keep-caps
, isso não está documentado capsh
, mas está no manual de recursos. Eu recebi os números dos bits /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
, com erros ping: icmp open socket: Operation not permitted
, é isso que acontece quando ele não tem capacidade. Também os --print
shows Current: =p cap_net_raw+i
, isso não é suficiente, precisamos e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
irá definir a capacidade para Current: = cap_net_raw+eip
isso está correto, mas nos deixa como root
.
Edit-1
Eu já tentei 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
Edit-2
Se eu colocar ==
antes do --print
, agora mostra Current: = cap_net_raw+i
, o que explica o erro anterior, mas não o porquê de perdermos a capacidade ao sair da raiz, embora isso secure-keep-caps
deva corrigir isso.
Edit-3
Pelo que posso ver, estou perdendo Efetivo (e) e Permitido (p), quando exec é chamado. Isso é esperado, mas eu pensei que o secure-keep-caps, deveria impedir que eles se perdessem. Estou esquecendo de algo.
Edit-4
Tenho pesquisado mais e lido o manual novamente. Parece que normalmente e
e os p
recursos são perdidos quando: você muda de usuário root
(ou aplica secure-noroot
, tornando o usuário root normal), isso pode ser substituído secure-keep-caps
; quando você liga exec
, até onde eu sei, isso é invariável.
Tanto quanto posso dizer, está funcionando de acordo com o manual. Até onde eu sei, não há como fazer algo útil capsh
. Tanto quanto posso dizer, para usar recursos, você precisa: usar recursos de arquivo ou ter um programa que reconhece recursos, que não usa exec
. Portanto, nenhum invólucro privilegiado.
Então agora minha pergunta é o que estou perdendo, para que serve capsh
.
Edit-5
Adicionei uma resposta aos recursos ambientais. Talvez capsh
também possa ser usado com recursos herdados, mas para serem úteis, eles precisam ser configurados no arquivo executável. Não vejo como o capsh pode fazer algo útil sem os recursos do ambiente ou para permitir recursos herdados.
Versões:
capsh
dalibcap2-bin
versão do pacote1:2.22-1.2
- antes de editar-3 Peguei o mais recente
capsh
degit://git.debian.org/collab-maint/libcap2.git
e começou a usá-lo. uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
A área do usuário é 32 bits.
fonte
capsh
do repositório collab-maint não lhe daria o "mais recente"capsh
, o pacote Debian ainda não suporta recursos ambientais. Upstream 2,27 faz.capsh
, na ausência de ambiente (como era originalmente). O que estou perdendo. Deve ter um uso.Respostas:
Capacidades são propriedades de processos. Tradicionalmente, existem três conjuntos:
Os programas executados como raiz sempre têm recursos permitidos e eficazes, portanto, "adicionar" mais recursos não tem efeito perceptível. (O conjunto de recursos herdáveis normalmente está vazio.) Com
setcap cap_net_raw+ep ping
você, esses recursos são ativados por padrão para qualquer usuário que esteja executando este programa.Infelizmente, esses recursos estão vinculados ao arquivo executado e não são retidos após a execução de um novo processo filho. O Linux 4.3 introduziu recursos Ambient, que permitem que os recursos sejam herdados por processos filhos. (Consulte também Transformação de recursos durante execve () nos recursos (7) .)
Ao jogar com recursos, observe estas armadilhas:
--keep=1
opção decapsh
para evitar limpar os aparelhos.O
capsh
programa da libcap 2.25 ainda não tem a capacidade de modificar os recursos do ambiente, mas as versões posteriores adicionam novas opções. Observe que a ordem das opções é significativa. Exemplo de uso:Dica: você pode adicionar a
--print
opção em qualquer lugar dacapsh
linha de comando e ver o estado atual dos recursos.Nota:
cap_setpcap
é necessário por--addamb
enquantocap_setuid,cap_setgid
são necessários para a--user
opção.fonte
A resposta de Lekensteyn parece precisa e completa, mas tentarei fornecer outra explicação de um ângulo diferente que tentará enfatizar o problema que as capacidades ambientais configuradas resolvem.
Ao executar
sudo capsh --user=<some_user> --
Existem duas chamadas de interesse do sistema que fazem com que os recursos sejam recalculados (e potencialmente descartados):setuid
: De acordo comman capabilities
:Em outras palavras, em nosso
capsh
comando acima, precisamos garantir que SECBIT_KEEP_CAPS seja definido durante asetuid
chamada do sistema. Caso contrário, todos os recursos serão perdidos. Isto é o que--keep=1
faz. Então agora o comando se tornasudo capsh --user=<some_user> --keep=1 --
execve
: Se usarmos a--keep=1
opção, todos os conjuntos de recursos (efetivos, permitidos, herdáveis) serão preservados até aexecve
chamada do sistema, no entanto, osexecve
recursos também serão recalculados (para usuários não raiz) e de uma maneira não tão óbvia. Em resumo, antes da adição do conjunto de recursos ambientais , para que um recurso esteja no conjunto "permitido" de um encadeamento após umaexecve
chamada:setcap cap_net_raw+p /bin/bash
. Isso faz com que todo o exercício seja inútil, pois os conjuntos de recursos do encadeamento (exceto o conjunto delimitador) não têm mais nenhum efeito.setcap cap_net_raw+i
isso funcionaria, mas acontece queexecve
as permissões herdáveis de um encadeamento são descartadas quando chamadas por usuários sem privilégios (às quais somos atualmente agradecidossetuid
). Portanto, não há como satisfazer essa condição como um usuário não privilegiado.Os recursos ambientais introduzidos no Linux 4.3 possibilitam que um encadeamento retenha seus recursos, mesmo após um
setuid
usuário não privilegiado, seguido por umexecve
, sem precisar confiar nos recursos do arquivo.fonte
Pode haver um bug / recurso no kernel. Houve alguma discussão:
Não faço ideia, se alguma coisa foi feita, para consertar.Edit: De acordo com http://man7.org/linux/man-pages/man7/capabilities.7.html, existe um novo conjunto de recursos Ambient (desde o Linux 4.3). Parece que isso permitirá o que é necessário.
fonte