Entendendo SUID, SGID e Sticky Bit - Bits de Permissao Especiais no Linux
O que Sao SUID, SGID e Sticky Bit?
SUID, SGID e Sticky Bit sao tres flags de permissao especiais adicionadas sobre as permissoes padrao rwx do Linux. Elas possibilitam comportamentos essenciais do sistema: permitir que usuarios normais executem comandos que requerem privilegios root (como passwd), fazer com que arquivos em diretorios compartilhados herdem o grupo do diretorio e impedir que usuarios excluam arquivos de outros em espacos compartilhados como /tmp.
| Bit | Valor | Alvo | Caso de Uso Principal |
|---|---|---|---|
| SUID | 4 | Executaveis | Executar com o UID do proprietario do arquivo |
| SGID | 2 | Arquivos / Diretorios | Executar com o grupo do arquivo / herdar grupo |
| Sticky Bit | 1 | Diretorios | Somente o proprietario pode excluir seus arquivos |
SUID (Set User ID)
Um executavel com SUID definido executa com os privilegios do proprietario do arquivo, nao os do usuario que o invocou.
/usr/bin/passwd e o exemplo canonico. Usuarios regulares podem alterar suas proprias senhas porque passwd tem SUID definido e executa com privilegios root, permitindo que ele escreva em /etc/shadow.
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Mar 22 2024 /usr/bin/passwd
O s na posicao de execucao do proprietario indica que o SUID esta definido.
Definindo e Removendo SUID
# Definir SUID (simbolico) $ chmod u+s /path/to/file # Definir SUID (octal: prefixo 4XXX) $ chmod 4755 /path/to/file # Remover SUID $ chmod u-s /path/to/file
SUID introduz risco de escalacao de privilegios. Evite defini-lo em arquivos desnecessariamente e audite arquivos SUID regularmente:
# Encontrar todos os arquivos SUID no sistema $ find / -perm -4000 -type f 2>/dev/null
SGID (Set Group ID)
O SGID se comporta de maneira diferente dependendo de estar definido em um executavel ou em um diretorio.
Em executaveis: o processo executa com o grupo do arquivo em vez do grupo primario do usuario que o invocou. O exemplo classico e /usr/bin/write, que precisa de acesso ao grupo tty.
Em diretorios: arquivos criados dentro herdam o grupo do diretorio em vez do grupo primario do criador -- essencial para diretorios de projetos compartilhados.
$ ls -l /usr/bin/write
-rwxr-sr-x 1 root tty 14952 Mar 30 2023 /usr/bin/write
O s na posicao de execucao do grupo sinaliza SGID.
Usando SGID em um Diretorio Compartilhado
# Definir SGID em um diretorio de projeto compartilhado $ chmod g+s /shared/project # Verificar $ ls -ld /shared/project
drwxrwsr-x 2 user devteam 4096 Jun 1 12:00 /shared/project
Novos arquivos dentro deste diretorio terao devteam como grupo, independentemente de quem os criar:
$ touch /shared/project/newfile.txt $ ls -l /shared/project/newfile.txt
-rw-r--r-- 1 alice devteam 0 Jun 1 12:00 /shared/project/newfile.txt
Definindo SGID
# Simbolico $ chmod g+s /path/to/dir # Octal: prefixo 2XXX $ chmod 2775 /path/to/dir
Sticky Bit
O Sticky Bit e definido em diretorios para que somente o proprietario do arquivo (ou root) possa excluir ou renomear, mesmo que o diretorio tenha permissao de escrita para todos.
/tmp e o exemplo mais familiar. Qualquer um pode escrever nele, mas cada usuario so pode excluir seus proprios arquivos.
$ ls -ld /tmp
drwxrwxrwt 17 root root 4096 Jun 1 12:00 /tmp
O t na posicao de execucao de outros indica o Sticky Bit.
Definindo o Sticky Bit
# Definir Sticky Bit (simbolico) $ chmod +t /shared/dir # Definir Sticky Bit (octal: prefixo 1XXX) $ chmod 1777 /shared/dir # Remover Sticky Bit $ chmod -t /shared/dir
Verificar:
$ mkdir /tmp/testdir && chmod 1777 /tmp/testdir $ ls -ld /tmp/testdir
drwxrwxrwt 2 user group 40 Jun 1 12:00 /tmp/testdir
Definindo Bits Especiais com Notacao Octal
Use notacao octal de 4 digitos para combinar bits especiais com permissoes padrao. O digito inicial e a soma dos bits especiais (SUID=4, SGID=2, Sticky=1).
| Configuracao | Valor | Exemplo |
|---|---|---|
| Apenas SUID | 4755 | chmod 4755 file |
| Apenas SGID | 2755 | chmod 2755 dir |
| Apenas Sticky | 1777 | chmod 1777 dir |
| SUID + SGID | 6755 | chmod 6755 file |
# SUID: proprietario=rwx, grupo=rx, outros=rx $ chmod 4755 myprogram # SGID diretorio compartilhado: proprietario=rwx, grupo=rwx, outros=rx $ chmod 2775 shared_dir
Lendo Bits Especiais na Saida de ls -l
Bits especiais substituem o caractere x em posicoes previsiveis na saida de ls -l.
-rwsr-xr-x --> SUID definido (x do proprietario substituido por s) -rwxr-sr-x --> SGID definido (x do grupo substituido por s) drwxrwxrwt --> Sticky Bit definido (x de outros substituido por t) -rwSr--r-- --> SUID definido, proprietario sem bit de execucao (S maiusculo) -rwxr-Sr-- --> SGID definido, grupo sem bit de execucao (S maiusculo) drwxrwxrwT --> Sticky Bit definido, outros sem bit de execucao (T maiusculo)
Minusculo s / t -- o bit especial e a permissao de execucao estao ambos definidos.
Maiusculo S / T -- somente o bit especial esta definido; o bit de execucao esta ausente. Isso quase sempre e uma configuracao incorreta.
Encontrando arquivos com bits especiais:
# Arquivos com SUID $ find / -perm -4000 -type f 2>/dev/null # Arquivos e diretorios com SGID $ find / -perm -2000 2>/dev/null # Diretorios com Sticky Bit $ find / -perm -1000 -type d 2>/dev/null
Consideracoes de Seguranca
Bits de permissao especiais sao poderosos, mas trazem exposicao de seguranca.
Mantenha o uso de SUID/SGID no minimo
Arquivos SUID/SGID desnecessarios sao um vetor comum para escalacao de privilegios. Nunca defina SUID em shell scripts -- o Linux ignora isso em arquivos interpretados, mas faze-lo sinaliza praticas de seguranca inadequadas.
Audite arquivos SUID/SGID regularmente
# Registrar uma baseline de arquivos SUID/SGID $ find / -perm /6000 -type f 2>/dev/null > /tmp/suid_baseline.txt
Execute isso periodicamente e compare com a baseline para detectar adicoes nao autorizadas.