chmod 4755
chmod 4755 define rwsr-xr-x: qualquer um executa o programa, e o bit setuid (o s) faz ele rodar com o ID do dono do arquivo, então um binário 4755 do root roda como root não importa quem o inicie.
Matriz de permissões
| Quem | Leitura (4) | Escrita (2) | Execução (1) | Dígito |
|---|---|---|---|---|
| Dono (u) | Sim | Sim | Sim | 7 |
| Grupo (g) | Sim | Não | Sim | 5 |
| Outros (o) | Sim | Não | Sim | 5 |
Execução muda de sentido conforme o tipo. Num arquivo, deixa o kernel rodá-lo como programa. Num diretório, é a permissão de busca: entrar (cd) e alcançar os arquivos de dentro pelo nome. Leitura num diretório só lista os nomes.
| Quem | Num arquivo | Num diretório |
|---|---|---|
| Dono (u) | Ler, alterar e executar | Listar, entrar, criar, apagar e renomear itens |
| Grupo (g) | Ler e executar | Listar, entrar e abrir itens |
| Outros (o) | Ler e executar | Listar, entrar e abrir itens |
Bits especiais deste modo
- setuid (4000): o programa roda com o ID do dono do arquivo, não de quem o iniciou. O Linux não dá significado a ele em diretórios e o ignora em scripts.
Dados
| Octal | 4755 |
|---|---|
| Simbólico | rwsr-xr-x |
| ls -l, arquivo | -rwsr-xr-x |
| ls -l, diretório | drwsr-xr-x |
| Comando simbólico equivalente | chmod u=rwxs,go=rx |
| umask padrão que gera esse modo | Nenhum dos umasks comuns; defina explicitamente com chmod |
| Como o Git registra um arquivo assim | 100755 (executável) |
| Bits especiais | setuid |
Quando usar
- Programas do sistema que precisam fazer uma única coisa privilegiada para qualquer usuário: o passwd é -rwsr-xr-x root para poder atualizar o /etc/shadow quando você troca a própria senha; su e mount são setuid root por motivos parecidos.
- Só em programas compilados, escritos e auditados para isso, que abrem mão do privilégio assim que possível.
Quando não usar
- Scripts: o Linux ignora setuid em scripts interpretados (veja execve(2)), então o bit simplesmente não faz nada.
- Dar acesso root a um único comando: uma regra no sudoers gera log, pode ser limitada a argumentos específicos e não altera o arquivo.
- Sistemas de arquivos montados com nosuid, que muitas distribuições usam em /tmp, /dev/shm e mídias removíveis: lá o bit é ignorado.
- Qualquer programa que abra um shell, grave arquivos arbitrários ou carregue plugins: torná-lo setuid root entrega o root a todo usuário local.
Auditando arquivos setuid e setgid
Arquivos setuid inesperados são um sinal clássico de invasão ou de instalação mal configurada. Liste de tempos em tempos e compare com o que a sua distribuição instala.
sudo find / -xdev -type f -perm -4000 -exec ls -l {} + 2>/dev/null # setuid
sudo find / -xdev -type f -perm -2000 -exec ls -l {} + 2>/dev/null # setgid
sudo chmod u-s /usr/local/bin/tool # remove o setuidComandos
sudo chmod 4755 /usr/local/bin/tool
sudo chmod u=rwxs,go=rx /usr/local/bin/tool # mesmo resultadostat -c '%a %A %n' /usr/local/bin/tool # Linux (stat do GNU): 4755 -rwsr-xr-x
stat -f '%Mp%Lp %Sp %N' /usr/local/bin/tool # macOS e BSDAplicando numa árvore inteira
Nunca aplique 4755 de forma recursiva. O setuid vai em binários específicos e auditados; numa árvore, cada arquivo virava um programa que roda como o dono, e o Linux não dá significado nenhum ao setuid em diretórios.
Perguntas frequentes
- O que significa o s em rwsr-xr-x?
- É o bit setuid (octal 4000), mostrado na posição de execução do dono. O s minúsculo indica que a execução também está ligada; o S maiúsculo (como em 4644, rwSr--r--) indica setuid sem execução, o que não serve para nada.
- chmod 4755 é perigoso?
- Num binário do root, é tão perigoso quanto o pior bug do programa, porque todo usuário local pode rodá-lo como root. Use só em programas do sistema bem auditados.
- Setuid funciona em shell script?
- Não. O kernel Linux ignora setuid e setgid em scripts que começam com #!. Use sudo com uma regra específica, ou um pequeno programa compilado como intermediário.
- Por que o bit setuid sumiu depois que editei o arquivo?
- O Linux zera setuid e setgid quando um processo sem privilégio grava no arquivo, e o chown também zera. Ligue de novo com chmod u+s depois da mudança.
Revisado em por Arielton Oberek.