githubEdit

Permissões Especiais: Bits SUID e SGID

Esta página descreve o funcionamento das permissões especiais SUID e SGID em sistemas Unix-like e apresenta instruções práticas para avaliação de riscos associados à configuração dessas permissões. O conteúdo fornece a administradores e a avaliadores instruções técnicas para identificar configurações que ampliam a superfície de ataque, preparando o terreno para análises específicas de outras classes de vulnerabilidades dependentes desse mecanismo.

Pré-requisitos

A seguir são listados alguns assuntos fundamentais sobre sistemas operacionais cujo conhecimento prévio é necessário para o pleno entendimento da seção Explicações Conceituais que envolve bits SUID e SGID.

  • Modelo de permissões de arquivos em sistemas compatíveis com POSIX.

Explicações conceituais

No contexto de controle de acesso em sistemas Unix-like, Set User Identifier (SUID) e Set Group Identifier (SGID) são bits que representam permissões especiais. Em sistemas Unix-like, cada processo possui dois identificadores de usuário principais que influenciam diretamente seu comportamento: o Real User Identifier (RUID) e o Effective User Identifier (EUID). O RUID representa o usuário que iniciou o processo, enquanto o EUID determina quais permissões o processo possui durante sua execução.

Quando um programa que possui o bit SUID ativado é executado, o EUID desse processo é alterado para o User Identifier (UID) do proprietário do arquivo executável, permitindo que ele seja executado com privilégios diferentes -- e, potencialmente, mais elevados -- do que os privilégios do usuário que o executou. Em certos casos, é possível abusar dessa configuração para executar comandos com permissões administrativas de maneira indevida, atingindo, portanto, uma elevação de privilégio vertical.

Instruções práticas

Trata-se de um guia prático de verificação de segurança que apresenta uma sequência de instruções, incluindo o uso de ferramentas/comandos, de modo a permitir que administrador avalie de forma objetiva aspectos de segurança do sistema.

Guia para avaliação de riscos

Este guia descreve apenas as verificações pertinentes ao contexto dos bits SUID e SGID, sem análise de explorabilidade específica. O propósito é avaliar o contexto, origem, proprietário ou se a mera existência desses binários já sinaliza algum grau de risco.

Sistemas Linux possuem diversos arquivos legítimos com os bits SUID/SGID ativos. Portanto, tais arquivos não podem ser considerados imediatamente como vulnerabilidades; é necessária análise aprofundada. Análises desse tipo, que buscam por vulnerabilidades específicas (e que abusam também de mecanismos como as permissões SUID/SGID), são realizadas em outras páginas do arcabouço.

Apesar disso, ainda é possível realizar algumas verificações em busca de indicadores de risco em relação a essas permissões especiais. Essas verificações são apresentadas a seguir.

1

Identificação inicial dos binários SUID e SGID

Objetivo: Encontrar todos os arquivos executáveis no sistema que tenham os bits SUID e/ou SGID ativados.

Motivo: Ter uma lista completa é o primeiro requisito para essa avaliação e é a base para outras verificações. Qualquer binário com bits SUID/SGID é ponto de atenção, mesmo que posteriormente se mostre inofensivo.

Método:

Uma das maneiras mais convencionais para fazer essa busca é através da ferramenta find. Execute-a como root (ou com sudo) para cobrir todo o sistema.

Para buscar todos os arquivos do sistema com os bits SUID ou SGID ativos, use:

find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -l {} \; 2>/dev/null

Se preferir, adicione essas informações em um arquivo:

find / -type f \( -perm -4000 -o -perm -2000 \) > ./lista_suid_sgid.txt 2>/dev/null

Indicadores de risco:

  • Alto número de binários com SUID/SGID em sistemas que deveriam ser mínimos.

2

Análise de usuário e grupo proprietários do binário SUID/SGID

2.1. Binário SUID/SGID pertencente ao usuário/grupo root.

Objetivo: Identificar binários executáveis com bit SUID e/ou SGID ativo cuja propriedade seja do usuário root ou do grupo root.

Motivo: Do ponto de vista de usuário, um binário com bit SUID ativo cujo dono seja o usuário root fará com que o processo criado a partir da execução do binário tenha EUID igual a zero, permitindo elevação de privilégio vertical se for explorável. Com comportamento análogo ao SUID, o bit SGID altera o Effective Group Identifier (EGID) do processo para o GID do grupo dono do binário. Desse modo, com grupo dono sendo root, o EGID do processo será zero, o que pode conceder acesso a recursos controlados pelo grupo root em caso de exploração.

Método:

Para procurar arquivos com bit SUID ativo e pertencentes ao usuário root, é possível usar:

find / -type f -perm -4000 -user root -exec ls -l {} \; 2>/dev/null

Para procurar arquivos com bit SGID ativo e pertencentes ao grupo root, é possível usar:

