Dado o número de conceitos diferentes, acho mais fácil aprender com exemplos práticos.
Programas como o servidor NFS do espaço do usuário agem em nome de um usuário específico conectado pela rede. Eles alteram temporariamente seus IDs efetivos de usuário e grupo, por exemplo, ao abrir um arquivo em nome de um usuário específico. Eles podem voltar, porque ainda têm o UID e o GID privilegiados em seu UID e GID "salvos" ou "reais".
Eu aprendi recentemente que fusermount
é outro exemplo de um programa que faz isso. Deve ser a raiz do set-uid para que possa montar sistemas de arquivos, mas deseja executar verificações de permissão como o usuário original, por exemplo, ao ler arquivos de configuração e ao atingir o diretório que é passado como um ponto de montagem. Pelo menos, deve mudar seu UID assim. Se este programa também fosse set-gid, então também teria que mudar seu GID. fusermount
não precisa ser instalado como set-gid, mas o código altera seu GID efetivo de qualquer maneira. Não é preciso muito mais código e, pelo menos, espero que não cause problemas: -).
A página man
de setfsgid()
menciona este exemplo quando diz
Explicit calls to setfsuid() and setfsgid() are usually used only by
programs such as the Linux NFS server that need to change what user and
group ID is used for file access without a corresponding change in the
real and effective user and group IDs
[...]
The filesystem user ID attribute was added to
allow a process to change its user ID for the purposes of file permis‐
sion checking without at the same time becoming vulnerable to receiving
unwanted signals. Since Linux 2.0, signal permission handling is dif‐
ferent (see kill(2)), with the result that a process change can change
its effective user ID without being vulnerable to receiving signals
from unwanted processes. Thus, setfsuid() is nowadays unneeded and
should be avoided in new applications (likewise for setfsgid(2)).
i.e. as versões atuais desses programas alterarão temporariamente seu UID e GID efetivo, usando setresuid () e setresgid ().