No sistema Linux, além das permissões convencionais de leitura, escrita e execução, existem três permissões especiais que concedam privilégios adicionais a arquivos e diretórios: SetUID, SetGID e Sticky Bit.
| Permissão | Nome Completo | Descrição |
|---|---|---|
SetUID |
Set User ID | Ao ser aplicado em um executável, faz com que o processo seja executado com os privilégios do proprietário do arquivo, e não do usuário que o invocou. É amplamente utilizado em binários que necessitam de privilégios elevados. |
SetGID |
Set Group ID | Quando aplicado a um executável, o processo roda com os privilégios do grupo proprietário. Aplicado a um diretório, faz com que novos arquivos criados dentro dele herdem o grupo do diretório em vez do grupo primário do usuário. |
Sticky Bit |
Bit Adesivo | Aplicado a diretórios, garante que apenas o proprietário do arquivo, o proprietário do diretório ou o root possam excluir arquivos dentro desse diretório. É essencial em diretórios compartilhados. |
Um caso clássico é o comando passwd, que permite a qualquer usuário alterar sua própria senha:
# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 32648 Aug 10 2021 /usr/bin/passwd
Note que a permissão de execução do proprietário aparece como s em vez de x, indicando a presença do SetUID.
Localizando Arquivos com Permissões Especiais
# Buscar binários com SetUID em /usr/bin
find /usr/bin -perm /u+s
# Localizar diretórios com SetGID no sistema inteiro
find / -type d -perm /g+s
# Encontrar diretórios com Sticky Bit
find / -type d -perm /o+t
Detalhamento do SetUID
- Se o proprietário já possuir permissão de execução (
x), a letra muda paras. - Se o proprietário não tiver permissão de execução (
-), a letra muda paraSmaiúsculo. - Equivalente numérico: 4 como prefixo (ex: 4644).
Exemplo prático: o comando passwd precisa modificar o arquivo /etc/shadow, que pertence ao root. Sem SetUID, usuários comuns não conseguiriam alterar suas senhas.
1. Verificar a presença do SetUID no binário:
# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33424 Feb 18 2022 /usr/bin/passwd
2. Remover o SetUID temporariamente:
# chmod 755 /usr/bin/passwd
3. Tentar alterar a senha como usuário comum carlos:
# su - carlos
$ passwd
Changing password for user carlos.
Current password:
New password:
passwd: Authentication token manipulation error
4. Restaurar o SetUID:
# chmod u+s /usr/bin/passwd
5. Testar novamente a alteração de senha:
# su - carlos
$ passwd
Changing password for user carlos.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Detalhamento do SetGID
- Se o grupo tiver permissão de execução (
x), a letra muda paras. - Se o grupo não tiver permissão de execução (
-), a letra muda paraSmaiúsculo. - Equivalente numérico: 2 como prefixo (ex: 2770).
Exemplo prático: criar um diretório compartilhado para uma equipe de desenvolvimento, onde todos os arquivos novos herdem automaticamente o grupo do projeto.
1. Criar o diretório compartilhado:
# mkdir /home/projeto_comum
2. Criar o grupo e ajustar permissões:
# groupadd equipe_dev
# chgrp equipe_dev /home/projeto_comum
# chmod 770 /home/projeto_comum
3. Aplicar o SetGID:
# chmod g+s /home/projeto_comum
# ls -ld /home/projeto_comum
drwxrws---. 2 root equipe_dev 6 Jan 5 04:55 projeto_comum
4. Adicionar o usuário carlos ao grupo:
# gpasswd -a carlos equipe_dev
Adding user carlos to group equipe_dev
5. Criar um arquivo como carlos e verificar a herança do grupo:
# su - carlos
$ touch /home/projeto_comum/dados.txt
$ ls -l /home/projeto_comum/
-rw-rw-r--. 1 carlos equipe_dev 0 Jan 5 05:27 dados.txt
Detalhamento do Sticky Bit
- Se outros tiverem permissão de execução (
x), a letra muda parat. - Se outros não tiverem permissão de execução (
-), a letra muda paraTmaiúsculo. - Equivalente numérico: 1 como prefixo (ex: 1777).
Exemplo clássico: o diretório /tmp, que precisa ser gravável por todos os usuários, mas onde ninguém deve poder excluir arquivos que não lhe pertencem.
1. Confirmar a presença do Sticky Bit em /tmp:
# ls -ld /tmp
drwxrwxrwt. 16 root root 4096 Jan 5 05:42 /tmp
2. Como usuário maria, criar um diretório em /tmp:
# useradd maria
# su - maria
$ mkdir /tmp/maria_tmp
$ exit
3. Como usuário carlos, tentar remover o diretório criado por maria:
# su - carlos
$ rmdir /tmp/maria_tmp
rmdir: failed to remove '/tmp/maria_tmp/': Operation not permitted