Entendendo SUID, SGID e Sticky Bit - Bits de Permissao Especiais no Linux

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.

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.

Proximas Leituras