Observei o seguinte fenômeno que não consigo explicar. Depois de adicionar o CAP_SYS_ADMIN
recurso, unshare
não é mais possível gravar em arquivos /proc/self/setgroups
.
Na verdade, gravar nesse arquivo requer a capacidade, mas isso é obtido alterando o namespace do usuário. Então, por que adicionar o recurso ao processo pai impede a gravação nesse arquivo?
me@myhost:~$ unshare -r
root@myhost:~# exit
logout
me@myhost:~$ sudo setcap cap_sys_admin=ep /usr/bin/unshare
me@myhost:~$ unshare -r
unshare: cannot open /proc/self/setgroups: Permission denied
me@myhost:~$ sudo setcap cap_sys_admin= /usr/bin/unshare
me@myhost:~$ unshare -r
root@myhost:~#
A propósito: estou executando o Ubuntu 16.04.4 LTS com kernel versão 4.4 e a versão do util-linux (incluindo unshare
) é 2.27.1.
O que está acontecendo aqui é que seu processo de "unshare" não tem acesso para gravar nos arquivos
setgroups
(euid_maps
, ) no namespace de usuário externo .gid_maps
Nesse namespace, os pseudo-arquivos
/proc/<PID>
serão de propriedade do root e, como se seu uid efetivo ainda fosse o de seu próprio usuário, você não terá acesso para gravar nesses arquivos.Você pode visualizar isso facilmente executando um processo em segundo plano (como
sleep
) e inspecionando as permissões dosetgroups
arquivo enquanto ele está em execução (uid_maps
egid_maps
se comportando exatamente da mesma forma).Primeiro, com um binário que não possui recursos adicionais:
Em seguida, vamos adicionar alguns recursos de arquivo a ele e ver a mudança de propriedade:
A propriedade dos arquivos
/proc/<PID>
é controlada pelo sinalizador "dumpable" dentro do kernel do Linux, que é usado para evitar o vazamento de informações de um processo privilegiado para um usuário não privilegiado.E considerando que você está executando com recursos adicionais, mas ainda com um uid efetivo
unshare
não root , o acesso de gravação a esses pseudo-arquivos pertencentes ao root é impedido pelos controles de acesso normais do sistema operacional.Você pode inspecionar o valor do sinalizador "dumpable" usando o
PR_GET_DUMPABLE
comando da syscall prctl(2) .Na descrição para
PR_SET_DUMPABLE
você também encontrará:Que é exatamente o seu caso, com um
unshare
binário que possui recursos de arquivo.Curiosamente, usar um binário setuid de propriedade de root para
unshare
não se depara com esse problema exato. Sim, ele limpará os sinalizadores "dumpable" e os arquivos/proc/<PID>
serão de propriedade do root. Mas considerando que seu uid efetivo também é root ao executar um binário setuid, o acesso será permitido.Nesse caso, você acaba se deparando com um problema diferente, que tem a ver com
unshare
a lógica de não ser capaz de lidar com essa configuração específica (provavelmente algo a ver com o uid efetivo e o uid real não correspondendo):Observe também que a limpeza do sinalizador "dumpable" foi acionada pela execução de um binário com recursos de arquivo definidos. Se você obtiver recursos adicionais de uma maneira diferente, talvez não tenha esse problema. Por exemplo, usar recursos "ambientais" é uma boa maneira de obter recursos adicionais fora do namespace, sem ter problemas ao descompartilhar em um novo namespace de usuário.
(Infelizmente, ainda não há muitas ferramentas em torno dos recursos do ambiente.
libcap
apenas o suporte é fornecido no git mais recente, a versão 2.25 anterior, que é a atualmente fornecida na maioria das distros.capsh
é de nível bastante baixo, então não é tão fácil obtê-lo Veja aqui os detalhes sobre como usar o mais recentecapsh
para adicionar recursos de ambiente. Também tenteisystemd-run
, mas não consegui configurar os recursos de ambiente lá. De qualquer forma, algo para você analisar, se precisar de recursos, não usuário root e namespaces de usuário juntos!)