Existem algumas abordagens, algumas delas mais seguras, outras não.
O caminho inseguro
Deixe qualquer uso executar mount
, por exemplo, através do sudo. Você também pode dar-lhes raiz; é a mesma coisa. O usuário poderia montar um sistema de arquivos com uma cópia raiz suid de bash
—running que dá instantaneamente root (provavelmente sem qualquer registro, além do fato de que mount
foi executado).
Como alternativa, um usuário pode montar seu próprio sistema de arquivos em cima de /etc
, contendo sua própria cópia de /etc/shadow
ou /etc/sudoers
, depois obter raiz com su
ou sudo
. Ou possivelmente bind-mount ( mount --bind
) sobre um desses dois arquivos. Ou um novo arquivo em /etc/sudoers.d
.
Ataques semelhantes podem ser obtidos em /etc/pam.d
e muitos outros lugares.
Lembre-se de que sistemas de arquivos nem precisam estar em um dispositivo, -o loop
montará um arquivo que é de propriedade (e portanto modificável) pelo usuário.
A maneira mais segura: udisk ou similar
Os vários ambientes de desktop já criaram soluções para isso, para permitir que os usuários montem mídia removível. Eles trabalham montando em um subdiretório de /media
e desativando o suporte set-user / group-id via opções do kernel. As opções aqui incluem udisks
, udisks2
, pmount
, usbmount
,
Se precisar, você pode escrever seu próprio script para fazer algo semelhante e invocá-lo através do sudo - mas você precisa ter muito cuidado ao escrever este script para não deixar explorações de root. Se você não quer que seus usuários tenham que se lembrar do sudo, você pode fazer algo assim em um script:
#!/bin/bash
if [ $UID -ne 0 ]; then # or 'id -u'
exec sudo -- "$0" "$@"
fi
# rest of script goes here
O caminho será um dia seguro: namespaces de usuário
A partir do Linux 3.10, o suporte a namespaces é basicamente completo, aparentemente faltando a maior parte do suporte no XFS (um sistema de arquivos). Namespaces são uma forma muito leve de virtualização (containers, para ser mais específico). Em particular, com namespaces de usuário, qualquer usuário do sistema pode criar seu próprio ambiente no qual ele é root e, portanto, pode montar sistemas de arquivos.
Muitos kernels de distribuição, no entanto, desativaram o recurso (ex: Debian ) devido ao conflito XFS e preocupações com segurança; na verdade, houve uma exploração de raiz descoberta no início deste ano ( CVE-2013-1858 ). Você pode precisar recompilar o kernel com CONFIG_USER_NS=y
.
A melhor documentação que eu sei sobre namespaces de usuário é um artigo do LWN Namespaces em operação, parte 5: Espaços de nomes do usuário .