Suponho que um arquivo executável com o conjunto de bits SetUID deva estar sendo executado como seu proprietário, mas não consigo reproduzi-lo. Eu tentei o seguinte.
$ gato prepare.sh cp /bin/bash. chown root.root bash chmod 4770 bash# Verificado $ sudo sh prepare.sh $./bash $ id -você 1000 $ saída $
$ teste de gato.c #include<stdio.h> #include<unistd.h> int principal(){ printf("%d,%d\n", getuid(), geteuid()); retornar 0; } $ gcc -o teste teste.c $ chmod 4770 teste# Verificado $ sudo chown teste root.root $./teste 1.000.1000 $# Por que???
No entanto
$ su # ./bash # id -você 0 # ./teste 0,0 # saída # saída $
Nota: O ponto de montagem não tem nosuid
nem noexec
definido.
Alguém pode explicar por que não funciona no Ubuntu 16.04 LTS?
Responder1
Para o executável compilado, deman 2 chown
:
When the owner or group of an executable file are changed by an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared. POSIX
does not specify whether this also should happen when root does the
chown(); the Linux behavior depends on the kernel version.
Inverter a ordem chown
e chmod
funciona para mim:
$ sudo chmod 4770 foo
$ sudo chown root:root foo
$ stat foo
File: 'foo'
Size: 8712 Blocks: 24 IO Block: 4096 regular file
Device: 801h/2049d Inode: 967977 Links: 1
Access: (0770/-rwxrwx---) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-04-18 15:15:15.074425000 +0900
Modify: 2017-04-18 15:15:15.074425000 +0900
Change: 2017-04-18 15:15:33.683725000 +0900
Birth: -
$ sudo chmod 4777 foo
$ ./foo
1000,0
Responder2
No seu primeiro caso, é o Bash que não gosta de ser executado como setuid.
Se o Bash for iniciado com o ID do usuário (grupo) efetivo diferente do ID do usuário (grupo) real,..., e o ID do usuário efetivo for definido como o ID do usuário real.
Ver:Manual do Bash sobre arquivos de inicialização, tambémO bit Setuid parece não ter efeito no bash.
No segundo caso, é a ordem de chmod
e chown
que importa, como já mururespondidas. Alterar o proprietário redefine o bit setuid.
Responder3
Também pode ser que o sistema de arquivos que contém o executável de teste tenha sido montado com onosuid
opção; Ouvi dizer que distribuições mais recentes farão isso por padrão para /tmp
, e há bons argumentos para aplicá-lo /home
também. nosuid
faz com que o kernel ignore os bits setuid e setgid emtodosexecutáveis dentro do sistema de arquivos. (A coisa não relacionada que acontece quando você faz umadiretóriosetgid não é afetado.)