find / -type f -perm -2000 -group root -exec ls -l {} \; 2>/dev/null

2.2. Binário SUID/SGID pertencente a usuários/grupos não root.

Objetivo: Identificar binários executáveis com bit SUID e/ou SGID ativo cuja propriedade seja de usuários não root ou de grupos não root.

Motivo: Se um binário SUID pertence a um usuário membro de algum grupo administrativo (como adm, wheel, sys), o programa será executado com o EUID desse usuário “administrativo”, mesmo quando invocado por um usuário comum. Por consequência, isso pode permitir operações com os privilégios específicos daquela conta em caso de exploração. Analogamente, um binário com bit SGID ativo pertencente a um grupo não root (especialmente grupos administrativos como os já mencionados ou grupos de serviços) pode conceder ao processo acesso a recursos sensíveis em caso de exploração.

Método:

Para procurar arquivos com bit SUID ativo e pertencentes a usuários não root, é possível usar:

find / -type f -perm -4000 ! -user root -exec ls -l {} \; 2>/dev/null

Para procurar arquivos com bit SGID ativo e pertencentes a grupos não root, é possível usar:

find / -type f -perm -2000 ! -group root -exec ls -l {} \; 2>/dev/null
circle-exclamation

Para usuários dono de binários, inspecione suas associações a outros grupos com:

groups usuario  # ou
id usuario      # ou
grep usuario /etc/group

Indicadores de risco:

  • Binários com bit SUID ativo pertencentes a contas de serviços ou a usuários membros de grupos administrativos (adm, wheel, sys, etc.).

3

Verificar se o binário pertence ao conjunto esperado de SUID/SGID do sistema

Objetivo: Comparar os binários SUID/SGID encontrados com a origem de pacotes do sistema (se entregue por gerenciador de pacotes) ou com uma lista de binários esperados.

Motivo: Binários entregues por gerenciador de pacotes são, a princípio, menos suspeitos que arquivos instalados manualmente.

Método:

Identifique se o binário pertence a um pacote oficial:

dpkg -S /caminho/do/binario      # sistemas Debian/Ubuntu
rpm -qf /caminho/do/binario      # sistemas RHEL/Fedora
pacman -Qo /caminho/do/binario   # sistemas Arch

Indicadores de risco:

  • Binários SUID/SGID não pertencentes a pacotes oficiais ou entregues por pacotes de repositórios desconhecidos;

  • Binários SUID/SGID com nomes semelhantes a utilitários legítimos, mas fora do pacote esperado.

4

Binários SUID/SGID localizados em diretórios não usuais

Objetivo: Identificar binários com bit SUID/SGID ativo que estejam armazenados fora de diretórios considerados “convencionais” para executáveis (por exemplo, /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin).

Motivo: Binários privilegiados posicionados fora dos diretórios tradicionais de executáveis ampliam a superfície de risco. Tais diretórios não convencionais tendem a: possuir controles de acesso mais permissivos, não serem monitorados por mecanismos que validam alterações em binários do sistema e não serem contemplados por políticas de empacotamento, atualização e auditoria. Isso pode facilitar operações com esse tipo de executável, tornando tais locais inadequados para conter binários com bits SUID/SGID ativos.

Método:

Exemplo para listagem apenas de arquivos com bits SUID/SGID ativos que estejam fora dos diretórios convencionais de executáveis:

find / \
  \( -path "/bin/*" -o -path "/sbin/*" -o -path "/usr/bin/*" -o -path "/usr/sbin/*" -o -path "/usr/local/bin/*" \) \
  -prune -o -type f \( -perm -4000 -o -perm -2000 \) \
  -exec ls -l {} \; 2>/dev/null

Indicadores de risco:

  • Binários com bits SUID/SGID ativos em diretórios temporários (/tmp, /var/tmp);

  • Binários com bits SUID/SGID ativos em diretórios home de usuários (/home/user).

5

Verificar se o sistema de arquivos onde o binário reside está montado com parâmetros que afetam SUID/SGID (ex.: nosuid)

Objetivo: Verificar se sistemas de arquivos que deveriam bloquear SUID/SGID por política de fato possuem a opção nosuid.

Motivo: Sistemas de arquivos montados com a opção nosuid ignoram bits SUID/SGID. Isso é útil para reduzir o risco em pontos de montagem específicos (como volumes compartilhados, NFS, /tmp em partição separada).

Método:

Verifique as opções de montagem em busca da opção nosuid:

mount | grep 'nosuid' # ou
grep 'nosuid' /proc/mounts

Indicadores de risco:

  • Ausência da opção nosuid em partições compartilhadas (NFS, SMB);

  • Ausência da opção nosuid em diretórios temporários (/tmp, /var/tmp).

Referências

Lista de fontes usadas para a elaboração do material, bem como recomendações para estudo aprofundado.

Last updated