Existem algumas abordagens, algumas na maior parte seguras, outras nem um pouco.
A maneira insegura
Permita que qualquer uso seja executado mount
, por exemplo, através do sudo. Você também pode dar-lhes raiz; é a mesma coisa. O usuário pode montar um sistema de arquivos com uma cópia raiz suid de - bash
execução que instantaneamente fornece raiz (provavelmente sem nenhum registro, além do fato de que mount
foi executada).
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
, e então obter root 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 realizados em /etc/pam.d
muitos outros lugares.
Lembre-se de que os sistemas de arquivos nem precisam estar em um dispositivo, -o loop
montarão um arquivo que é de propriedade (e, portanto, modificável) do usuário.
A maneira mais segura: udiscos ou similar
Os vários ambientes de desktop já criaram soluções para isso, para permitir que os usuários montem mídias removíveis. Eles funcionam montando apenas em um subdiretório /media
e desativando o suporte a set-user / group-id através das opções do kernel. Opções aqui incluem udisks
, udisks2
, pmount
, usbmount
,
Se necessário, você pode escrever seu próprio script para fazer algo semelhante e invocá-lo através do sudo - mas você deve ter muito cuidado ao escrever esse script para não deixar explorações de raiz. Se você não quiser que seus usuários se lembrem do sudo, faça algo assim em um script:
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "$@"
fi
# rest of script goes here
A maneira como um dia estará seguro: espaços de nome de usuário
Os namespaces do Linux são uma forma muito leve de virtualização (contêineres, para ser mais específico). Em particular, com espaços de nome de usuário, qualquer usuário no sistema pode criar seu próprio ambiente no qual é raiz. Isso permitiria que eles montassem sistemas de arquivos, exceto que foram explicitamente bloqueados, exceto por alguns sistemas de arquivos virtuais. Eventualmente, os sistemas de arquivos FUSE provavelmente serão permitidos, mas os patches mais recentes que pude encontrar não cobrem dispositivos de bloco, apenas coisas como sshfs.
Além disso, muitos kernels de distribuição (por motivos de segurança) adotaram o padrão de não permitir que usuários não privilegiados usem espaços de nome de usuário; por exemplo, o Debian tem um kernel.unprivileged_userns_clone
padrão de 0. Outras distros têm configurações semelhantes, embora geralmente com nomes ligeiramente diferentes.
A melhor documentação que eu conheço sobre espaços para nome de usuário é um artigo LWN
Namespaces em operação, parte 5: Espaços para nome de usuário .
Por enquanto, eu usaria o udisks2.
gvfs-mount
-d /dev/sdX