Em que cenários eu gostaria de definir um bit SUID?

6

Estou lutando para entender o conceito de bits SUID e por que eles seriam úteis.

Por exemplo, digamos que eu tenha um programa:

-rwsr-xr-x 1 root root 12364 Jan 12 2013 /usr/bin/foo

Meu entendimento é que o s no bit de execução para o proprietário do usuário significa, essencialmente, que o arquivo pode ser executado por outros usuários com a autoridade do proprietário do arquivo.

Por que eu iria querer algo assim? Por que não apenas alterar o grupo do arquivo para que funcione para um grupo ao qual todos os usuários pertencem?

    
por Mike B 20.09.2013 / 02:13

3 respostas

13

Setuid e setgid (e setcap onde existe) são as únicas maneiras de elevar privilégios. Além de através deste mecanismo, um processo pode renunciar a privilégios, mas nunca obtê-los. Portanto, você não poderá fazer nada que requeira privilégios adicionais.

Por exemplo, os programas su e sudo precisam ser capazes de executar comandos como qualquer usuário. Portanto, eles precisam ser executados como root, independentemente de qual usuário os chamou.

Outro exemplo é ping . Os soquetes TCP e UDP são acessíveis para qualquer usuário, porque esses protocolos possuem uma noção de portas e um processo pode assumir o controle de uma porta (o que é chamado de ligação), portanto o kernel sabe para onde enviar os pacotes. O ICMP não possui essa noção, portanto, somente programas em execução como raiz (ou com o recurso apropriado) podem solicitar que os pacotes ICMP sejam despachados para eles. Para que qualquer usuário possa executar ping , o programa ping precisa ter um privilégio adicional, então é root setuid (ou setcap).

Para um exemplo de privilégios de grupo, considere um jogo que armazena altas pontuações locais em um arquivo. Uma vez que apenas altas pontuações reais alcançadas pelos usuários devem ser armazenadas no arquivo de pontuação, o arquivo de pontuação não deve ser gravável pelos jogadores. Apenas o programa do jogo deve ter permissão para escrever no arquivo de pontuação. Assim, o programa do jogo é setgid games , e o arquivo de pontuação é gravável pelo grupo games , mas não pelos jogadores.

Há uma abordagem alternativa para elevar permissões, que é iniciar programas que exigem privilégios adicionais de um programa de iniciador privilegiado. Quando um usuário deseja executar uma tarefa que requer privilégios adicionais, ele executa um programa front-end que usa alguma forma de comunicação entre processos para executar a ação privilegiada. Isso funciona bem para alguns casos de uso, como ping (um programa ping para analisar opções e relatar progresso, e um serviço ping-backend que envia e recebe pacotes), mas não para outros casos de uso, como a pontuação alta do jogo. arquivo.

    
por 20.09.2013 / 02:22
1

O bit suid (ou sgid) faz com que um executável seja executado como um usuário / grupo diferente do usuário invocando-o.

Se a única razão para isso é acessar um determinado arquivo, sim, você poderia usar outros mecanismos para tornar esse arquivo gravável. No entanto, o usuário poderia fazer qualquer coisa ao arquivo, em oposição a apenas as coisas que seu programa permitir.

Você poderia, por exemplo, fazer com que seu programa permitisse apenas anexar uma linha a um arquivo e apenas em um determinado formato. Mas se você acabou de usar as permissões do sistema de arquivos, o usuário também pode excluir linhas do arquivo. Ou coloque linhas mal formatadas.

Basicamente, um programa suid pode impor uma política arbitrária. Permissões do sistema de arquivos não podem. Por exemplo, seu sistema possui um programa suid /bin/su . Ele fornece um shell de root (por exemplo), mas somente se você atender a uma política primeiro - normalmente, insira a senha de root. Não há como fazer isso apenas com permissões.

    
por 20.09.2013 / 02:20
0

O motivo mais comum é que um executável possa ser executado como root. Por exemplo:

find /bin/ -type f \( -perm -4000 -o -perm -2000 \) -ls  | awk '{print $3,$NF}'
-rwsr-xr-x /bin/su
-rwsr-xr-x /bin/mount
-rwsr-xr-- /bin/fusermount
-rwsr-xr-x /bin/ping6
-rwsr-xr-x /bin/ping
-rwsr-xr-x /bin/umount

Estes são todos os comandos que podem ser executados por usuários regulares, mas precisam de privilégios elevados. mount é um exemplo perfeito, você pode montar qualquer disco que tenha a opção user ou semelhante definida em /etc/fstab , mas a montagem precisa de root privileges para que o bit SUID seja definido.

    
por 20.09.2013 / 02:19